GNU/Linux >> Linux の 問題 >  >> Linux

rsync が Linux で /sys からファイルをコピーできないのはなぜですか?

Rsync には、読み取り中にファイルが切り捨てられたかどうかを明確にチェックするコードがあり、このエラーが発生します — ENODATA . なぜわからない /sys のファイル はこの動作をしますが、実際のファイルではないので、それほど驚くことではないと思います。この特定のチェックをスキップするよう rsync に指示する方法はないようです。

/sys を rsync しないほうがいいと思います 特定のスクリプトを使用して、必要な特定の情報 (ネットワーク カード アドレスなど) を選択します。


まずは/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 の – The sysfs Filesystem を読んでください。

/sys ファイルの統計

/sys の下のディレクトリに移動した場合 ls -l を実行します すべてのファイルのサイズは 1 つです。通常は 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 ブロックを占有します。また、ルート (stat /sys) の inode は 1 です。 /stat/fs 通常、inode 2 などがあります。

rsync と cp

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

address という名前のファイルがあるとします つまり 18 バイトです。 ls または stat のファイルが 4096 バイトを報告しています。

rsync

<オール>
  • ファイル記述子 fd を開きます。
  • fstat(fd) を使用してサイズなどの情報を取得します。
  • size バイト、つまり 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 バイト
  • 成功を返す。
  • 大丈夫です。ファイルのフラグを更新します。
  • 大丈夫です。

  • 関連している可能性がありますが、拡張属性の呼び出しは sysfs で失敗します:

    <ブロック引用>

    [[email protected] eth0]# lsattr アドレス

    lsattr:デバイスの不適切な ioctl がアドレスのフラグを読み取り中

    [[email protected] eth0]#

    私の strace を見ると、rsync はデフォルトで拡張属性を取り込もうとしているようです:

    <ブロック引用>

    22964 <... getxattr が再開されました> , 0x7fff42845110, 132) =-1 ENODATA (利用可能なデータがありません)

    拡張属性をスキップすることで問題が解決するかどうかを確認するために、rsync に与えるフラグを見つけようとしましたが、何も見つかりませんでした (--xattrs それらをオンにします 目的地で)


    Linux
    1. [解決済み]:rsyncが隠しファイル/ディレクトリをコピーしなかった理由とアスタリスクに隠し(ドット)ファイルが含まれていないのはなぜですか?

    2. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

    3. Linux –ブロックデバイスが/sysまたは/procから読み取り専用かどうかをテストする方法は?

    1. Linux の /dev/zero および /dev/null ファイルとは

    2. ターミナルウィンドウからLinuxでファイルを作成するには?

    3. Linux で select が使用される理由

    1. rsync がローカル ファイルにデルタ転送を使用しないのはなぜですか?

    2. /dev/random の dd でファイル サイズが異なるのはなぜですか?

    3. ある Linux サーバーから別の Linux サーバーに大きなファイルをコピーする