Linux Hard Links

Linux Hard Links

Tags
Linux
Published
Published September 3, 2023
Author
Aleksandr Lobanov
 
💡
Жесткие ссылки работают только в рамках одной файловой системы так как опираются на номера индексных дескрипторов (inode)
💡
Нельзя создавать для каталогов
💡
Редактируя любую жесткую ссылку, относящуюся к файлу вы меняете все файлы
 

Кейсы

  • Резервное копирование
  • Запуск программ с общих файлов без их копирования. (Экономия места)
  • A single program may change its behavior depending on what name it is launched
 

Тестовые данные

mkdir -p test_dir/{1..4}_nested_dir touch test_dir/{1..4}_nested_dir/{1..3}_file.txt sudo touch test_dir/root_file.txt # Чтобы потом проверить правильно ли скопировались права (umask, user, group) tree test_dir* # Посмотреть дерево каталогов ls -liR test_dir* # Посмотреть inodes
test_dir ├── 1_nested_dir │   ├── 1_file.txt │   ├── 2_file.txt │   └── 3_file.txt ├── 2_nested_dir │   ├── 1_file.txt │   ├── 2_file.txt │   └── 3_file.txt ├── 3_nested_dir │   ├── 1_file.txt │   ├── 2_file.txt │   └── 3_file.txt └── 4_nested_dir ├── 1_file.txt ├── 2_file.txt └── 3_file.txt

Упрощенный вариант создания жестких ссылок для всех файлов в директории

cp -vrl test_dir/ test_dir_hardcopy/

Продвинутый

# link-dest подразумевает каталог на который ориентироваться относительно директории в которую копируем # sudo на случай чтобы у rsync был везде доступ и umask на root пользователя тоже копировался правильно (unix bits, Posix ACL) # v - increace verbose level # --archive, -a archive mode is -rlptgoD (no -A,-X,-U,-N,-H) # -H Сохранять жесткие ссылки # -A Копировать Posix ACL # -X Копировать контекст SELinux sudo rsync -vaXAH --exclude=1_nested_dir --link-dest=../test_dir/ test_dir/ test_dir_hard/

Результат

Видим число 2 в inode которое показывает что созданные нами файлы являются жесткими ссылками
sending incremental file list created directory test_dir_hard sent 410 bytes received 51 bytes 922,00 bytes/sec total size is 0 speedup is 0,00
test_dir: total 16 2264129 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 1_nested_dir 2264173 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 2_nested_dir 2264174 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 3_nested_dir 2264175 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 4_nested_dir test_dir/1_nested_dir: total 0 2264176 -rw-rw-r-- 1 squad squad 0 сен 3 16:26 1_file.txt 2264181 -rw-rw-r-- 1 squad squad 0 сен 3 16:26 2_file.txt 2264182 -rw-rw-r-- 1 squad squad 0 сен 3 16:26 3_file.txt test_dir/2_nested_dir: total 0 2264185 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264186 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264187 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt test_dir/3_nested_dir: total 0 2264188 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264191 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264192 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt test_dir/4_nested_dir: total 0 2264193 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264194 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264195 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt test_dir_hard: total 12 2264198 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 2_nested_dir 2264199 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 3_nested_dir 2264200 drwxrwxr-x 2 squad squad 4096 сен 3 16:26 4_nested_dir test_dir_hard/2_nested_dir: total 0 2264185 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264186 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264187 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt test_dir_hard/3_nested_dir: total 0 2264188 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264191 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264192 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt test_dir_hard/4_nested_dir: total 0 2264193 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 1_file.txt 2264194 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 2_file.txt 2264195 -rw-rw-r-- 2 squad squad 0 сен 3 16:26 3_file.txt