Когда я занимался сортировкой своей коллекции компакт-дисков, я обнаружил, что обработка вывода find
с помощью sort -u
давала мне меньший список, чем обычный sort
, поэтому я исследовал. Используя diff
на выходных данных, я узнал имя повторяющегося файла, и я решил проверить, как один и тот же файл может существовать дважды. Действительно, файл, который повторялся, 32
, существует дважды в fonts/basic
. Файловая система ISO9660 :
root@user-desktop:/mnt/loop/fonts/basic# ls -al
total 22
dr-xr-xr-x 1 root root 2048 1978-07-01 00:47 .
dr-xr-xr-x 1 root root 12288 1978-07-01 00:48 ..
-r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
-r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
root@user-desktop:/mnt/loop/fonts/basic# ls -l -i
total 8
203394 -r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
203394 -r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
OK, поэтому они жестко связаны, потому что у них одинаковый индекс, но как они могут иметь одинаковое имя? И почему они сообщают только об одной жесткой ссылке?
root@user-desktop:/mnt/loop/fonts/basic# mount|grep mnt/loop
/dev/loop0 on /mnt/loop type iso9660 (ro)
Кто-нибудь может придумать объяснение? Это что-то о файловой системе ISO9660 ?
Давайте создадим простую файловую систему ISO9660 :
mkdir cd
echo 'hello world' > cd/foo
echo '42' > cd/bar
genisoimage -o cd.iso cd
Смонтируйте, изучите и размонтируйте ее:
gnome-disk-image-mounter cd.iso
ls -li /media/user/CDROM
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
1475 -r-------- 1 user user 12 Jul 18 19:38 foo
umount cd.iso
Теперь откройте изображение в шестнадцатеричном редакторе и заменить FOO.;1
на BAR.;1
. Если это полезно, номера инодов в моей системе действительно являются смещением записи каталога в ISO-образе / 32, то есть посмотрите на python -c 'print hex(inode*32)'
.
ISO9660 , как и FAT , не имеет inode, но Linux притворяется, что это так. Вся информация хранится непосредственно в каталоге, и, поскольку каждая запись переменной длины имеет длину не менее 32 байт, это гарантирует, что все «inode» являются уникальными.
Теперь перемонтируйте его и посмотрите снова:
gnome-disk-image-mounter cd.iso
ls -li /media/user/CDROM
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
umount cd.iso
Обратите внимание на номера «inode» и размеры файлов. Оба файла все еще присутствуют в образе, но повторяющееся имя файла вводит Linux в заблуждение, заставляя его дважды перечислять первый файл. Второй файл сейчас полностью недоступен.