>  기사  >  시스템 튜토리얼  >  Linux 파일 링크 사용 요약

Linux 파일 링크 사용 요약

WBOY
WBOY앞으로
2024-02-25 09:34:38424검색

Linux 파일 시스템의 여러 위치에 있는 파일에 액세스하여 링크를 사용하여 일상 작업을 더 쉽게 만드는 방법을 알아보세요.

Linux 파일 시스템에는 하드 링크와 소프트 링크라는 두 가지 유형의 링크가 있습니다. 두 가지가 크게 다르지만 둘 다 유사한 문제를 해결하는 데 사용됩니다. 둘 다 단일 파일에 대한 여러 디렉터리 항목(참조)에 대한 액세스를 제공하지만 구현은 상당히 다릅니다. 링크의 힘은 모든 것이 파일이기 때문에 Linux 파일 시스템에 유연성을 제공합니다.

예를 들어, 일부 프로그램을 실행하려면 특정 저장소가 필요한 것을 발견했습니다. 업그레이드된 라이브러리를 사용하여 기존 라이브러리를 교체하면 프로그램이 중단되고 이전 버전 라이브러리가 없다는 메시지가 표시됩니다. 종종 라이브러리 이름의 유일한 변경 사항은 버전 번호입니다. 직감적으로 프로그램에 새 라이브러리 링크를 추가하고 이전 라이브러리 이름을 따서 이름을 지정했습니다. 프로그램을 다시 시작해 보았는데 잘 실행되었습니다. 프로그램은 게임이므로 모두가 이를 이해하며 모든 플레이어는 게임을 계속 진행하기 위해 최선을 다할 것입니다.

실제로 거의 모든 응용 프로그램 링크 라이브러리는 공통 명명 규칙을 사용합니다. 링크 이름에는 주요 버전 번호가 포함되고, 링크가 가리키는 파일 이름에도 부 버전 번호가 포함됩니다. 또 다른 예로, 프로그램의 일부 필수 파일은 Linux 파일 시스템 사양을 준수하기 위해 한 디렉터리에서 다른 디렉터리로 이동됩니다. 이러한 파일의 새 위치를 얻을 수 없는 프로그램과의 이전 버전 호환성을 위해 시스템은 이러한 파일에 대한 링크를 저장합니다. 이전 디렉토리에 . /lib64 디렉토리의 긴 목록을 작성하면 이에 대한 많은 예를 찾을 수 있습니다.

으아악

/lib64 디렉토리

의 일부 링크

위에 표시된 /lib64 디렉터리 목록에서 파일 모드의 첫 번째 문자 l(소문자 l)은 이것이 소프트 링크(심볼릭 링크라고도 함)임을 나타냅니다.

하드 링크

Linux EXT4 파일 시스템의 역사, 기능 및 모범 사례 기사에서 각 파일에는 파일의 위치 정보를 포함하여 파일에 대한 정보가 포함된 inode가 있다는 사실을 논의했습니다. 위 기사의 그림 2는 inode를 가리키는 단일 디렉토리 항목을 보여줍니다. 각 파일에는 파일 정보를 설명하는 inode를 가리키는 디렉토리 항목이 하나 이상 있습니다. 디렉토리 항목은 하드 링크이므로 각 파일에는 하드 링크가 하나 이상 있습니다.

아래 그림 1에 표시된 것처럼 여러 디렉터리 항목이 동일한 inode를 가리킵니다. 이러한 디렉토리 항목은 하드 링크입니다. 세 개의 디렉토리 항목에 물결표(~) 약어를 사용했는데 이는 사용자 디렉토리에 대한 규칙이므로 이 경우 물결표는 /home/user 와 동일합니다. 네 번째 디렉터리 항목은 완전히 다른 디렉터리인 /home/shared이며 이 컴퓨터에 있는 사용자의 공유 파일 디렉터리일 수 있다는 점은 주목할 가치가 있습니다.

