Основы Linux от основателя Gentoo. Часть 1 (3/4): Ссылки, а также удаление файлов и директорий

Автор оригинала: Daniel Robbins, Chris Houser, Aron Griffis
  • Перевод
Третий отрывок из перевода первой части руководства. Предыдущие: первый, второй.

В этом отрывке рассмотрены жесткие и символические ссылки, а также разобрано удаление файлов и директорий с помощью команд rm и rmdir.

Создание ссылок и удаление файлов


Жесткие ссылки


Мы уже упоминали термин «ссылка», когда рассказывали о взаимоотношениях между директориями (их именами) и инодами (индексным номерами, лежащими в основе файловой системы, которых мы не замечаем). Вообще в Linux существует два типа ссылок. Тип, о котором мы уже говорили ранее, называется «жесткие ссылки». Каждый инод может иметь произвольное число жестких ссылок. Когда уничтожается последняя жесткая ссылка, и не одна программа не держит файл открытым, то Linux автоматически удаляет его. Новые жесткие ссылки можно создать воспользовавшись командой ln:



$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
15782 firstlink 15782 secondlink

Как видите, жесткие ссылки работают на уровне инодов, для указания конкретного файла. В Linux системах, для жестких ссылок есть несколько ограничений. В частности, можно создавать жесткие ссылки только на файлы, не на директории. Да-да, именно так; хотя "." и ".." являются созданными системой жесткими ссылками на директории, вам (даже от имени пользователя «root») не разрешается создавать любые свои собственные. Второе ограничение жестких ссылок состоит в том, что нельзя связать ими несколько файловых систем. Это значит, что у вас не получится создать жесткую ссылку с /usr/bin/bash на /bin/bash и если ваши директории / и /usr находятся в разных файловых системах (разделах — прим. пер.).



Символьные ссылки


В практике, символьные ссылки (или символические, иногда «симлинки» — от англ.) используются гораздо чаще, чем жесткие. Симлинки — это файлы особого типа, которые ссылаются на другие файлы по имени, а не прямо по номеру инода. Они не спасают файлы от удаления; если файл, на который указывает ссылка, исчезает, то симлинк перестает работать, ломается.



Символические ссылки можно создать передав для ln опцию -s.



$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink

В выводе ls -l символьные ссылки можно отличить тремя способами. Во-первых, обратите внимание на символ l в первой колонке. Во-вторых, размер символической ссылки равен количеству символов в ней (secondlink в нашем случае). В-третьих, последняя колонка в выводе показывает куда ведет ссылка с помощью интуитивного обозначения "->".



Симлинки детально


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



Предположим, что мы хотим создать ссылку в /tmp, которая указывает на /usr/local/bin. Нам следует набрать:



$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin

Либо, альтернативный вариант:



$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin

Как вы видите, обе символические ссылки указывают на одну директорию. Однако, если наша вторая символьная ссылка когда-нибудь будет перемещена в другую директорию, то она может «поломаться» из-за относительности пути:



$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin

$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory


Потому, что директории /tmp/usr/local/bin не существует, мы больше не можем переместиться в bin2; другими словами, bin2 сейчас сломана.



По этой причине, избегать создания ссылок с относительной информацией о пути, иногда будет хорошей идеей. Тем не менее, существует множество случаев, где относительные символические ссылки крайне удобны. Рассмотрим пример в котором мы хотим создать альтернативное имя для программы в /usr/bin:



# ls -l /usr/bin/keychain 
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

От имени суперпользователя мы хотим короткий синоним для keychain, такой, как kc. В этом примере у нас есть root-доступ, о чем свидетельствует измененное на "#" приветствие bash. Нам нужен root-доступ потому, что обычные пользователи не имеют прав создавать файлы в /usr/bin. От имени суперпользователя мы можем создать альтернативное имя для keychain следующим образом:



# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

# ls -l kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> /usr/bin/keychain

В этом примере мы создали символьную ссылку под названием kc, которая указывает на файл /usr/bin/keychain.



Пока это решение будет работать, но создаст проблему, если мы решим переместить оба файла, /usr/bin/keychain и /usr/bin/kc в /usr/local/bin:



# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain

# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> /usr/bin/keychain

Поскольку мы использовали абсолютный путь для символической ссылки kc, то она все еще ссылается на /usr/bin/keychain, которого не существует с тех пор как мы переместили /usr/bin/keychain в /usr/local/bin.



Это привело к тому, что симлинк kc сейчас не работает. Как относительные, так и абсолютные пути в символьных ссылках имеют свои достоинства, и, в зависимости от вашей задачи, нужно использовать соответствующий тип пути. Часто, и относительный, и абсолютный путь, будут работать одинаково хорошо. Пример ниже будет работать, даже после перемещения обоих файлов:



# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain

# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/local/bin/keychain

# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> keychain

Теперь, мы можем запустить программу keychain набрав /usr/local/bin/kc. /usr/local/bin/kc указывает на программу keychain в той же директории, где находится kc.



rm


Итак, мы знаем как использовать cp, mv и ln, настало время узнать о том, как можно удалять объекты из файловой системы. Обычно это делается с помощью команды rm. Чтобы удалить файлы, просто укажите их в командной строке:



$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2

$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory


Имейте ввиду, что под Linux, однажды удаленный файл, обычно исчезает на века. Поэтому многие начинающие системные администраторы используют опцию -i, когда удаляют файлы. Опция -i сообщает rm удалять файлы в интерактивном режиме — это значит спрашивать перед удалением любого файла. Например:



$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y


В примере выше команда rm запрашивает подтверждение на удаление каждого из указанных файлов. В случае согласия, я должен был вводить «y» и нажать enter, дважды. Если бы я ввел «n», то файл бы остался цел. Или, если я сделал что-нибудь не так, я мог бы нажать Control-C и сбросить выполнение команды rm -i целиком — всяко до того, как это могло нанести какой-нибудь ущерб моей системе.



Если вы все еще учитесь пользоваться командой rm, то может быть полезным добавить при помощи вашего любимого текстового редактора следующую строку в ваш файл ~/.bashrc, и затем выйти (logout) и войти (login) в систему вновь. После этого, всякий раз, когда вы наберете rm, оболочка bash преобразует ее автоматически в команду rm -i. Таким образом, rm будет всегда работать в интерактивном режиме:



alias rm="rm -i"

rmdir


Для удаления директорий у вас имеется два варианта. Вы можете удалить все объекты внутри директории и затем воспользоваться rmdir для удаления самой директории:



$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir


Этот метод широко известен под названием «способ удаления директорий для лохов». Все реальные пацаны и админы-гуру съевшие пользователя собаку на этом деле, используют гораздо более удобную команду rm -rf, описанную далее.



Самый лучший способ удалить директорию состоит в использовании опций «рекурсивного принуждения» (recursive force) команды rm, чтобы приказать ей удалять указанную директорию, также как и объекты содержащиеся внутри:



$ rm -rf mydir

Обычно, rm -rf является наиболее предпочтительным методом для удаления древа директорий. Будьте очень осторожны, когда пользуетесь rm -rf, так как ее мощь может быть использована по обе стороны: добра и зла. =)



Продолжение...



Об авторах


Daniel Robbins


Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.



Chris Houser


Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.



