我正在尝试将整个/
目录复制到其他位置。当以递归方式执行 cp 时,它会在某些文件上失败,例如:-
/ # ls -lrt /sys/module/nf_conntrack_ipv4/uevent
--w------- 1 root root 4096 Mar 7 06:29 /sys/module/nf_conntrack_ipv4/uevent
/ #
/ # cat /sys/module/nf_conntrack_ipv4/uevent
cat: can't open '/sys/module/nf_conntrack_ipv4/uevent': Permission denied
/ # cp /sys/module/nf_conntrack_ipv4/uevent /tmp
cp: can't open '/sys/module/nf_conntrack_ipv4/uevent': Permission denied
如果我创建一些仅具有w
权限的文件并尝试复制/cat 它,我看不到任何问题。但是,对于上面提到的某些文件,即使我以 root 用户身份尝试,也无法复制或 cat 它。此外,奇怪的是,上面提到的文件的大小是 4096,与我们目录的大小相似。这是特殊的文件吗?
我想我在这里遗漏了一些东西,需要一些输入来了解有关此类文件或此类行为的更多信息。请帮助我理解为什么不允许我 cat 此类文件的内容。
答案1
例如,在常规文件系统中ext4
,如果您只w
对某个文件有权限,则无法读取 ( cat
) 它,您需要读取 ( r
) 位才能读取。请注意,root
无论权限位如何,都可以读取任何文件。
现在,/sys
是 Linux 内核提供的一个特殊的挂载点,sysfs
它实际上是一个虚拟文件系统,其工作方式与常规文件系统不同。/sys
包含系统的设备相关信息。
修改某些内容/sys
会直接改变内核的内部数据结构,因此允许或拒绝什么取决于内核。
对于/sys/module/nf_conntrack_ipv4/uevent
,您只w
为所有者设置了位(root
),即使您r
为root
(这是一个非常糟糕的主意),在读取文件时您会收到 I/O 错误,因为根据设计,内核不允许任何人读取模块的 uevent nf_conntrack_ipv4
。
答案2
为了避免使用像/sys
和这样的特殊文件系统/proc
,您应该为提供以下选项cp
:
-x, --one-file-system
stay on this file system
(引自手册页)
如果您有多个实际的文件系统,例如/
和/home
,那么您将需要给出多个cp
命令。
小心不要抄袭从和到同一个地方。这会导致无限循环,您会复制……