/sysファイル統計

/sysファイル統計

rsyncArchlinuxでファイルをバックアップするためのbashスクリプトがあります。rsyncファイルをからコピーできませんが、/sys正常に動作cpしていることがわかりました。

# rsync /sys/class/net/enp3s1/address /tmp    
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]

# cp  /sys/class/net/enp3s1/address /tmp   ## this works

rsyncなぜ失敗するのか、ファイルのコピーに使用できるのか知りたいのですが。

ベストアンサー1

最初/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 – sysfsファイルシステム


/sysファイル統計

以下のディレクトリに行って/sysaをすると、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さらに、ファイルを操作するとゼロブロックを占めるというもう1つの明確な機能が見つかります。また、ルートノード(stat / sys)のinodeは1です。/stat/fs通常、inode 2があります。など。

rsyncとcp

おそらく、rsyncの疑似ファイル同期失敗の最も簡単な説明は、例を通してです。

address18バイトというファイルがあるとしましょう。ファイルはls4096バイトを報告します。stat


同期

  1. ファイル記述子fdを開きます。
  2. サイズやその他の情報を取得するには、fstat(fd)を使用してください。
  3. 4096のsizeバイトの読み取りを開始します。そうだろう253号線リンクされたコード@mattdemread_size == 4096
    1. Q;読み取り: 4096 バイトです。
    2. 18バイトの短い文字列を読み込みます。nread == 18
    3. read_size = read_size - nread (4096 - 18 = 4078)
    4. Q;読み取り:4078バイト
    5. ゼロバイトを読み取ります(最初の読み取りでファイルのすべてのバイトを消費するため)。
    6. nread == 0255番国道
    7. バイトを読み取れません4096。バッファをゼロにします。
    8. 設定エラーですENODATA
    9. 返品。
  4. エラーを報告してください。
  5. やり直しより。 (上のループ).
  6. 失敗する。
  7. エラーを報告してください。
  8. 美しい。

このプロセスの間、実際にファイル全体を読み込みます。ただし、使用可能なディメンションがないため、結果を確認できないため、失敗は唯一のオプションです。

CP

  1. ファイル記述子fdを開きます。
  2. st_sizeなどの情報を取得するには、fstat(fd)を使用します(lstatとstatも使用します)。
  3. ファイルが希薄であることを確認してください。これは、ファイルなどに抜け穴があることを意味します。

    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希少ファイルに分類されます。

  4. 範囲コピーでファイルを読みます(より効率的なコピー方法)ノーマル スパースファイル)、失敗します。

  5. スパース複製を介して複製します。
    1. 最大読み取りサイズMAXINTから始まります。通常32ビットシステムの
      バイトです。18446744073709551615
    2. Q;4096バイトを読みました。 (統計に基づいてメモリに割り当てられたバッファサイズ。)
    3. 18バイトの短い文字列を読み込みます。
    4. 掘削が必要であることを確認してください。
    5. 宛先にバッファを書き込みます。
    6. 最大読み取りサイズから18を減算します。
    7. Q;4096バイトを読みました。
    8. 最初の読み取りですべて消費されるため、0バイトです。
    9. リターン成功。
  6. すべてがうまくいった。ファイルフラグを更新します。
  7. 美しい。

おすすめ記事