web-dev-qa-db-ja.com

/etc/init.dはCentOSにハードリンクされていますか?

ディレクトリ上のハードリンクが危険である理由(ループ、親ディレクトリリンクによるrmdirの問題)を理解し、そのトピックに関する他の質問を読みました。そのため、...以外のディレクトリのハードリンクは使用されていないと仮定しました。それでも、CentOS 5&6では次のことがわかります。

# ls -id /etc/init.d/
459259 /etc/init.d/
# ls -id /etc/rc.d/init.d/
459259 /etc/rc.d/init.d/
# ls -id /etc/init.d/../
458798 /etc/init.d/../
# ls -id /etc/rc.d/
458798 /etc/rc.d/
# ls -id /etc/
425985 /etc/

言い換えると、同じiノードを指すディレクトリへの2つの異なるパスと、/etc/init.d/ではなく/etc/rc.d/を指す/etc/の親です。これは本当にハードリンクされたディレクトリの場合ですか?そうでない場合、それは何ですか?はいの場合、なぜRed Hatはそれを行うのですか?

編集:愚かな質問をしてすみません、それがシンボリックリンクであることがわかるはずでした。今日はコーヒーが足りないようです。

2
user2845840

これはソフトリンクであり、ハードリンクではありません。シンボリックリンクは他のファイルを指します。シンボリックリンクを開くと、リンクが指すファイルが開きます。 rmを使用してシンボリックリンクを削除すると、シンボリックリンク自体は削除されますが、実際のファイルは削除されません。

これは、権限の先頭にある文字lで示されます

lrwxrwxrwx. 1 root root 11 Aug 10 2016 init.d -> rc.d/init.d

また、すべてのrc0.dからrc6.dは、rc.d /rc0.dへのシンボリックリンクです。

2
Chen A.

RHEL、Fedora、CentOSでは、/etc/init.dシンボリックリンクから/etc/rc.d/init.d。関係するハードリンクはありません。

Red Hatが望んでいたとしても、使用されているファイルシステムではそれは不可能です。

2
Stephen Kitt

この投稿は少し古いですが、OPが見ている動作はまだ説明されていないようです。他の人が述べているように、/etc/init.d/etc/rc.d/init.dへのシンボリックリンクです。欠落している部分は、上記で使用されている両方のパスが同じiノードを返す理由です。これは、末尾のスラッシュを使用しているためです。パスがスラッシュで終わる場合、ディレクトリが意図されていることをカーネルや他のツールに通知します。目的の宛先が実際には存在しないディレクトリであると想定されていた場合に、mv/cpコマンドがファイルの名前を変更しないように保護できます。また、lsが使用するlstat(2)システムコールがシンボリックリンクを逆参照し、代わりにそれが指すディレクトリを返します(または、既存のディレクトリを指していない場合はエラーをスローします)。この例を試して、違いを確認してください。

$ ls -id .
927578 .
$ ls -id ./parent
927641 ./parent
$ ls -id ./parent/
927641 ./parent/
$ ls -id ./parent/child
927643 ./parent/child
$ ls -id ./parent/child/
927643 ./parent/child/
$ ls -id ./child
927645 ./child
$ ls -id ./child/
927643 ./child/
$ ls -idL ./child
927643 ./child
$ ls -id ./child/..
927641 ./child/..
$ ls -id ./child/../..
927578 ./child/../..

末尾のスラッシュの存在は、シンボリックリンクの場合にのみ重要ですが、リンクのiノードは非表示になっていることがわかります。また、lsの-Lオプションは、どのファイルタイプでも、同様のことを行います。

0
penguin359