Linux 파일 링크 사용 요약

하드 링크는 단일 파일 시스템으로 제한됩니다. 여기서 "파일 시스템"은 특정 마운트 지점(이 경우 /home)에 마운트된 파티션 또는 논리 볼륨을 의미합니다. 이는 inode 번호가 각 파일 시스템에서 고유하기 때문입니다. /var 또는 /opt와 같은 다른 파일 시스템에는 /home과 동일한 inode 번호가 있습니다.

모든 하드 링크는 파일 메타 정보가 포함된 단일 inode를 가리키므로 소유권, 권한, inode에 대한 하드 링크 수 등 이러한 속성은 파일의 일부입니다. 이러한 속성은 각 하드와 관련이 없습니다. 링크. 이는 파일이 갖는 속성 집합입니다. 이러한 파일을 구별하는 유일한 것은 inode 정보에 포함된 파일 이름입니다. 동일한 디렉토리에 있는 단일 파일/inode에 대한 하드 링크는 동일한 디렉토리에 중복된 파일 이름이 존재할 수 없다는 사실을 기반으로 서로 다른 파일 이름을 가져야 합니다.

파일 내 하드링크 개수는 ls -l을 통해 확인할 수 있습니다. 실제 노드 번호를 확인하려면 ls -li 명령을 사용하면 됩니다.

심볼(소프트) 링크

하드 링크와 소프트 링크(심볼릭 링크라고도 함)의 차이점은 하드 링크는 파일에 속한 inode를 직접 가리키는 반면, 소프트 링크는 디렉터리 항목, 즉 하드 링크를 직접 가리킨다는 것입니다. 소프트 링크는 파일의 inode가 아닌 파일에 대한 하드 링크를 가리키기 때문에 inode 번호에 의존하지 않으므로 서로 다른 파일 시스템, 파티션 및 논리 볼륨에서 작동할 수 있습니다.

소프트 링크의 단점은 해당 링크가 가리키는 하드 링크가 삭제되거나 이름이 바뀌면 소프트 링크가 유효하지 않게 된다는 것입니다. 소프트 링크는 여전히 존재하지만, 그것이 가리키는 하드 링크는 더 이상 존재하지 않습니다. 다행히 ls 명령은 목록에서 끊어진 소프트 링크를 빨간색 배경에 흰색 텍스트로 강조 표시할 수 있습니다.

실험 프로젝트: 링크 실험

我认为最容易理解链接用法及其差异的方法是动手搭建一个项目。这个项目应以非超级用户的身份在一个空目录下进行。我创建了 ~/temp 目录做这个实验,你也可以这么做。这么做可为项目创建一个安全的环境且提供一个新的空目录让程序运作,如此以来这儿仅存放和程序有关的文件。

初始工作

首先,在你要进行实验的目录下为该项目中的任务创建一个临时目录,确保当前工作目录(PWD)是你的主目录,然后键入下列命令。

mkdir temp

使用这个命令将当前工作目录切换到 ~/temp。

cd temp

实验开始,我们需要创建一个能够链接到的文件,下列命令可完成该工作并向其填充内容。

du -h > main.file.txt

使用 ls -l 长列表命名确认文件正确地创建了。运行结果应类似于我的。注意文件大小只有 7 字节,但你的可能会有 1~2 字节的变动。

[dboth@david temp]$ ls -l
total 4
-rw-rw-r-- 1 dboth dboth 7 Jun 13 07:34 main.file.txt

在列表中,文件模式串后的数字 1 代表存在于该文件上的硬链接数。现在应该是 1 ,因为我们还没有为这个测试文件建立任何硬链接。

对硬链接进行实验

硬链接创建一个指向同一 inode 的新目录项,当为文件添加一个硬链接时,你会看到链接数目的增加。确保当前工作目录仍为 ~/temp。创建一个指向 main.file.txt 的硬链接,然后查看该目录下文件列表。

