为什么我不能从/ dev目录以外的设备文件创建硬链接?


11

当我想以root模式在/home目录中创建硬链接时,Linux显示以下错误消息:

ln: failed to create hard link ‘my_sdb’ => ‘/dev/sda1’: Invalid cross-device link

上面的错误信息如下所示:

# cd /home/user/
# ln /dev/sda1 my_sdb

但是我只能在/dev目录中创建一个硬链接,而在其他目录中则不可能。

现在,我想知道如何从目录(或其他目录)中的现有设备文件(如sdb1)创建硬链接/home

Answers:


21

但是我只能在/ dev目录中创建一个硬链接,而在其他目录中则不可能。

如错误消息所示,不可能在不同文件系统之间创建硬链接。您只能创建软(符号)链接。

例如,如果您/home所在的分区与根分区不在同一个分区中,则您将无法硬链接/tmp/foo/home/user/

现在,正如@RichardNeumann指出的那样,/dev通常将其安装为devtmpfs文件系统。请参阅以下示例:

[dr01@centos7 ~]$ df
Filesystem                      1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos_centos7-root  46110724 3792836  42317888   9% /
devtmpfs                          4063180       0   4063180   0% /dev
tmpfs                             4078924       0   4078924   0% /dev/shm
tmpfs                             4078924    9148   4069776   1% /run
tmpfs                             4078924       0   4078924   0% /sys/fs/cgroup
/dev/sda1                         1038336  202684    835652  20% /boot
tmpfs                              815788      28    815760   1% /run/user/1000

因此,你只能创建硬链接的文件/dev/dev


3
分区不是问题。正如您所说的,它是跨文件系统的限制。/dev通常作为devtmpfs文件系统挂载。因此,你只能在创建硬链接到文件/dev/dev。例如,您甚至无法创建指向/dev/null内部的硬链接/dev/pts,因为它是devpts作为另一个文件系统安装的。
理查德·诺伊曼

1
@RichardNeumann好点。我更正了部分答案。
dr_18年

11

硬链接无法用于实现所需的功能,因为硬链接在文件系统之间不起作用。

但是,您可以使用该mknod命令实现所需的功能。

  1. 运行ls -l /dev/devicefile。您应该看到如下输出:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. 在大小列(1, 9)中记下数字。
  3. 运行命令mknod /path/to/destination c 1 9(替换所需的值)。

为什么这样做?

设备文件实际上是与由内核或内核驱动程序实现的抽象文件的硬链接。尽管您无法从另一个文件系统创建到文件系统对象的硬链接,但它们不是文件系统对象,因此,通过了解它们的主要和次要参考编号,您可以从任何文件系统创建对它们的引用。



2

硬链接只是在目录中创建另一个条目,指向文件(其中文件是诸如事物之类的文件,例如目录)。因此,硬链接无法引用另一个文件系统中的文件。

在这种情况下,软链接是您的朋友。使用ln -s。软链接可以跨越文件系统,甚至可以指向不存在的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.