Aron Griffis


Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 29

    +1
    «многие начинающие системные администраторы используют опцию -i, когда удаляют файлы»
    Я наблюдал ситуацию как раз наоборот. И в своем случае, и в случае знакомых. Все хотят сделать быстрее.
    • НЛО прилетело и опубликовало эту надпись здесь
        0
        В случае, если файлов много, то начинаешь думать _перед_ тем как нажать педаль, а не включать интерактивный режим…
        А в скриптах интерактивный режим не нужен…
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            К счастью, постоянная работа в *nix возводит сознание на уровень рефлексов.
            Постоянно думать — не так сложно, на самом деле…
            ;)
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                Я говорил о рефлексе «постоянно думать»…
                Еще создатели WIMP-интерфейса писали о том, что интерфейс командной строки требует алгоритмического мышления и постоянного контроля над своими действиями.
                Это не мышкой елозить в полу-обморочном состоянии.

                Если у меня открыто 7-8 терминальных сессий, я просто вынужден думать, что, как и для чего.
                Потому как лохонуться в команде rm -rf на сервере, который за 1000 км находится, ой как больно бывает…
                ;)
                  +1
                  была старая шутка про то, что удаленно настраивать файерволл — это к поездке)) в ситуации с rm -rf можно перефразировать я думаю…
                    +2
                    ;)
                    Чтоб зазря не ездить, я режим теста дописал в /etc/init.d/iptables…
                    /etc/init.d/iptables test
                    И если в течение 60 секунд не нажму Ctrl+C,
                    то правила в ACCEPT сбрасываются…
                    Хоть как-то зайти можно и вернуть все в зад.
                    Пару раз выручало…

                    А бездумно вызывать rm -rf, скорее, к смене работы, а не к поездке…
                      +1
                      заманчиво коллега)) спасибо за такое простое решение… на всякий случай и себе допишу))
                        +4
                        Чтоб долго не мучаться…
                        case "$1" in
                        test)
                        echo «Stop»
                        stop
                        echo «Starting...»
                        echo «Iptables will be autostopped after 60 secs...»
                        start
                        echo «If you can see this string, press \»Ctrl+C\" for apply rules."
                        sleep 60 && stop
                        echo «Iptables stopped after timeout… Check rules...»
                        ;;
                        start)
                        start
                        ;;

                        После /etc/init.d/iptables test жмем рару раз Enter…
                        Если померло, то не увидим на экране движение…
                        Если не померло, то жмем Ctrl+C…

                        Удачи…
                    • НЛО прилетело и опубликовало эту надпись здесь
        0
        интересно а когда монтируется директория в директорию, что это, хардлинк или нет?
          0
          Это mount -o bind
            0
            это понятно. но что это с low level вида?
              0
              mount -o bind /dev /mnt/dev
              После этого, и /dev и /mnt/dev имеют один и тот же inode

              Либо это хардлинк, либо частный случай, и просто выглядит как хардлинк…
              ;)

              Смонтировать-то можно и другую FS…
              И сетевой ресурс (NFS, CIFS, etc)
            +2
            Насколько я вижу народ все же до конца не разобрался что такое инод и жесткие ссылки. Попробую более понятно объяснить:
            Инод (индексный узел) — есть нумерованный фрагмент дискового пространства. Названия файлов в файловой системе являются ни чем иным, как именами для этих фрагментов, это и есть жесткие ссылки. Важно понимать: жесткая ссылка создается для инода, а не для файла — в этом основная разница между жесткими ссылками и симлинками. Если у одного инода есть, к примеру, 2 жесткие ссылки, то при удалении одной — с инодом ничего не происходит, при удалении обеих счетчик ссылок становится равен нулю и этот номер инода далее свободен для размещения нового файла(т.е при создании нового файла может быть задействован этот номер инода).
            Про симлинки вроде как достаточно понятно написано, так что читайте и понимайте ;)
            0
            Порадовал перевод Red Socks :)
            болея за бостонскую профессиональную бейсбольную команду Красный Носок

            Спасибо за статью.
              +1
              Red Sox
                0
                Хм, только сейчас обратил внимание, почему-то в единственном числе написал, хотя даже на логотипе их два. Сейчас исправлю.
                +2
                Спасибо за переводы, теперь я постоянный читатель. Вначале почитаю тут, потом буду перечитывать в оригинале. Давно хотел накатать себе нормальную базу знаний, а не обрывочную.
                  0
                  Если вы готовы читать в оригинале, то man «команда» будет полезнее.
                  Тут таки сильно сжато…
                  Но знать о наличии в природе какой-либо команды, таки да…
                  Этот цикл весьма полезен.
                    0
                    Так так и есть, увидеть как работает команда, узнать пару её параметров, понять где использовать. Потом же читать man. Читать в оригинале собираюсь скорее как материал для увеличения понимания технического английского.
                      0
                      Завидую вам…
                      Вам предстоит узнать так много интересного и полезного…
                      А потом вы осознаете всю прелесть выполнения команд «паровозиком» и «если да, если нет»…
                      А потом вас начнет воротить от мыши и «координатно-шагового» интерфейса :)
                      Потом вы установите себе gmrun или какой-нить аналог и перестанете использовать меню программ…
                      Потому как быстрее «жмакнуть» волшебную комбинацию горячих кнопок и набрать в строке ввода первые буквы имени программы (автодополнение, выпадающий список, история)…

                      Ляпота…
                      ;)
                  0
                  Потом вы радуетесь предустановленному везде vi, но спрашиваете себя «а что ж такое emacs?».
                  Но в любом случае приходит конец света через окна и начало новой жизни в теплой консольной норке.
                  Я начинал с manов, но при прочтении часто натыкался на то что, в info я смогу узнать больше. Оказалось правдой.
                    0
                    По поводу символьных ссылок хотел бы спросить. Вот к примеру, настроенная самба, у каждого пользователя своя папка, недоступная для других, плюс общая расшаренная папка для всех. Сделал на сервере символьные ссылки расшаренной папки в папку каждому пользователю. На рабочих станциях с Windows эти символьные ссылки нормально открываются, а на машинах с Linux ссылки отображаются как испорченные — !link. Куда копать?
                      +1
                      Почитайте на тему опций: follow symlinks, wide symlinks, unix extensions у самбы
                        0
                        спасибо огромное :)
                      +1
                      rm -rf — брутально.
                      rm -rd — человечнее.

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

                      Самое читаемое