[dboth@david temp]$ ln main.file.txt link1.file.txt
[dboth@david temp]$ ls -l
total 8
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 main.file.txt

目录中两个文件都有两个链接且大小相同,时间戳也一样。这就是有一个 inode 和两个硬链接(即该文件的目录项)的一个文件。再建立一个该文件的硬链接,并列出目录清单内容。你可以建立硬链接: link1.file.txt 或 main.file.txt。

[dboth@david temp]$ ln link1.file.txt link2.file.txt ; ls -l
total 16
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link2.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 main.file.txt

注意,该目录下的每个硬链接必须使用不同的名称,因为同一目录下的两个文件不能拥有相同的文件名。试着创建一个和现存链接名称相同的硬链接。

[dboth@david temp]$ ln main.file.txt link2.file.txt
ln: failed to create hard link 'link2.file.txt': File exists

显然不行,因为 link2.file.txt 已经存在。目前为止我们只在同一目录下创建硬链接,接着在临时目录的父目录(你的主目录)中创建一个链接。

[dboth@david temp]$ ln main.file.txt ../main.file.txt ; ls -l ../main*
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt

上面的 ls 命令显示 main.file.txt 文件确实存在于主目录中,且与该文件在 temp 目录中的名称一致。当然它们不是不同的文件,它们是同一文件的两个链接,指向了同一文件的目录项。为了帮助说明下一点,在 temp 目录中添加一个非链接文件。

[dboth@david temp]$ touch unlinked.file ; ls -l
total 12
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
-rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

使用 ls 命令的 i 选项查看 inode 的硬链接号和新创建文件的硬链接号。

[dboth@david temp]$ ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

注意上面文件模式左边的数字 657024 ,这是三个硬链接文件所指的同一文件的 inode 号,你也可以使用 i 选项查看主目录中所创建的链接的节点号,和该值相同。而那个只有一个链接的 inode 号和其他的不同,在你的系统上看到的 inode 号或许不同于本文中的。

接着改变其中一个硬链接文件的大小。

[dboth@david temp]$ df -h > link2.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

现在所有的硬链接文件大小都比原来大了,因为多个目录项都链接着同一文件。

下个实验在我的电脑上会出现这样的结果,是因为我的 /tmp 目录在一个独立的逻辑卷上。如果你有单独的逻辑卷或文件系统在不同的分区上(如果未使用逻辑卷),确定你是否能访问那个分区或逻辑卷,如果不能,你可以在电脑上挂载一个 U 盘,如果上述方式适合你,你可以进行这个实验。

试着在 /tmp 目录中建立一个 ~/temp 目录下文件的链接(或你的文件系统所在的位置)。

[dboth@david temp]$ ln link2.file.txt /tmp/link3.file.txt
ln: failed to create hard link '/tmp/link3.file.txt' => 'link2.file.txt':
Invalid cross-device link

为什么会出现这个错误呢? 原因是每一个单独的可挂载文件系统都有一套自己的 inode 号。简单的通过 inode 号来跨越整个 Linux 文件系统结构引用一个文件会使系统困惑,因为相同的节点号会存在于每个已挂载的文件系统中。

有时你可能会想找到一个 inode 的所有硬链接。你可以使用 ls -li 命令。然后使用 find 命令找到所有硬链接的节点号。

[dboth@david temp]$ find . -inum 657024
./main.file.txt
./link1.file.txt
./link2.file.txt

注意 find 命令不能找到所属该节点的四个硬链接,因为我们在 ~/temp 目录中查找。 find 命令仅在当前工作目录及其子目录中查找文件。要找到所有的硬链接,我们可以使用下列命令,指定你的主目录作为起始查找条件。

[dboth@david temp]$ find ~ -samefile main.file.txt
/home/dboth/temp/main.file.txt
/home/dboth/temp/link1.file.txt
/home/dboth/temp/link2.file.txt
/home/dboth/main.file.txt

