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
<オール>read_size == 4096
<オール> nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
、255行目4096
を読み取れません バイト。バッファをゼロにします。ENODATA
を設定 .このプロセス中に、実際にはファイル全体を読み取ります。しかし、サイズが利用できないため、結果を検証できません。したがって、失敗は唯一の選択肢です。
cp
<オール>ファイルがスパースである可能性があるかどうかを確認します。ファイルに穴などがあります。
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
として レポート ファイルはゼロ ブロックを持ち、スパースとして分類されます。
エクステント コピー (通常 をコピーするより効率的な方法) によってファイルを読み取ろうとします。 スパース ファイル)、失敗します。
通常
18446744073709551615
32 ビット システムではバイト。関連している可能性がありますが、拡張属性の呼び出しは sysfs で失敗します:
<ブロック引用>[[email protected] eth0]# lsattr アドレス
lsattr:デバイスの不適切な ioctl がアドレスのフラグを読み取り中
[[email protected] eth0]#
私の strace を見ると、rsync はデフォルトで拡張属性を取り込もうとしているようです:
<ブロック引用>22964 <... getxattr が再開されました> , 0x7fff42845110, 132) =-1 ENODATA (利用可能なデータがありません)
拡張属性をスキップすることで問題が解決するかどうかを確認するために、rsync に与えるフラグを見つけようとしましたが、何も見つかりませんでした (--xattrs
それらをオンにします 目的地で)