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

Sam*_*yat 13 linux hard-link ln

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

ln: failed to create hard link ‘my_sdb’ => ‘/dev/sda1’: Invalid cross-device link
Run Code Online (Sandbox Code Playgroud)

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

# cd /home/user/
# ln /dev/sda1 my_sdb
Run Code Online (Sandbox Code Playgroud)

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

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

dr_*_*dr_ 22

但是我只能在 /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
Run Code Online (Sandbox Code Playgroud)

因此,您只能/dev/dev.

  • 分区不是问题。正如您所说的跨文件系统限制。`/dev` 通常被挂载为一个 `devtmpfs` 文件系统。因此,您只能在`/dev` 中的`/dev` 中创建文件的硬链接。例如,你甚至不能在`/dev/pts` 中创建到`/dev/null` 的硬链接,因为它是用`devpts` 作为不同的文件系统挂载的。 (3认同)

wiz*_*zz4 11

硬链接不能用于实现您想要的目的,因为硬链接在文件系统之间不起作用。

但是,您可以使用该mknod命令实现您想要的。

  1. 运行ls -l /dev/devicefile。你应该看到这样的输出:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
    Run Code Online (Sandbox Code Playgroud)
  2. 记下尺寸列 ( 1, 9) 中的数字。
  3. 运行命令mknod /path/to/destination c 1 9(替换您想要的值)。

为什么这样做?

设备文件实际上是指向由内核或内核驱动程序实现的抽象文件的硬链接。虽然您不能从另一个文件系统创建到文件系统对象的硬链接,但这些不是文件系统对象,因此,通过了解它们的主要和次要引用号,您可以从任何文件系统创建对它们的引用。