Cet article vous apporte des connaissances pertinentes sur les liens physiques et les liens logiciels dans Linux, ainsi que sur les problèmes liés aux inodes. J'espère qu'il sera utile à tout le monde.
Le gestionnaire de paquets front-end pnpm a été très populaire récemment, et un grand nombre d'articles ont analysé les principes de pnpm. Après l'avoir compris, j'ai découvert que toute l'architecture de pnpm est organisée en fonction de liens physiques et de liens logiciels, mais je suis vague sur ces deux concepts, je souhaite donc l'étudier.
Comme nous le savons tous, tout dans les systèmes Unix/Linux est un fichier. On voit que les fichiers sont très importants dans les systèmes Linux. Nos sentiments généralement plus intuitifs à propos des fichiers sont certainement le nom et le contenu du fichier. Mais dans le système de fichiers Linux, en plus des noms de fichiers et du contenu des fichiers, il existe également un concept très important, celui de l'inode.
Wikipedia décrit l'inode comme ceci :
L'inode (nœud d'index) est une structure de données dans un système de fichiers de style Unix qui décrit un objet du système de fichiers tel qu'un fichier ou un répertoire. L'inode stocke les attributs et les emplacements des blocs de disque des données de l'objet. Les attributs des objets du système de fichiers peuvent inclure des métadonnées (heures du dernier changement, accès, modification), ainsi que des données de propriétaire et d'autorisation.
Un répertoire est une liste d'inodes avec leurs noms attribués. La liste comprend une entrée pour lui-même, son parent et chacun de ses enfants.
signification : l'inode est un type d'objet de système de fichiers (tel qu'un fichier ou un dossier) utilisé dans les données des systèmes de fichiers de type Unix. structure. Il stocke divers attributs du fichier (méta-informations telles que l'heure du dernier changement d'inode, l'heure du dernier accès, l'heure de la dernière modification et les informations d'autorisation, etc.). Un dossier est un groupe d'inodes comprenant sa propre entrée, l'entrée de son nœud parent et tous les nœuds enfants.
En fait, inode contient plus que ce qui précède, spécifiquement :
Le nombre d'octets du fichier
ID utilisateur du fichier
ID de groupe du fichier
Lecture et écriture du fichier, autorisation d'exécution
Horodatage : ctime, l'heure à laquelle l'inode a été modifié pour la dernière fois ; mtime, l'heure à laquelle le contenu du fichier a été modifié pour la dernière fois atime, l'heure à laquelle le fichier a été ouvert pour la dernière fois
; Nombre de liens, c'est-à-dire combien de noms de fichiers y pointent L'emplacement de cet inode
bloc de données de fichier
Dans le système de fichiers ext2/ext3 utilisé par Linux, différents types de données sont stockés dans différentes zones . La table d'inodes composée d'inodes est stockée à un emplacement et les blocs de données de fichier sont stockés à un autre emplacement.
inode ne contient pas le nom du fichier, le nom du fichier est stocké dans la structure d'information du dossier. Le nom du fichier est équivalent à l'alias de l'inode, ce qui est pratique à gérer et à mémoriser. Le système Linux opère sur les fichiers via des inodes. Lorsque nous modifions un fichier, le système trouve l'inode correspondant au nom de fichier à partir de la structure d'information du dossier, puis trouve l'inode correspondant via l'adresse du bloc de données du fichier stockée dans l'inode. Les opérations de lecture et d'écriture sont effectuées sur l'emplacement du disque dur.
De manière générale, l'inode a une relation un-à-un avec le nom de fichier et les données du fichier, mais nous pouvons utiliser des commandes shell pour faire pointer plusieurs noms de fichiers vers le même inode. (lien physique).
Utilisez la commande ln
ln test.txt test_hard.txt
correspondant à la méthode fs.link de nodejs.
Avant de créer un lien physique, test.txt peut être représenté comme suit :
Après avoir créé un lien physique :
Vous pouvez voir que l'inode de test_hard.txt est le même que le fichier source test.txt Mais maintenant, le nombre de liens est passé à 2.
Nous pouvons exécuter ls -li pour le vérifier.
La première colonne est le numéro d'inode, vous pouvez voir que les deux sont 13029546, donc les deux fichiers utilisent le même inode. La deuxième colonne contient les informations d'autorisation, la quatrième colonne est le propriétaire et la sixième colonne est la taille du contenu du fichier. Comme vous pouvez le voir, à l'exception du nom de fichier différent, le fichier créé par le lien physique contient exactement les mêmes méta-informations que le fichier source. La troisième colonne indique le nombre de liens. Comme vous pouvez le constater, le nombre actuel de liens est de 2.
Étant donné que le fichier de lien physique et le fichier source utilisent le même inode et pointent vers le même bloc de données de fichier, toutes les informations, à l'exception du nom du fichier, sont les mêmes. Par conséquent, ces deux fichiers sont équivalents et peuvent être considérés comme des fichiers liés l'un à l'autre. Modifiez n'importe quel fichier et vous pouvez voir que le contenu de l'autre fichier changera également simultanément.
准确来说叫符号链接(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视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!