Ext4 এ জন্ম ফাঁকা


83

আমি কেবল Birthবিভাগে পড়ছিলাম statএবং এটি প্রদর্শিত হবে ext4 এর সমর্থন করা উচিত, তবে আমি সবে তৈরি করা একটি ফাইলও এটি খালি রেখে দেয়।

 ~  % touch test                                                       slave-iv
 ~  % stat test.pl                                                     slave-iv
  File: ‘test.pl’
  Size: 173             Blocks: 8          IO Block: 4096   regular file
Device: 903h/2307d      Inode: 41943086    Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/xenoterracide)   Gid: (  100/   users)
Access: 2012-09-22 18:22:16.924634497 -0500
Modify: 2012-09-22 18:22:16.924634497 -0500
Change: 2012-09-22 18:22:16.947967935 -0500
 Birth: -

 ~  % sudo tune2fs -l /dev/md3 | psp4                                  slave-iv
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   home
Last mounted on:          /home
Filesystem UUID:          ab2e39fb-acdd-416a-9e10-b501498056de
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    journal_data
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              59736064
Block count:              238920960
Reserved block count:     11946048
Free blocks:              34486248
Free inodes:              59610013
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      967
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stride:              128
RAID stripe width:        256
Flex block group size:    16
Filesystem created:       Mon May 31 20:36:30 2010
Last mount time:          Sat Oct  6 11:01:01 2012
Last write time:          Sat Oct  6 11:01:01 2012
Mount count:              14
Maximum mount count:      34
Last checked:             Tue Jul 10 08:26:37 2012
Check interval:           15552000 (6 months)
Next check after:         Sun Jan  6 07:26:37 2013
Lifetime writes:          7255 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       55313243
Default directory hash:   half_md4
Directory Hash Seed:      442c66e8-8b67-4a8c-92a6-2e2d0c220044
Journal backup:           inode blocks

আমার ext4পার্টিশন কেন এই ক্ষেত্রটি জনপ্রিয় করে না ?

উত্তর:


93

ক্ষেত্রটি জনবহুল হয় (নীচে দেখুন) কেবল coreutils statএটি প্রদর্শন করে না। স্পষ্টতই তারা ইন্টারফেসের জন্য অপেক্ষা করছে 1xstat()

কোর্টিলস প্যাচ - আগ। 2012 - TODO

স্টেট (1) এবং ls (1) জন্মের সময় সমর্থন করে। কার্নেল দ্বারা সরবরাহ করা xstat () এর উপর নির্ভরশীল

আপনি এর মাধ্যমে সৃষ্টির সময় পেতে পারেন debugfs:

debugfs -R 'stat <inode_number>' DEVICE

যেমন আমার /etc/profileযা চালু আছে তার জন্য /dev/sda2( ফাইলটি কোন ডিভাইসে রয়েছে তা কীভাবে সন্ধান করবেন ) দেখুন:

স্ট্যাটাস -c% i / ইত্যাদি / প্রোফাইল
398264
debugfs -R 'stat <398264>' /dev/sda2
debugfs 1.42.5 (29-Jul-2012)
Inode: 398264   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 2058737571    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 562
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x506b860b:19fa3c34 -- Wed Oct  3 02:25:47 2012
 atime: 0x50476677:dcd84978 -- Wed Sep  5 16:49:27 2012
 mtime: 0x506b860b:19fa3c34 -- Wed Oct  3 02:25:47 2012
crtime: 0x50476677:dcd84978 -- Wed Sep  5 16:49:27 2012
Size of extra inode fields: 28
EXTENTS:
(0):3308774

LKML থ্রেডে 1 লিনাসের উত্তর reply


7
@ স্পারহাক: একটি ফাইল নিয়েও আমার এই সমস্যা ছিল /home/user/path/to/fileকারণ /homeএকটি পৃথক বিভাজন ছিল। সেক্ষেত্রে, সরবরাহিত পথটি statঅবশ্যই আপেক্ষিক /home। উদাহরণ: sudo debugfs -R 'stat user/path/to/file' /dev/sda2। পাথ হ্যান্ডলিং থেকে মুক্তি পেতে, আমরা statপাথের পরিবর্তে sudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
ইনোড

