web-dev-qa-db-ja.com

/ devディレクトリ以外のデバイスファイルからハードリンクを作成できないのはなぜですか?

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など)からハードリンクを作成する方法を知りたいですか?

11
Reza Harasani

しかし、私は/ 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内のファイルへのハードリンクのみを作成できます。

21
dr_

ファイルシステム間ではハードリンクが機能しないため、ハードリンクを使用して目的を達成することはできません。

ただし、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を実行します(必要な値に置き換えます)。

なぜこれが機能するのですか?

デバイスファイルは、カーネルまたはカーネルドライバーによって実装される抽象ファイルへの効果的なハードリンクです。別のファイルシステムからファイルシステムオブジェクトへのハードリンクを作成することはできませんが、これらはファイルシステムオブジェクトではないため、それらのメジャーおよびマイナー参照番号を知ることにより、任意のファイルシステムからそれらへの参照を作成できます。

11
wizzwizz4

ハードリンクは、ファイルを指すディレクトリに別のエントリを作成するだけです(ファイルはディレクトリなどのファイルのようなファイルです)。したがって、ハードリンクは別のファイルシステムのファイルを参照できません。

この場合、ソフトリンクはあなたの友達です。使用する ln -s。ソフトリンクはファイルシステムを行き来することができ、そこにないものを指すことさえできます。

2
ctrl-alt-delor