Жесткая ссылка и символические ссылки в Unix - PullRequest
8 голосов
/ 11 мая 2010

Я просто хотел уточнить, действительно ли жесткая / символическая ссылка является файлом, который создается ??

Я выполнил команду:

ln source hardlink
ln -s source softlink

- Команда ls показывает эти 2 ссылки в виде файла.

Итак, мой запрос: ln / ln -s создает файл?

С уважением, darkie15

Ответы [ 2 ]

13 голосов
/ 11 мая 2010

Да, и нет: -)

В UNIX содержимое файла отличается от записей каталога для этого файла. У вас может быть несколько записей каталога, указывающих на одно и то же содержимое (посмотрите inode для описания того, как это работает), и вот хитрый бит:

Все эти записи каталога равны. Даже если одна из них была создана первой, в этом нет ничего особенного. Если вы удалите его, содержимое не исчезнет, ​​просто запись в каталоге. Содержимое исчезнет, ​​как только у inode будет нулевое количество записей в каталоге, указывающих на него (и все процессы закрывают файл - я был укушен прежде, пытаясь очистить место на диске, удаляя файлы журнала только для того, чтобы найти это, потому что процесс все еще имеет файл открыть, содержимое файла не восстанавливаются, даже если на них нет записей каталога).

Это для жестких ссылок.

Мягкие ссылки немного сложнее. Они создают своего рода «файл» (отдельный индекс), содержащий путь к целевому файлу. И эти ссылки не равны. Удаление оригинала оставит вам мягкую ссылку, указывающую в никуда.

Поскольку inode являются уникальными в данной файловой системе, жесткие ссылки не могут ссылаться на данные в другой файловой системе.

Мягкие ссылки не имеют этого ограничения, поскольку они хранят путь к целевому файлу, а не его индекс.

Может помочь следующая расшифровка:

$ echo hello >f1
$ ln f1 f2
$ ln -s f1 f3
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f1
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    hello
$ cat f2
    hello
$ cat f3
    hello
$ rm f1
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    cat: f1: No such file or directory
$ cat f2
    hello
$ cat f3
    cat: f3: No such file or directory

Я использовал только последние четыре цифры номера инода, чтобы сделать запись короткой (и не ударил вас номерами инода, такими как 43910096366994672), но вы можете видеть, что f1 и f2 имеют точно такие же inode, тогда как f3 отличается. Вы также можете видеть, что содержимое файла, созданного изначально как f1, сохраняется после его удаления, поскольку f2 все еще ссылается на него.

Однако, поскольку f3 ссылается на имя f1, а не на его inode, вы получаете сообщение об ошибке при попытке его использовать.


В сторону: Вам должно понравиться, когда UNIX играет с вами так:

$ ls f*
    f2  f3
$ cat f3 # What the ...?
    cat: f3: No such file or directory

Почти так же весело, как создать файл с именем space backspace x и затем наблюдать за тем, как кто-то пытается его удалить: -)

3 голосов
/ 11 мая 2010

Ни один из них не создает файл.

Файл на диске идентифицируется как «inode». Каталоги отображают имена файлов на inode. Жесткая ссылка означает «создать новое имя файла в этом каталоге, которое указывает на тот же индекс, что и файл, который я назову».

Символическая ссылка означает «создать новое имя файла в этом каталоге, которое указывает на любой индекс, на который указывают другие файлы».

Как указывает mangoman в комментарии, символическая ссылка создает файл с именем цели ссылки, но вы не должны обращать на это внимание. Это специальный файл, который не является вашим делом.

...