3
কোনও নেটওয়ার্ক-মাউন্ট করা ফাইল সিস্টেম থেকে ফাইলগুলি তৈরির সময় পাওয়ার জন্য এটি ব্যবহার করা যেতে পারে?
তারানকি

1
সুতরাং এটি কোনও টাইম স্ট্যাম্প নয় যা ফাইল সিস্টেম তৈরির বাইরে। এর অর্থ হ'ল যদি 25 বছর আগে কোনও ফাইল তৈরি করা হয়েছিল এবং প্রচুর বিভিন্ন শারীরিক বা মাউন্টেড সিস্টেমের মাধ্যমে অনুলিপি করা হয়েছিল, তবে কোনও মেটাডেটা তৈরির তারিখের তথ্য খুঁজে পাওয়ার কোনও উপায় নেই? সুতরাং কোন ফাইল কখন তৈরি হয়েছিল তা জানার একমাত্র উপায় হ'ল ফাইলটির নাম টাইপ করা? বা কন্টেন্ট ভিতরে? এই আপাতদৃষ্টিতে বিজোড় প্রয়োগ না করার কোনও কারণ আছে কি?
সিনেকোনটা

2
@sinekonata ফাইলগুলির মেটাডেটা হয় খুব সিস্টেম নির্ভরশীল (যেমন এই উত্তর দেখায়, অপারেটিং সিস্টেম প্রতিটি স্তর এটি প্রক্রিয়া সক্ষম হতে হবে) আর মেশিনদের মধ্যে কপি জুড়ে এটি পালন উভয় সিস্টেম দ্বারা যে মেটাডেটা বিন্যাস জন্য সমর্থন উপর নির্ভর এবং অনুলিপি হাতিয়ার। এর অর্থ হ'ল: আপনি ভাগ্যবান যদি আপনি এমনকি ফাইলটির নাম অ-ম্যাংডড পান। অন্যথা, কিছু ফাইল ফরম্যাট আপনি মেটাডাটা সন্নিবেশ করার অনুমতি দেয় ভিতরে ফাইল (যেমন ID3 ), এবং থেকে পুরোপুরি অন্য ভাল বহন করে, কিন্তু অনেক ফরম্যাটের যেমন বৈশিষ্ট্য হবে না। অবশেষে, আপনি ফাইলটি আর্কাইভ ফাইলের মধ্যে রাখতে পারেন
এন্ড্রে প্যারামিস

1
নোট করুন <এবং >আশেপাশের ইনোড নম্বরটি প্রয়োজনীয়। এগুলি প্রায়শই উদাহরণগুলিতে ব্যবহার করা হয় একটি পরিবর্তনশীলকে ঘিরে যা সামঞ্জস্য করা উচিত, তবে এই ক্ষেত্রে সেগুলি অবশ্যই আক্ষরিকভাবে প্রবেশ করানো উচিত। সেগুলি ব্যতীত ইনোড নম্বরটিকে একটি পাথ হিসাবে বিবেচনা করা হবে এবং আপনি একটি File not found by ext2_lookupত্রুটি পান।
mivk

31

আমি এটিকে একটি সাধারণ শেল ফাংশনে একত্রিত করেছি:

get_crtime() {
  for target in "${@}"; do
    inode=$(stat -c %i "${target}")
    fs=$(df  --output=source "${target}"  | tail -1)
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*')
    printf "%s\t%s\n" "${target}" "${crtime}"
  done
    }

তারপরে আপনি এটি দিয়ে চালাতে পারেন

$ get_crtime foo foo/file /etc/
foo Wed May 21 17:11:08 2014
foo/file    Wed May 21 17:11:27 2014
/etc/   Wed Aug  1 20:42:03 2012

22

xstatফাংশন কখনো মেইনলাইন মধ্যে মিশে গিয়ে তৈরি করা হয়েছে। তবে statxপরে একটি নতুন কল প্রস্তাব করা হয়েছিল এবং এটি লিনাক্স ৪.১১ এ একীভূত হয়েছিল । নতুন statx(2)সিস্টেম কলটি তার রিটার্ন স্ট্রাক্টে একটি সৃষ্টির সময় অন্তর্ভুক্ত করে। এর জন্য একটি মোড়ক statx(2)কেবল ২.২৮ (গ্লোবাল আগস্ট 2018)গ্লিবিসিতে যুক্ত করা হয়েছিল । এবং এই মোড়ক ব্যবহারের জন্য সমর্থনটি জিএনইউ কোর্টিলস 8.31 (মার্চ 2019 এ প্রকাশিত) এ যুক্ত হয়েছিল:

স্টেট এখন ফাইল তৈরির সময় মুদ্রণ করে যখন ফাইল সিস্টেম দ্বারা সমর্থিত হয়, জিএনইউ লিনাক্স সিস্টেমে glibc> = 2.28 এবং কার্নেল> = 4.11 দ্বারা।

% stat --version
stat (GNU coreutils) 8.31
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
% stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: b302h/45826d    Inode: 2           Links: 17
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-06-06 20:03:12.898725626 +0900
Modify: 2019-05-28 05:15:44.452651395 +0900
Change: 2019-05-28 05:15:44.452651395 +0900
 Birth: 2018-06-07 20:35:54.000000000 +0900

statxএরপরে ইউজারল্যান্ড যেখানে এখনও পুরানো (পুরানো গ্লিবসি বা কোর্টিলস) ধরা পড়েছে তার একটি ডেমো রয়েছে । সরাসরি কোনও সি প্রোগ্রামে সিস্টেম কলগুলি কল করা সহজ নয়। সাধারণত গ্লিবিসি একটি মোড়ক সরবরাহ করে যা কাজটি সহজ করে তোলে, তবে ভাগ্যক্রমে, @ হোয়াটওয়াগনার একটি নমুনা সি প্রোগ্রাম লিখেছেন যাতে কীভাবে statx(2)x86 এবং x86-64 সিস্টেমে সিস্টেম কলটি ব্যবহার করতে হয় তা দেখায় । এর আউটপুটটি statকোনও বিন্যাসের বিকল্প ছাড়াই ডিফল্ট হিসাবে একই ফর্ম্যাট , তবে এটি কেবল জন্মের সময় মুদ্রণের জন্য এটি পরিবর্তন করা সহজ। (আপনার যদি নতুন পর্যাপ্ত গ্লিবিসি থাকে তবে আপনার এটির দরকার হবে না - আপনি statxবর্ণিত হিসাবে সরাসরি ব্যবহার করতে পারেন man 2 statx)।

প্রথমে এটি ক্লোন করুন:

git clone https://github.com/whotwagner/statx-fun

আপনি statx.cকোডটি সংকলন করতে পারেন , বা আপনি যদি জন্মের সময়টি চান birth.cতবে নীচের কোডটি দিয়ে ক্লোনযুক্ত ডিরেক্টরিতে একটি তৈরি করুন (যা statx.cন্যানোসেকেন্ড যথার্থতা সহ সৃজন টাইমস্ট্যাম্প মুদ্রণের নূন্যতম সংস্করণ ):

#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include "statx.h"
#include <time.h>
#include <getopt.h>
#include <string.h>

// does not (yet) provide a wrapper for the statx() system call
#include <sys/syscall.h>

/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif

#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))

