まずは/sys
、疑似ファイルシステムです。見て/proc/filesystems
みると、登録されているファイルシステムのリストがあり、その中にはかなりの数のものがnodev
あります。これは、それらが疑似ファイルシステムであることを示しています。これは、RAMベースのファイルシステムとして実行中のカーネルに存在することを意味します。さらに、ブロックデバイスは必要ありません。
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
ブート時にカーネルはこのシステムをマウントし、適切な場合にエントリを更新します。たとえば、起動中または起動中に新しいハードウェアが見つかった場合udev
。
では/etc/mtab
、あなたが一般的に見つけることでマウントします。
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
このテーマに関する素晴らしい論文については、Patric Mochel's – The sysfs Filesystemをお読みください
。
/ sysファイルの統計
以下のディレクトリに移動すると、すべてのファイルのサイズが1つで/sys
あるls -l
ことがわかります。通常、4096バイト。これはによって報告されていsysfs
ます。
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
さらにstat
、ファイルに対してを実行すると、別の明確な機能に気付くことができます。0ブロックを占有します。また、ルートのiノード(stat / sys)は1です。/stat/fs
通常、iノードは2です。など。
rsyncとcp
擬似ファイルの同期のrsync失敗の最も簡単な説明は、おそらく例です。
address
18バイトの名前のファイルがあるとします。ファイルの1 ls
つstat
は4096バイトを報告します。
rsync
- ファイル記述子fdを開きます。
- fstat(fd)を使用して、サイズなどの情報を取得します。
- サイズのバイト、つまり4096を読み込むように設定します。これは@mattdmによってリンクされたコードの253行目です。
read_size == 4096
- 尋ねる; 読み取り:4096バイト。
- 短い文字列、つまり18バイトが読み取られます。
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- 尋ねる; 読み取り:4078バイト
- 0バイトの読み取り(最初の読み取りではファイル内のすべてのバイトが消費されたため)。
nread == 0
、255行目
4096
バイトを読み取れません。ゼロアウトバッファ。
- エラーを設定します
ENODATA
。
- 戻ります。
- エラーを報告します。
- リトライ。(ループの上)。
- 不合格。
- エラーを報告します。
- ファイン。
このプロセス中に、実際にファイル全体を読み取ります。しかし、使用可能なサイズがないと、結果を検証できません。したがって、失敗は唯一の選択肢です。
cp
- ファイル記述子fdを開きます。
- fstat(fd)を使用して、st_sizeなどの情報を取得します(lstatおよびstatも使用します)。
ファイルがスパースである可能性が高いかどうかを確認してください。つまり、ファイルには穴などがあります。
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
stat
レポートファイルがゼロのブロックを持っていることは、スパースとして分類されます。
エクステントコピー(通常の
スパースファイルをコピーするより効率的な方法)でファイルを読み取ろうとして失敗します。
- スパースコピーでコピーします。
- MAXINTの最大読み取りサイズで開始します。
通常
18446744073709551615
、32ビットシステムのバイト。
- 尋ねる; 4096バイトを読み取ります。(統計情報からメモリに割り当てられたバッファサイズ。)
- 短い文字列、つまり18バイトが読み取られます。
- いいえ、穴が必要かどうかを確認してください。
- ターゲットにバッファを書き込みます。
- 最大読み取りサイズから18を引きます。
- 尋ねる; 4096バイトを読み取ります。
- 最初の読み取りですべてが消費されたため、0バイト。
- 成功を返します。
- 大丈夫。ファイルの更新フラグ。
- ファイン。
/sys/
ですか?