Удаление жестких ссылок в GNU/Linux и история inode

7 min

language: ja bn en es hi pt ru zh-cn zh-tw

Привет, я некомпетентен.
Когда я пытался создать ссылку с помощью команды ln после долгого перерыва, я случайно забыл удалить опцию -s, и была создана жесткая ссылка, поэтому я удалю ненужную жесткую ссылку.

Создание жесткой ссылки

Выполнение команды ln без опций создает жесткую ссылку.

alleycat:[haturatu]:~/git/hardlink$ ls
alleycat:[haturatu]:~/git/hardlink$ touch hardlink1
alleycat:[haturatu]:~/git/hardlink$ echo "You are an idiot" >> hardlink1 
alleycat:[haturatu]:~/git/hardlink$ cat hardlink1 
You are an idiot
alleycat:[haturatu]:~/git/hardlink$ ls -la
итого 12
drwxr-xr-x   2 haturatu haturatu 4096  янв 12 15:00 .
drwxr-xr-x 114 haturatu haturatu 4096  янв 12 15:00 ..
-rw-r--r--   1 haturatu haturatu   17  янв 12 15:01 hardlink1

Я создал файл, как показано выше.

alleycat:[haturatu]:~/git/hardlink$ ln hardlink1 hardlink2
alleycat:[haturatu]:~/git/hardlink$ ls -la
итого 16
drwxr-xr-x   2 haturatu haturatu 4096  янв 12 15:02 .
drwxr-xr-x 114 haturatu haturatu 4096  янв 12 15:00 ..
-rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink1
-rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink2

Это создало жесткую ссылку.
Теперь давайте посмотрим на следующий стандартный вывод.

-rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink1
-rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink2

2 в -rw-r--r-- 2 — это количество жестких ссылок. Вы можете видеть, что значение увеличилось по сравнению с тем, что было до создания жесткой ссылки.
И поскольку это всего лишь ссылка, она не занимает дисковое пространство. Она хранит одни и те же данные, и номер inode остается тем же, указывая на один и тот же файл.
Давайте проверим номер inode с помощью опции -i.

alleycat:[haturatu]:~/git/hardlink$ ls -lia
итого 16
13238408 drwxr-xr-x   2 haturatu haturatu 4096  янв 12 15:02 .
11406555 drwxr-xr-x 114 haturatu haturatu 4096  янв 12 15:00 ..
13265123 -rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink1
13265123 -rw-r--r--   2 haturatu haturatu   17  янв 12 15:01 hardlink2

Что такое inode?

Это зависит от файловой системы, поэтому вышеупомянутое относится к среде GNU/Linux. Для файловых систем на основе BSD это может быть vnode, а для ZFS — znode и т. д., что немного отличается, но исторически, я думаю, можно считать это расширением оригинальной файловой системы UNIX.

И в отличие от символических ссылок, если вы удалите hardlink1, hardlink2 останется, и если вы удалите hardlink2, hardlink1 останется. В этом отношении объяснение, вероятно, заключается в том, что файловая система сама управляет файлом, но это все еще немного сложно, не так ли?
Однако, если посмотреть на это так, жесткие ссылки удобны, но в то время как символические ссылки могут ссылаться на файлы на разных дисках, жесткие ссылки не могут быть созданы на разных дисках.
Проще говоря, основываясь на предыдущем объяснении, файловая система работает на основе inode одного диска, поэтому, если файл находится на другом диске, он находится вне юрисдикции этой файловой системы и не может быть связан из-за многоуровневой структуры.
Поэтому, если он существует на другом диске, возникает необходимость создать символическую ссылку.

И с точки зрения файловой системы, это широко используется при восстановлении диска, когда во время операций восстановления по информации inode определяется, какие файлы с какими номерами inode были созданы или удалены.
Здесь есть ловушка: если файл перезаписывается, его номер inode также обновляется. Это означает, что при создании скриптов для резервного копирования, возможно, потребуется быть внимательным к созданию скриптов, которые не включают процесс перезаписи. (Я однажды это испортил)

Определение файлов с одинаковым номером inode

Вы можете проверить это с помощью команды find.

alleycat:[haturatu]:~/git/hardlink$ find . -inum 13265123
./hardlink2
./hardlink1

Теперь давайте попробуем удалить hardlink1.

alleycat:[haturatu]:~/git/hardlink$ rm -i hardlink1
rm: удалить обычный файл 'hardlink1'? y
alleycat:[haturatu]:~/git/hardlink$ ls -lai
итого 12
13238408 drwxr-xr-x   2 haturatu haturatu 4096  янв 12 15:23 .
11406555 drwxr-xr-x 114 haturatu haturatu 4096  янв 12 15:00 ..
13265123 -rw-r--r--   1 haturatu haturatu   17  янв 12 15:01 hardlink2
alleycat:[haturatu]:~/git/hardlink$ cat hardlink2 
You are an idiot

Теперь значение жесткой ссылки стало 1, и было подтверждено, что hardlink2, который изначально был создан как ссылка на hardlink1 с помощью ln hardlink1 hardlink2 и содержит ту же информацию, что и hardlink1, существует и содержит те же данные.

Практическое применение

Я вернулся к этому спустя долгое время, но если вы хотите скопировать большие файлы на том же диске, но уменьшить износ диска, то, похоже, лучше использовать жесткие ссылки.
Ну, возможно, это не то, что вы будете часто сознательно использовать, но это интересно, потому что помогает немного понять структуру файловой системы.


До скорой встречи.
С наилучшими пожеланиями.

Related Posts