int main(int argc, char *argv[])
{
    int dirfd = AT_FDCWD;
    int flags = AT_SYMLINK_NOFOLLOW;
    unsigned int mask = STATX_ALL;
    struct statx stxbuf;
    long ret = 0;

    int opt = 0;

    while(( opt = getopt(argc, argv, "alfd")) != -1)
    {
        switch(opt) {
            case 'a':
                flags |= AT_NO_AUTOMOUNT;
                break;
            case 'l':
                flags &= ~AT_SYMLINK_NOFOLLOW;
                break;
            case 'f':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_FORCE_SYNC;
                break;
            case 'd':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_DONT_SYNC;
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }

    if (optind >= argc) {
        exit(EXIT_FAILURE);
    }

    for (; optind < argc; optind++) {
        memset(&stxbuf, 0xbf, sizeof(stxbuf));
        ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
        if( ret < 0)
        {
            perror("statx");
            return EXIT_FAILURE;
        }
        printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
    }
    return EXIT_SUCCESS;
}

তারপর:

$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017

তাত্ত্বিকভাবে এটি কেবলমাত্র ext * টির চেয়ে বেশি ফাইল সিস্টেমে তৈরির সময়টিকে অ্যাক্সেসযোগ্য করে তুলতে পারে (এটি এক্সট 2/3/4 ফাইল সিস্টেমগুলির debugfsজন্য একটি সরঞ্জাম এবং অন্যের পক্ষে অপ্রয়োজনীয়)। এটি কোনও এক্সএফএস সিস্টেমের জন্য কাজ করেছে, তবে এনটিএফএস এবং এক্সফেটের জন্য নয়। আমি অনুমান করি যেগুলির জন্য ফুস ফাইল সিস্টেমগুলি তৈরির সময় অন্তর্ভুক্ত করে নি।


5

আর একটি ক্ষেত্রে রয়েছে যেখানে জন্মের সময়টি খালি / শূন্য / ড্যাশ হবে: এক্সটোর 4 এর ইনোডের আকারটি সঞ্চয় করতে কমপক্ষে 256 বাইট হতে হবে crtime। সমস্যাটি দেখা দেয় যদি আপনি প্রাথমিকভাবে 512MB এর চেয়ে ছোট ফাইল সিস্টেম তৈরি করেন (ডিফল্ট ইনোডের আকারটি 128 বাইট হবে, দেখুন /etc/mke2fs.confএবং mkfs.ext4ম্যানপেজ হবে)।

stat -c '%n: %w' testfile
testfile: -  

এবং / অথবা

stat -c '%n: %W' testfile
testfile: 0

এখন ফাইল সিস্টেমের ইনোডটি পরীক্ষা করুন (এটি সঞ্চয় করার পক্ষে যথেষ্ট বড় crtime?):

tune2fs -l $(df . --output=source | grep ^/) | grep "Inode size:"
Inode size:           128

প্রযুক্তিগত তথ্য: এক্সট 4 ডিস্ক লেআউট পৃষ্ঠায় নোট করুন যে ইনোড সারণীর কিছু বৈশিষ্ট্য 0x80 (128) এর বাইরে are


সংশোধন (আমি ভিজার এ সম্পর্কে পড়া মনে করি )। 512MB সীমাটি 1275mke2fs.c লাইনে সংজ্ঞায়িত করা হয়েছে
ডোন_ক্রিসটি

2

এটির জন্য আমি প্যাডেন্টিক অনুভব করছিলাম তাই স্ট্যাটের চারপাশে একটি ব্যাশ র‍্যাপার লিখেছিলাম যদি উপলব্ধ থাকে তবে কোনও অন্তর্নিহিত ext4 ফাইল সিস্টেম থেকে এটি আনার জন্য ডিবাগফগুলি ব্যবহার করে ক্রিমটাইমটি চুপচাপ সমর্থন করবে। আমি আশা করি এটি শক্তিশালী এটি এখানে সন্ধান করুন

নোট করুন যে কোনও লিপি লিনাক্সের জন্য টুডো তালিকায় script স্ক্রিপ্টটিতে নথিবদ্ধ হিসাবে রয়েছে। সুতরাং এই মোড়কটির কেবলমাত্র কাজ শেষ না হওয়া পর্যন্ত নামমাত্র জীবনকাল থাকে এবং যা করণীয় তা আরও অনুশীলন না করে।


3
নোট করুন যে xstat()অবশেষে লিনাক্সে যুক্ত করা হয়েছে, সুতরাং এটি GNU libc এর আগে সময়ের জন্য বিষয়টির জন্য findসমর্থন যোগ করুন।
স্টাফেন চেজেলাস

1
অসাধারণ! সত্যিই সুসংবাদ।
বার্ড উইনেকার

6
পেডেন্টিক হওয়ার জন্য ক্ষমা চেয়েও আপনি "পেডেন্টিক" এর অর্থ বোঝেন না the
নিক

"মিনিটের বিশদ বা আনুষ্ঠানিকতার সাথে অত্যধিক উদ্বিগ্ন" - হিসাবে হিসাবে গৃহীত উত্তরটি ঠিক আছে, তবে ... আসুন এটি আনুষ্ঠানিকভাবে প্রবর্তন করুন। ;-)
বার্ড ওয়েটেকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.