この記事では、Linux のハード リンクとソフト リンク、および i ノード関連の問題に関する関連知識を提供します。皆様のお役に立てれば幸いです。
フロントエンド パッケージ マネージャー pnpm は最近非常に人気があり、多数の記事で pnpm の原理が分析されています。理解したところ、pnpm のアーキテクチャ全体がハードリンクとソフトリンクに基づいて構成されていることがわかりましたが、この 2 つの概念について漠然としているので、勉強したいと思います。
ご存知のとおり、Unix/Linux システムではすべてがファイルです。 Linux システムではファイルが非常に重要であることがわかります。ファイルに関して私たちが通常より直観的に感じているのは、間違いなくファイル名とファイルの内容です。しかし、Linux ファイル システムには、ファイル名とファイルの内容に加えて、inode という非常に重要な概念もあります。
Wikipedia では、inode について次のように説明しています。
意味: inode は、Unix のようなファイル システムでファイル システム オブジェクト (ファイルやフォルダーなど) を記述するために使用されるデータ構造です。ファイルのさまざまな属性 (最後の i ノード変更時刻、最終アクセス時刻、最終変更時刻、許可情報などのメタ情報) が格納されます。フォルダーは、それ自体のエントリ、その親ノードのエントリ、およびすべての子ノードを含む i ノードのグループです。 実際には、inode には上記以外のものが含まれます。特に:inode (インデックス ノード) は、Unix のデータ構造です。ファイルやディレクトリなどのファイル システム オブジェクトを記述するスタイルのファイル システム。各 i ノードには、オブジェクトのデータの属性とディスク ブロックの場所が格納されます。ファイル システム オブジェクトの属性には、メタデータ (最終変更、アクセス、修正の時刻) が含まれる場合があります。
#ディレクトリは、割り当てられた名前を持つ i ノードのリストです。リストには、それ自体、その親、およびそのそれぞれの子のエントリが含まれます。
ln test.txt test_hard.txt
#ハード リンクを作成した後:
# test_hard.txt の i ノードはソース ファイル test.txt と同じですが、リンク数が 2 になっていることがわかります。
ls -li を実行して確認できます。最初の列は i ノード番号です。どちらも 13029546 であることがわかり、2 つのファイルは同じ i ノードを使用します。 2 列目は権限情報、4 列目は所有者、6 列目はファイルのコンテンツのサイズです。ご覧のとおり、ファイル名が異なることを除いて、ハード リンクによって作成されたファイルには、ソース ファイルとまったく同じメタ情報が含まれています。 3 列目はリンク数を示しており、現在のリンク数は 2 であることがわかります。
ハード リンク ファイルとソース ファイルは同じ i ノードを使用し、ファイル データの同じブロックを指すため、ファイル名を除くすべての情報は同じです。したがって、これら 2 つのファイルは同等であり、相互にハード リンク ファイルであると言えます。いずれかのファイルを変更すると、他のファイルの内容も同時に変更されることがわかります。准确来说叫符号链接(symbolic link),一般又叫软链接(soft link)。与硬链接共用一个inode不同,软链接会创建新的inode,并指向源文件。可以理解软链接就是windows系统中的桌面快捷方式。
创建软链接的命令和硬链接很像,多了-s参数:ln -s
ln -s test.txt test_symbolic.txt
对应的nodejs的fs.symlink方法。
创建软链接之后:
源文件inode的链接数还是1,创建了新的inode,软链接指向源文件。
执行ls -li看一下:
可以看到,软链接的inode number跟源文件的不一样,权限一列开头为小写L,表示软链,链接数为1,大小为8个字节。没错,软链文件也有大小,不过一般很小,毕竟只是一个快捷方式。
文件重命名和文件移动对于Linux系统来说都是文件绝对路径的更改。对硬链接来说,文件重命名或文件移动不会改变链接指向,而对软链接来说,文件重命名或文件移动则使链接断开,这时通过软链接修改文件内容时会重新创建一个新的inode,跟原文件名和文件数据块关联。
rm命令或者nodejs的unlink其实是将inode的链接数减1。对于前文的硬链接,删除test_hard.txt使得inode1的链接数变成1,当链接数变成0时,系统就会释放掉这个inode,之后再创建的新文件就可以使用该inode的inode number了。这时没有inode指向文件数据block,所以文件找不到了。但实际上文件数据还存在硬盘中,所以经常能看到网上有一些帮助恢复误删的文件的工具。软链接inode链接数为1,删除软链接则系统释放该inode。
软链接可以链接文件和文件夹,但硬链接只能链接文件。
软链接可以跨不同的文件系统创建,但是硬链接不行,因为硬链接是共用一个inode,而不同的文件系统有不同的inode table。
文件备份:为了防止重要的文件被误删,文件备份是一种好的办法,但拷贝文件会带来磁盘空间的消耗。硬链接能不占用磁盘空间实现文件备份。
文件共享:多人共同维护同一份文件时,可以通过硬链接的方式,在私人目录里创建硬链接,每个人的修改都能同步到源文件,但又避免某个人误删就丢掉了文件的问题。
文件分类:不同的文件资源需要分类,比如某个电影即是的分类是外国、悬疑,那我们可以在外国的文件夹和悬疑的文件夹里分别创建硬链接,这样可以避免重复拷贝电影浪费磁盘空间。有人可能说,使用软链接不也可以吗?是的,但不太好。因为一旦源文件移动位置或者重命名,软链接就失效了。
快捷方式:对于路径很深的文件,查找起来不太方便。利用软链接在桌面创建快捷方式,可以迅速打开并编辑文件。
灵活切换程序版本:对于机器上同时存在多个版本的程序,可以通过更改软链接的指向,从而迅速切换程序版本。这里提到了python版本的切换可以这么做。
动态库版本管理:不是很懂,具体可以看这里。
Linux系统通过inode管理文件,inode存储着文件字节数、文件权限、链接数、数据block位置等信息。
硬链接与源文件共用inode,除了文件名不同,其他与源文件一样。不能对文件夹创建硬链接,不能对不同的文件系统的文件创建硬链接。
软链接类似于windows的快捷方式,有独立的inode。可以对文件夹或不同文件系统的文件创建软链接。
硬链接和软链接修改文件内容都会同步到源文件,因为本质上它们都是指向源文件的数据block。
相关推荐:《Linux视频教程》
以上がLinuxのハードリンクとソフトリンクがわかる(画像と文章で詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。