如果你是非超级用户,没有权限,可能会看到错误信息。这个命令也使用了 -samefile 选项而不是指定文件的节点号。这个效果和使用 inode 号一样且更容易,如果你知道其中一个硬链接名称的话。

对软链接进行实验

如你刚才看到的,不能跨越文件系统边界创建硬链接,即在逻辑卷或文件系统中从一个文件系统到另一个文件系统。软链接给出了这个问题的解决方案。虽然它们可以达到相同的目的,但它们是非常不同的,知道这些差异是很重要的。

让我们在 ~/temp 目录中创建一个符号链接来开始我们的探索。

[dboth@david temp]$ ln -s link2.file.txt link3.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

拥有节点号 657024 的那些硬链接没有变化,且硬链接的数目也没有变化。新创建的符号链接有不同的 inode 号 658270。 名为 link3.file.txt 的软链接指向了 link2.file.txt 文件。使用 cat 命令查看 link3.file.txt 文件的内容。符号链接的 inode 信息以字母 l (小写字母 l)开头,意味着这个文件实际是个符号链接。

上例中软链接文件 link3.file.txt 的大小只有 14 字节。这是文本内容 link3.file.txt 的大小,即该目录项的实际内容。目录项 link3.file.txt 并不指向一个 inode ;它指向了另一个目录项,这在跨越文件系统建立链接时很有帮助。现在试着创建一个软链接,之前在 /tmp 目录中尝试过的。

[dboth@david temp]$ ln -s /home/dboth/temp/link2.file.txt
/tmp/link3.file.txt ; ls -l /tmp/link*
lrwxrwxrwx 1 dboth dboth 31 Jun 14 21:53 /tmp/link3.file.txt ->
/home/dboth/temp/link2.file.txt
删除链接

当你删除硬链接或硬链接所指的文件时,需要考虑一些问题。

首先,让我们删除硬链接文件 main.file.txt。注意指向 inode 的每个目录项就是一个硬链接。

[dboth@david temp]$ rm main.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

main.file.txt 是该文件被创建时所创建的第一个硬链接。现在删除它,仍然保留着原始文件和硬盘上的数据以及所有剩余的硬链接。要删除原始文件,你必须删除它的所有硬链接。

现在删除 link2.file.txt 硬链接文件。

[dboth@david temp]$ rm link2.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file

注意软链接的变化。删除软链接所指的硬链接会使该软链接失效。在我的系统中,断开的链接用颜色高亮显示,目标的硬链接会闪烁显示。如果需要修复这个损坏的软链接,你需要在同一目录下建立一个和旧链接相同名字的硬链接,只要不是所有硬链接都已删除就行。您还可以重新创建链接本身,链接保持相同的名称,但指向剩余的硬链接中的一个。当然如果软链接不再需要,可以使用 rm 命令删除它们。

unlink 命令在删除文件和链接时也有用。它非常简单且没有选项,就像 rm 命令一样。然而,它更准确地反映了删除的基本过程,因为它删除了目录项与被删除文件的链接。

写在最后

我用过这两种类型的链接很长一段时间后,我开始了解它们的能力和特质。我为我所教的 Linux 课程编写了一个实验室项目,以充分理解链接是如何工作的,并且我希望增进你的理解。

(题图: Paul Lewin,Opensource.com 修改。 CC BY-SA 2.0)

作者简介:

戴维.布斯 - 戴维.布斯是 Linux 和开源倡导者,居住在北卡罗莱纳的罗列 。他在 IT 行业工作了四十年,为 IBM 工作了 20 多年的 OS/2。在 IBM 时,他在 1981 年编写了最初的 IBM PC 的第一个培训课程。他为 RedHat 教授过 RHCE 班,并曾在 MCI Worldcom、思科和北卡罗莱纳州工作。他已经用 Linux 和开源软件工作将近 20 年了。

 

위 내용은 Linux 파일 링크 사용 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 linuxprobe.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제