異なるinumを持つファイルをハードリンクできますか?

異なるinumを持つファイルをハードリンクできますか?

私は新しいLinuxユーザーで、Arch Linuxと最近はLinux From Scratch(7.7)を学んでいます。新しくインストールされたALを手動でLFSホストとして設定しました(提供されたホストも使用)。バッシュスクリプト)私のホストの前提条件パッケージを確認しました。私の場合は、/usr/bin/yaccを/usr/bin/bisonに接続することを除いて、すべての違いを解決したと確信しています。

提供されたスクリプトの結果yacc is bison (GNU Bison) 3.0.4ではありません/usr/bin/yacc -> /usr/bin/bison。後者がシンボリックリンクの出力形式をチェックしているので、スクリプトは yacc が準備されているが、他のタイプのリンクを使用していることを知らせていると仮定します。私はLinuxファイルシステムについてさらに調査した結果、実際のデータはinode(メタデータ)として説明され、これは私たちがやり取りする(抽象)ファイルが指すものであるというおおよそのアイデアを得ました。単に同じinodeを指すファイルはハードリンクと見なされます(ただし、ファイルは互いに独立していると思います)。私は実行して、sudo ls -il /usr/bin | lessyaccとbisonのinode番号がわずかに異なることを発見しました(それぞれ152077と152078)。これはハードリンクされていないことを意味しますか、またはスクリプト出力を誤って解釈して修正する必要がありますか?

編集:bashスクリプトの関連コマンド:

bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

ベストアンサー1

これにより、ls -il /usr/binファイル名と一致するinode番号が一覧表示されます。この場合、「inode」から「filename」を分離し、inodeをファイルとして扱うことをお勧めします。

「inode」は通常、メタデータ(権限、所有権、作成時間、アクセス時間など)とファイルデータを含むディスクブロックを含むディスクデータ構造です。ファイルシステムに応じて、inodeは戦略的にディスクの周りに配置することも、ある種のデータベースに存在することもあります。ほとんどの場合、inode番号からinodeを含むディスクブロックに移動する高速アルゴリズムがあるため、検索は非常に高速です。

この観点から見ると、各ファイル名は「ハードリンク」に過ぎません。ディレクトリは単にファイル名とinode番号と一致します。 「実際のファイル名」と「ハードリンク」の間に違いはありません。したがって、ファイル名/usr/bin/yacc/usr/bin/bison他のinode番号との一致は、2つの名前が異なるメタデータと異なるファイルデータを参照することを意味します。軽く言うと、両方のinodeに一致するファイル名が1つしかないため、これらのファイルはハードリンクではありませんが、技術的には両方のファイル名はハードリンクであり、それぞれはinode用です。単一のハードリンクです。

スクリプトと「ほぼ同じ inode 番号」に関する限りyaccおよびはbison関連があります。私のArchノートブックから:

1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23  2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root     41 Jan 23  2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"

ファイル名yaccbison識別iノード番号の間には1つの区切りしかありません。それはおそらく順番に生成されるからです。ファイル名はyaccシンボリックリンクやハードリンクを表しません。シンボリックリンクは出力で異なるように見えますls -li。両方のハードリンクはそれぞれ同じ inode 番号を表します。

しかし、yacc関連はbison呼び出しですbison。これがスクリプトが次の出力を提供する理由です。

bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4

あなたのスクリプト呼び出しは/usr/bin/yacc実際に実行されます/usr/bin/bison

おすすめ記事