Может ли каждый файл действительно иметь по крайней мере 2 имени (и, следовательно, 2 жестких ссылки)?

Общий вопрос застрял у меня в голове, поэтому я решил добавить ответ о том, как мне найти произвольный идентификатор в ядре Linux.

Загрузите версию исходного кода ядра (или установите пакет исходного кода ядра Linux -вашего дистрибутива )и распакуйте его:

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.39.tar.xz
tar xf linux-4.9.39.tar.xz
cd linux-4.9.39

Создайте минимальный.config, чтобы сделать ядро ​​компилируемым:

make menuconfig # just exit and save

Ключевой шаг:компиляция ядра с флагом -save-tempsgcc, чтобы оно сохраняло промежуточные файлы до -процессора:

make KCFLAGS=-save-temps

В процессе компиляции будут удалены *.iфайлы в текущем каталоге. Найдите любой файл, в котором определен идентификатор; Я выбрал здесь тот же идентификатор для простоты сравнения, но этот процесс будет работать для любого другого идентификатора; Я выбрал zbud.i только потому, что мне понравилось имя файла:

grep PageWriteback *.i
...
zbud.i:static inline __attribute__((no_instrument_function)) __attribute__((always_inline)) int PageWriteback(struct page *page) { return (__builtin_constant_p((PG_writeback)) ? constant_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags)) : variable_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags))); }
...

Откройте файл для просмотра, прокрутите до нужного идентификатора, затем найдите в файле вверх/назад строку, начинающуюся с #, чтобы увидеть, откуда пришло определение:

# 255 "./include/linux/page-flags.h"

, который указывает нам на тот же исходный файл, который Ник нашел до .

В качестве альтернативы вы можете выполнить поиск включаемых строк и/или идентификатора, а затем удалить все завершающие строки; последней строкой вывода будет файл, в котором был определен идентификатор:

grep -E '^# |PageWriteback' zbud.i | sed '/PageWriteback/,$d' | tail -n 1
...
# 74 "./include/linux/page-flags.h"
# 108 "./include/linux/page-flags.h"
# 255 "./include/linux/page-flags.h"

0
24.09.2019, 01:16
1 ответ

Начальное количество жестких ссылок равно 1 для файла и 2 для каталога (первая ссылка — его имя в родительской папке, а вторая жесткая ссылка — .). Счетчик ссылок для каталога увеличивается на единицу каждый раз, когда в нем создается подкаталог (из-за ..в каждом подкаталоге ).

Этот счет можно легко просмотреть с помощью ls -l. Это второе значение. Смотри:

~/x$ ls -la
total 16
drwxr-xr-x  2 tomasz tomasz 4096 Sep 24 00:08.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 1
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 2
~/x$ mkdir d
~/x$ ls -la
total 20
drwxr-xr-x  3 tomasz tomasz 4096 Sep 24 00:11.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 1
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 2
drwxr-xr-x  2 tomasz tomasz 4096 Sep 24 00:11 d
~/x$ mkdir d/dd
~/x$ ls -la
total 20
drwxr-xr-x  3 tomasz tomasz 4096 Sep 24 00:11.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 1
-rw-r--r--  1 tomasz tomasz   19 Sep 23 18:45 2
drwxr-xr-x  3 tomasz tomasz 4096 Sep 24 00:11 d

Второе значение для dувеличилось с 2 до 3 после создания в нем d/dd.

См. комментарии mosvy ниже для более широкого обзора.

3
28.01.2020, 02:22

Теги

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