Почему символические ссылки в / proc / $ PID / fd / действуют как жесткие ссылки?

712
user300811

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

Файлы в /proc/$PID/fd/отображаются в виде символических ссылок, но они позволяют вам получить доступ к содержимому удаленной цели, как описано здесь: Восстановление удаленных файлов Linux сlsof .

Как это работает? Почему он отображается как символическая ссылка, если он не действует как единое целое? Это реализация символической ссылки файловой системы proc, которая хранит ссылку на индекс файла?

3
You misunderstand: deletion will be complete only after all processes using the file at the time of deletion have reached completion: only then the deleted *inode* will be returned to the pool of available inodes, and the content of the file *may* begin to be corrupted by over-writing. Until then, the *inode* is alive and well, and is pointing to the area of the disk containing the file in question. As soon as *less* completes, the soft link will disappear, and so will the file *testing.txt*. MariusMatutiae 7 лет назад 1
Попробуйте повторить это в файловой системе ext4, ссылка smbolic становится недействительной, как только вы удаляете файл, даже если программа с открытым файлом все еще работает. Это совершенно другое поведение, чем для символической ссылки в / proc / $ PID / fd / user300811 7 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

Если его цель удалена, сущность в /proc/$PID/fd/появляется как разорванная символическая ссылка, когда вы используете ls(1)или file(1), но она действительно действует иначе, когда открывается с помощью open(2).

На моем Debian 9 я strace(1)видел, что происходит, когда я пытаюсь прочитать символическую ссылку. Команда есть sudo strace cat "$symlink". Соответствующая строка из stderr

  • либо ок

    open("$symlink", O_RDONLY) = 3 
  • или же ENOENT

    open("$symlink", O_RDONLY) = -1 ENOENT (No such file or directory) 

(примечание: я не говорю, что это все возможные результаты open(2)в целом).

Результаты, достижения:

 | regular symlink | /proc/$PID/fd/$N | ---------------+-----------------+------------------+ exists, valid | OK | OK | exists, broken | ENOENT | OK | <- the difference doesn't exist | ENOENT | ENOENT | ---------------+-----------------+------------------+ 

Я также узнал, что когда я бегу file "$symlink", он звонит lstat(2), readlink(2)и stat(2). Это системные вызовы, основанные на путях, а не файловые дескрипторы. Если символическая ссылка существует (действительная или разорванная), open(2)никогда не вызывается, чтобы открыть ее или ее цель. ENOENTОт stat(2)указывает, что ссылка не работает.

Мой вывод таков: «неработающая ссылка» - это свойство, полученное из результатов некоторых системных вызовов; но когда вы открываете ссылку /proc/$PID/fd/, open(2)просто знаете, что с ней делать, и не волнует, что даст другой инструмент (ы).

Обратите внимание, что вся /procфальшивая «нормальная» файловая система. Несколько причуд:

  • Файлы могут иметь динамическое содержимое, но они не изменяются с помощью системных вызовов (попробуйте inotifywait).
  • Объекты могут (не) появляться, но они не создаются и не удаляются с помощью системных вызовов (снова inotifywait).
  • В некотором смысле объекты могут не существовать, пока вы не будете взаимодействовать с ними. Беги bashи жди несколько минут. Вызвать, ls -l /proc/$$/fdчтобы увидеть его файловые дескрипторы. Вероятно, ctimes покажет "этот самый момент". Тем не менее, если вы будете повторять команду каждые несколько секунд, вы заметите, что время никогда не изменится. (Общая информация: сначала я подумал, что смогу ответить на этот вопрос. Определить, как долго был открыт файл с statсимволическими ссылками, /proc/$PID/fd/но я ошибся; теперь вы знаете, почему).

Неудивительно, что эти символические ссылки, о которых вы спрашиваете, в некоторых обстоятельствах не ведут себя как обычные символические ссылки. Весь /procбыл разработан, чтобы вести себя несколько иначе. Я полагаю, что open(2)ему сознательно дали возможность воспользоваться этим.

Похожие вопросы