Name already in use
devops-netology / 03-sysadmin-03-os.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
1. Какой системный вызов делает команда cd? В прошлом ДЗ мы выяснили, что cd не является самостоятельной программой, это shell builtin, поэтому запустить strace непосредственно на cd не получится. Тем не менее, вы можете запустить strace на /bin/bash -c ‘cd /tmp’. В этом случае вы увидите полный список системных вызовов, которые делает сам bash при старте. Вам нужно найти тот единственный, который относится именно к cd.
Ответ:
strace -o output.log /bin/bash -c ‘cd /tmp’ && egrep *tmp output.log
chdir(«/tmp») = 0
2. Попробуйте использовать команду file на объекты разных типов на файловой системе. Например:
Используя strace, выясните, где находится база данных file, на основании которой она делает свои догадки.
Ответ:
man magic указывает на такую информацию:
- The database of these “magic patterns” is usually located in a binary file in /usr/share/misc/magic.mgc or a directory of source text magic pattern fragment files in /usr/share/misc/magic. The database specifies what patterns are to be tested for, what message or MIME type to print if a particular pattern is found, and additional information to extract from the file.
Попробуем выполнить file /bin/bash, отфильтровав результат:
strace -o output.log /bin/bash -c ‘file /bin/bash’ && cat output.log | grep magic
- Видим обращение к библиотеке /lib/x86_64-linux-gnu/libmagic.so.1;
- Файл /etc/magic, по-видимому, служит для каких-то временных данных;
- Видим обращение к файлу /usr/share/misc/magic.mgc
3. Предположим, приложение пишет лог в текстовый файл. Этот файл оказался удален (deleted в lsof), однако возможности сигналом сказать приложению переоткрыть файлы или просто перезапустить приложение – нет. Так как приложение продолжает писать в удаленный файл, место на диске постепенно заканчивается. Основываясь на знаниях о перенаправлении потоков, предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе).
Смоделируем нехорошую ситуацию:
ping 8.8.8.8 >
/output.log
sudo rm -rf output.log
sudo lsof | grep output.log
Видим: PID 7770, файловый дескриптор 1.
Значит, можно найти этот файловый дескриптор в /proc/7770/fd/1 и записать туда пустоту:
sudo su
> /proc/7770/fd/1
Результат:
cat /proc/7770/fd/1
Файл обнулился на момент выполнения команды, что и требовалось в задании. Однако, команда ping продолжает сливать помои на жесткий диск. Впрочем, это уже другая история.
4. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?
5. В iovisor BCC есть утилита opensnoop:
# dpkg -L bpfcc-tools | grep sbin/opensnoop /usr/sbin/opensnoop-bpfcc На какие файлы вы увидели вызовы группы open за первую секунду работы утилиты? Воспользуйтесь пакетом bpfcc-tools для Ubuntu 20.04. Дополнительные сведения по установке.
Ответ:
/usr/sbin/opensnoop-bpfcc
PID COMM FD ERR PATH
1856 vminfo 4 0 /var/run/utmp
626 dbus-daemon -1 2 /usr/local/share/dbus-1/system-services
626 dbus-daemon 28 0 /usr/share/dbus-1/system-services
626 dbus-daemon -1 2 /lib/dbus-1/system-services
626 dbus-daemon 28 0 /var/lib/snapd/dbus-1/system-services/
2496 gnome-shell 27 0 /proc/self/stat
6. Какой системный вызов использует uname -a? Приведите цитату из man по этому системному вызову, где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС.
man 2 uname
- Part of the utsname information is also accessible via /proc/sys/kernel/
.
7. Чем отличается последовательность команд через ; и через && в bash? Например:
root@netology1: # test -d /tmp/some_dir; echo Hi Hi root@netology1: # test -d /tmp/some_dir && echo Hi root@netology1:
# Есть ли смысл использовать в bash &&, если применить set -e?
Ответы:
- С использованем ; обе команды отработают в любом случае.
- С использованием && вторая команда отработает только при успешном результате первой.
- С применением set -e скрипт/оболочка завершит работу при ненулевом коде возврата команды. В принципе, конструкция с && работать будет, но она необязательна, т.к. при другом условии оболочка просто завершится.
8. Из каких опций состоит режим bash set -euxo pipefail и почему его хорошо было бы использовать в сценариях?
Ответ: set -e прекращает выполнение скрипта, если команда завершилась ошибкой.
set -u — прекращает выполнение скрипта, если встретилась несуществующая переменная.
set -x — выводит выполняемые команды в stdout перед выполненинем.
set -o pipefail — прекращает выполнение скрипта, даже если одна из частей пайпа завершилась ошибкой. В этом случае bash-скрипт завершит выполнение, если mycommand вернёт ошибку, не смотря на true в конце пайплайна: mycommand | true.
Красиво и безопасно.
9. Используя -o stat для ps, определите, какой наиболее часто встречающийся статус у процессов в системе. В man ps ознакомьтесь (/PROCESS STATE CODES) что значат дополнительные к основной заглавной буквы статуса процессов. Его можно не учитывать при расчете (считать S, Ss или Ssl равнозначными).
Ответ:
ps -ao stat,command STAT COMMAND
S+ dbus-run-session — gnome-session —autostart /usr/share/gdm/greeter/autostart
Sl+ /usr/libexec/gnome-session-binary —systemd —autostart /usr/share/gdm/greeter/autostart
Sl /usr/libexec/ibus-engine-simple
.
R+ ps -ao stat,command
Наиболее частый статус:
S interruptible sleep (waiting for an event to complete)
Разбираемся с системными вызовами в Linux с помощью strace

Системный вызов — это механизм взаимодействия пользовательских программ с ядром Linux, а strace — мощный инструмент, для их отслеживания. Для лучшего понимания работы операционной системы полезно разобраться с тем, как они работают.
В операционной системе можно выделить два режима работы:
- Режим ядра (kernel mode) — привилегированный режим, используемый ядром операционной системы.
- Пользовательский режим (user mode) — режим, в котором выполняется большинство пользовательских приложений.
Системные вызовы очень похожи на вызовы функций, в том смысле, что в них передаются аргументы и они возвращают значения. Единственное отличие состоит в том, что системные вызовы работают на уровне ядра, а функции нет. Переключение из пользовательского режима в режим ядра осуществляется с помощью специального механизма прерываний.
Большая часть этих деталей скрыта от пользователя в системных библиотеках (glibc в Linux-системах). Системные вызовы по своей природе являются универсальными, но несмотря на это, механика их выполнения во многом аппаратно-зависима.
В этой статье рассматривается несколько практических примеров анализа системных вызовов с помощью strace . В примерах используется Red Hat Enterprise Linux, но все команды должны работать и в других дистрибутивах Linux:
Для начала убедитесь, что в вашей системе установлены необходимые инструменты. Проверить установлен ли strace можно с помощью приведенной ниже команды. Для просмотра версии strace запустите ее с параметром -V:
Если strace не установлен, то установите запустив:
Для примера создайте тестовый каталог в /tmp и два файла с помощью команды touch :
(Я использую каталог /tmp только потому, что доступ к нему есть у всех, но вы можете использовать любой другой.)
С помощью команды ls проверьте, что в каталоге testdir создались файлы:
Вероятно, вы используете команду ls каждый день, не осознавая того, что под капотом работают системные вызовы. Здесь в игру вступает абстракция. Вот как работает эта команда:
Команда ls вызывает функции из системных библиотек Linux (glibc). Эти библиотеки, в свою очередь, вызывают системные вызовы, которые выполняют большую часть работы.
Если вы хотите узнать, какие функции вызывались из библиотеки glibc, то используйте команду ltrace со следующей за ней командой ls testdir/ :
Если ltrace не установлен, то установите:
На экране будет много информации, но не беспокойтесь — мы это рассмотрим далее. Вот некоторые из важных библиотечных функций из вывода ltrace :
Изучив этот вывод, вы, вероятно, поймете, что происходит. Каталог с именем testdir открывается с помощью библиотечной функции opendir , после чего следуют вызовы функций readdir , читающих содержимое каталога. В конце происходит вызов функции closedir , которая закрывает каталог, открытый ранее. Пока проигнорируйте остальные функции, такие как strlen и memcpy .
Как вы видите, можно легко посмотреть вызываемые библиотечные функции, но в этой статье мы сфокусируемся на системных вызовах, которые вызываются функциями системных библиотек.
Для просмотра системных вызовов используйте strace с командой ls testdir , как показано ниже. И вы снова получите кучу бессвязной информации:
В результате выполнения strace вы получите список системных вызовов, выполненных при работе команды ls . Все системные вызовы можно разделить на следующие категории:
- Управление процессами
- Управление файлами
- Управление каталогами и файловой системой
- Прочие
На этот раз на экране не будет никаких данных — команда ls отработает, как и ожидается, показав список файлов и записав весь вывод strace в файл trace.log . Для простой команды ls файл содержит почти 100 строк:
Взгляните на первую строку в файле trace.log :
- В начале строки находится имя выполняемого системного вызова — это execve.
- Текст в круглых скобках — это аргументы, передаваемые системному вызову.
- Число после знака = (в данном случае 0) — это значение, возвращаемое системным вызовом.
Обратите внимание на ту единственную команду, которую вы вызвали — ls testdir . Вам известно имя каталога, используемое командой ls , так почему бы не воспользоваться grep для testdir в файле trace.log и не посмотреть, что найдется? Посмотрите внимательно на результат:
Возвращаясь к приведенному выше анализу execve , можете ли вы сказать, что делает следующий системный вызов?
Не нужно запоминать все системные вызовы и то, что они делают: все есть в документации. Man-страницы спешат на помощь! Перед запуском команды man убедитесь, что установлен пакет man-pages :
Помните, что вам нужно добавить «2» между командой man и именем системного вызова. Если вы прочитаете в man про man ( man man ), то увидите, что раздел 2 зарезервирован для системных вызовов. Аналогично если вам нужна информация о библиотечных функциях, то нужно добавить 3 между man и именем библиотечной функции.
Ниже приведены номера разделов man :
Для просмотра документации по системному вызову запустите man с именем этого системного вызова.
В соответствии с документацией системный вызов execve выполняет программу, которая передается ему в параметрах (в данном случае это ls ). В него также передаются дополнительные параметры для ls. В этом примере это testdir . Следовательно, этот системный вызов просто запускает ls с testdir в качестве параметра:
В следующий системный вызов stat передается параметр testdir :
Для просмотра документации используйте man 2 stat . Системный вызов stat возвращает информацию об указанном файле. Помните, что все в Linux — файл, включая каталоги.
Далее системный вызов openat открывает testdir . Обратите внимание, что возвращается значение 3. Это дескриптор файла, который будет использоваться в последующих системных вызовах:
Теперь откройте файл и обратите внимание на строку, следующую после системного вызова openat . Вы увидите системный вызов getdents , который делает большую часть необходимой работы для выполнения команды ls testdir . Теперь выполним grep getdents для файла trace.log :
В документации ( man getdents ) говорится, что getdents читает записи каталога, это, собственно, нам и нужно. Обратите внимание, что аргумент для getdent равен 3 — это дескриптор файла, полученный ранее от системного вызова openat .
Теперь, когда получено содержимое каталога, нужен способ отобразить информацию в терминале. Итак, делаем grep для другого системного вызова write , который используется для вывода на терминал:
В аргументах вы можете видеть имена файлов, которые будут выводится: file1 и file2 . Что касается первого аргумента (1), вспомните, что в Linux для любого процесса по умолчанию открываются три файловых дескриптора:
- 0 — стандартный поток ввода
- 1 — стандартный поток вывода
- 2 — стандартный поток ошибок
Теперь вы знаете, какие системные вызовы сделали большую часть работы для команды ls testdir/ . Но что насчет других 100+ системных вызовов в файле trace.log ?
Операционная система выполняет много вспомогательных действий для запуска процесса, поэтому многое из того, что вы видите в файле trace.log — это инициализация и очистка процесса. Посмотрите файл trace.log полностью и попытайтесь понять, что происходит во время запуска команды ls .
Теперь вы можете анализировать системные вызовы для любых программ. Утилита strace так же предоставляет множество полезных параметров командной строки, некоторые из которых описаны ниже.
По умолчанию strace отображает не всю информацию о системных вызовах. Однако у нее есть опция -v verbose , которая покажет дополнительную информацию о каждом системном вызове:
Хорошая практика использовать параметр -f для отслеживания дочерних процессов, созданных запущенным процессом:
А если вам нужны только имена системных вызовов, количество их запусков и процент времени, затраченного на выполнение? Вы можете использовать опцию -c , чтобы получить эту статистику:
Если вы хотите отследить определенный системный вызов, например, open , и проигнорировать другие, то можно использовать опцию -e с именем системного вызова:
А что, если нужно отфильтровать по нескольким системным вызовам? Не волнуйтесь, можно использовать ту же опцию -e и разделить необходимые системные вызовы запятой. Например, для write и getdent :
До сих пор мы отслеживали только явный запуск команд. Но как насчет команд, которые были запущены ранее? Что, если вы хотите отслеживать демонов? Для этого у strace есть специальная опция -p , которой вы можете передать идентификатор процесса.
Мы не будем запускать демона, а используем команду cat , которая отображает содержимое файла, переданного ему в качестве аргумента. Но если аргумент не указать, то команда cat будет просто ждать ввод от пользователя. После ввода текста она выведет введенный текст на экран. И так до тех пор, пока пользователь не нажмет Ctrl+C для выхода.
Запустите команду cat на одном терминале.
На другом терминале найдите идентификатор процесса (PID) с помощью команды ps :
Теперь запустите strace с опцией -p и PID’ом, который вы нашли с помощью ps . После запуска strace выведет информацию о процессе, к которому он подключился, а также его PID. Теперь strace отслеживает системные вызовы, выполняемые командой cat . Первый системный вызов, который вы увидите — это read, ожидающий ввода от потока с номером 0, то есть от стандартного ввода, который сейчас является терминалом, на котором запущена команда cat :
Теперь вернитесь к терминалу, где вы оставили запущенную команду cat , и введите какой-нибудь текст. Для демонстрации я ввел x0x0 . Обратите внимание, что cat просто повторил то, что я ввел и x0x0 на экране будет дважды.
Вернитесь к терминалу, где strace был подключен к процессу cat . Теперь вы видите два новых системных вызова: предыдущий read , который теперь прочитал x0x0 , и еще один для записи write , который записывает x0x0 обратно в терминал, и снова новый read , который ожидает чтения с терминала. Обратите внимание, что стандартный ввод (0) и стандартный вывод (1) находятся на одном и том же терминале:
Представляете, какую пользу может принести вам запуск strace для демонов: вы можете увидеть все, что делается в фоне. Завершите команду , нажав . Это также прекратит сеанс , так как отслеживаемый процесс был прекращен.
Для просмотра отметок времени системных вызовов используйте опцию -t :
А если вы хотите узнать время, проведенное между системными вызовами? Есть удобная опция -r , которая показывает время, затраченное на выполнение каждого системного вызова. Довольно полезно, не так ли?
Заключение
Утилита strace очень удобна для изучения системных вызовов в Linux. Чтобы узнать о других параметрах командной строки, обратитесь к man и онлайн-документации.
Unix2018/Базовые навыки работы в командной строке
В UNIX-системах играет большую роль, чем во многих остальных. Одна из частей философии UNIX — многие вещи представляются в файловой системе как специальные файлы.
Понятия
Файловая система состоит из файлов и каталогов. В иерархической файловой системе (hierarchical filesystem) файлы и каталоги организуются в виде дерева.
Сложно дать хорошее определение файлу. Приведём определение из Википедии.
Файл (file) — ресурс для хранения информации, доступный для компьютерных программ и обычно основанный на каком-то долговременном хранилище (в том смысле, что он продолжит быть доступным для других программ после того, как создавшая его программа завершит выполнение). Как правило, доступ к файлам осуществляется по имени.
Каталог (directory) — структура для организации файловой системы, которая содержит ссылки на другие файлы или каталоги. Ранее часто использовался термин директория (транслитерация с англ.).
Термин папка (folder) был введён для представления объектов файловой системы в графическом пользовательском интерфейсе путём аналогии с офисными папками (впервые использован в Mac System Software, потом в Windows 95). При работе в консоли принято использовать слово «каталог», а не «папка».
Структура
Корень иерархической файловой системы — это прямой слеш (/). Пути в ФС разделяются слешами. В общем случае все остальные символы могут использоваться в именах файлов, кроме символа с кодом 0.
Большинство ФС в UNIX-системах чувствительно к регистру, в отличие от Windows.
Каталог, находящийся внутри другого, называется подкаталогом (subdirectory). Каталог верхнего уровня называется корневым (root).
Специальные каталоги с именами . (текущий каталог) и .. (родительский каталог) неявно существуют в любом каталоге. В одном каталоге не может существовать двух файлов или подкаталогов с одинаковыми именами, поэтому имена «точка» и «две точки» нельзя использовать для файлов. Ссылка .. в корневом каталоге ведёт в него же.
Работа в терминале
Приглашение
Командная оболочка встречает вас приглашением (command prompt).
Тут указывается имя текущего пользователя, название хоста, после двоеточия записан текущий каталог. Символом
(тильда) обозначают домашний каталог. Он свой у каждого пользователя. Как правило, домашний каталог доступен на чтение и запись и предназначен для хранения пользовательских файлов. Многие системные каталоги доступны для пользователя в режиме «только чтение».
Навигация по каталогам
- Название расшифровывается как change directory.
- Это команда оболочки (sh/bash/. ), а не отдельная программа или системный вызов.
- Без аргументов — переход в домашний каталог.
- cd - — возврат в предыдущий каталог.
- print working directory
- Выводит текущий каталог (абсолютный путь)
- Команда ls — list. Печатает в стандартный вывод содержимое каталогов.
- По умолчанию печатает содержимое текущего каталога, но можно указать произвольный каталог в качестве аргумента.
- ls -1 — печать по одному названию в строке.
- ls -a — выводить записи, начинающиеся с точки (по умолчанию эти файлы и каталоги скрыты).
- ls -t — сортировка по времени изменения, новые файлы сначала.
- ls -l — подробный режим.
Справка
Работая в консоли, часто приходится обращаться к справочной информации, чтобы узнать об использовании команд.
man (от англ. manual — руководство) — команда UNIX, предназначенная для форматирования и вывода справочных страниц. Поставляется почти со всеми UNIX-подобными дистрибутивами. Каждая страница справки является самостоятельным документом и пишется разработчиками соответствующего программного обеспечения.
Чтобы вывести справочное руководство по какой-либо команде (или программе, предусматривающей возможность запуска из терминала), можно в консоли ввести:
Например, чтобы посмотреть справку по команде ls, нужно ввести man ls.
Для навигации в справочной системе man можно использовать клавиши ↑ и ↓ для построчного перехода, PgUp и PgDn для постраничного перехода вверх и вниз соответственно.
При просмотре больших страниц удобно воспользоваться поиском, для чего следует нажать /, затем набрать строку поиска (и слеш, и строка поиска отобразятся в нижней части экрана) и нажать Enter. Обратным поиском (снизу вверх) можно воспользоваться, нажав кнопку ?. При этом подсветятся все совпадения с заданным регулярным выражением, и экран прокрутится до первого из них. Для перехода к следующему подсвеченному вхождению нужно нажать n (Next — следующий), либо оставить строку поиска пустой (/, затем Enter). Для показа предыдущего совпадения надо также использовать вопросительный знак или же нажимать N (заглавную).
Для получения краткой справки по командам и горячим клавишам справочной системы нужно нажать H (Help — помощь).
Для выхода из справочной системы используется клавиша Q (Quit — выход).
Для получения детальной инструкции по использованию команды используется конструкция
Справочные страницы поделены на 8 стандартных разделов и один дополнительный. Каждый из разделов соответствует той или иной тематике в рамках установленной операционной системы.
| Раздел | Краткое описание |
|---|---|
| 1 | Прикладные программы и команды оболочки |
| 2 | Системные вызовы ядра (функции языка C) |
| 3 | Библиотечные вызовы (функции различных библиотек, установленных в систему) |
| 4 | Специальные файлы (находящиеся обычно в каталоге /dev) |
| 5 | Форматы файлов и соглашения |
| 6 | Игры |
| 7 | Различные описания, соглашения и прочее |
| 8 | Команды администрирования системы, которые обычно запускаются от имени суперпользователя |
| 9 | Ядро операционной системы (нестандартный раздел) |
Номер раздела в команде man указывается вторым аргументом, перед названием справочной страницы. Если номер раздела опущен, то поиск справочной страницы ведётся по всем разделам по порядку.
Альтернативой man от проекта GNU является команда info.
Стандартный ввод и стандартный вывод
Из курса программирования вам знакомы понятия трёх стандартных потоков:
- поток ввода (stdin),
- поток вывода (stdout),
- поток ошибок (stderr).
Программы, работающие в командной строке, обычно выводят полезную информацию на stdout и выводят служебную информацию (обычно сообщения об ошибках) на stderr.
Аргументы командной строки
Зачастую при запуске программы ей можно передать параметры, тем самым настроить режим работы.
Стандарт POSIX содержит соглашения об API утилит командной строки.
Краткие формы опций начинаются с одинарного минуса. Полные начинаются с двух минусов.
Кроме того, есть дополнительные соглашения.
- Если команда ожидает аргумент — имя файла, а ей передали -, то это значит, что надо читать из stdin вместо файла.
- -- говорит о том, что флаги закончились, например ls — -l показывает содержимое директории с именем -l.
Комбинации клавиш
При работе в bash действуют полезные горячие клавиши.
- Tab — автодополнение.
- Стрелки вверх-вниз (также Ctrl+P и Ctrl+N) — история команд.
- Home и End (также Ctrl+A и Ctrl+E) — переход в начало/конец строки.
- Alt+B и Alt+F (также Ctrl и стрелки влево-вправо) — переход по словам назад/вперёд.
- Ctrl+L — очистить экран.
- Ctrl+R — поиск по истории.
Утилиты и встроенные команды
Когда мы пишем в терминале, например, команду ls -l, запускается программа под названием ls, ей передаётся аргумент -l. Эта программа выводит нужную информацию в stdout.
Чтобы узнать, где реально на диске лежит та или иная программа, можно использовать which:
Некоторые команды, например cd, не являются отдельными утилитами, а реализованы в самой командной оболочке. Для них which выдаст пустоту:
Тем не менее, некоторые команды существуют и как утилиты, и как встроенные функции. Примером является pwd. Использование встроенной функции позволяет обеспечить лучшую производительность и сэкономить ресурсы на запуск нового процесса. Чтобы понять, что именно скрывается за конкретной командой оболочки, можно использовать type:
Работа с ФС
mkdir
- make directory
- С ключом -p не выдаёт ошибок, если каталог существует, и создаёт при необходимости промежуточные каталоги.
touch
- Предназначена для установки времени последнего изменения файла или доступа. Также используется для создания пустых файлов.
- Если файл не существует, утилита создает пустой файл с указанным именем.
- Если аргумент времени не задан, используется текущее время.
- Отображает «статус» файла, полученный посредством одноимённого системного вызова.
- Не является стандартной утилитой POSIX, но есть
- Предназначена для копирования файлов и каталогов.
- Ключ -R, -r, --recursive — копировать директории рекурсивно (то есть все поддиректории и все файлы в поддиректориях).
Три режима работы (режим зависит от числа аргументов и типов).
- Когда программа имеет два аргумента — пути к файлам, программа копирует содержимое первого файла во второй файл, создавая при необходимости второй файл.
- Когда программа имеет один или несколько аргументов — путей к файлам, после них аргумент — путь к каталогу, то программа копирует каждый исходный файл в целевой каталог, создавая файлы, которые не существуют.
- Когда аргументы программы являются путями к двум каталогам, cp копирует исходный каталог в целевой каталог, создавая любые файлы или каталоги при необходимости. Для этого режима работы требуется дополнительный флаг -r.
- move
- Используется для перемещения или переименования.
- Ключ -r или -R (можно и так и так) — обрабатывать все вложенные подкаталоги. Данный ключ необходим, если удаляемый файл является каталогом, пусть даже пустым. Если удаляемый файл не является каталогом, то ключ не влияет на команду.
- Ключ -f — не возвращать код ошибочного завершения, если ошибки были вызваны несуществующими файлами; не запрашивать подтверждения операций.
- Ключ -i — интерактивный режим.
- rm -rf mydir — рекурсивно удалить без подтверждения и кода ошибочного завершения файл (или директорию) mydir.
- «Защита от дурака»: rm -rf / нельзя выполнить (с 2006 г.), нужно дополнительно задавать ключ --no-preserve-root.
Примеры использования rm
В 2003 году на Linux.org.ru появилась провокация: автор опубликовал «программу из одной строчки на Perl» и попросил подсказать, почему она не работает:
Эта программа на поверку оказалась хорошо замаскированным rm -rf / . При попытке запуска её из аккаунта root пользователь мог поплатиться всеми данными.
Летом 2011 года похожая ситуация с rm произошла в проекте Bumblebee, представляющем собой костыль для поддержки технологии NVidia Optimus в ноутбуках с двумя видеокартами.
Файл install.sh в исходниках данного проекта вместо строки
содержал безобидную строчку
Эта строка, как нетрудно заметить, удаляет директорию /usr. Лишний пробел вызвал потерю данных.
rmdir
- remove directory
- Удаляет пустой каталог. Если каталог не пустой, выдаёт ошибку.
- Существование этой команды вызвано историческими причинами.
- Более безопасно, чем rm -r, потому что случайно нельзя удалить файлы.
unlink
- удаляет только файлы, не умеет удалять каталоги
- Выводит дерево в человекочитаемом виде.
- Во многих дистрибутивах не является стандартной программой, ставится отдельно.
- Программа UNIX, предназначенная как для копирования, так и для конвертации файлов.
- dataset definition (иногда в шутку расшифровывают как disk destroyer)
- Утилита позволяет производить низкоуровневые операции на жёстких дисках. При малейшей ошибке (такой, как реверс параметров if и of) можно потерять часть данных на диске (или даже все данные).
Примеры использования
Файл, забитый случайными данными:
Загрузочный сектор с диска (MBR):
- disk free
- Показывает список всех файловых систем по именам устройств, сообщает их размер, занятое и свободное пространство и точки монтирования.
- Ключ -h, --human-readable отобразит размер в человекочитаемом формате, добавив названия единиц.
- disk usage
- Программа для оценки занимаемого файлового пространства.
- По умолчанию показывает размер файлового пространства, занимаемого каждым файлом и каталогом в текущем каталоге.
dirname
- Отрезает последнюю компоненту пути и слеш. Не проверяет, что файлы существуют.
- /usr/bin/ -> /usr
- /usr/bin/a.out -> /usr/bin
- abacaba -> .
basename
- Наоборот, оставляет только последнюю компоненту.
- /usr/bin/sort -> sort
Файловые менеджеры
Если неудобно работать с командной строкой, то есть файловые менеджеры. Nautilus входит в стандартную поставку GNOME. Computer является там аналогом /.
Консольная программа mc — Midnight Commander — аналог Norton Commander и FAR. Двухпанельный файловый менеджер с псевдографическим интерфейсом.
Команда cd Linux
При работе в терминале все команды привязываются к текущей папке. В ней будут создаваться файлы, если не был указан точный адрес, в ней же могут создаваться временные файлы. Да и просто адресовать файлы команде намного удобнее из текущей папки, просто указав имя файла, а не полный путь в файловой системе.
По умолчанию, в качестве текущей папки используется домашняя, но для большего удобства нам приходится часто менять ее на другую. Для этого существует команда cd linux. В этой небольшой статье мы рассмотрим как использовать эту команду и какие у нее есть возможности.
Команда cd Linux
Перед тем как мы перейдем к работе с утилитой, давайте рассмотрим ее синтаксис и основные опции. Строго говоря, это вообще никакая не утилита. Ее нет в файловой системе. Это встроенная команда Bash и меняет текущую папку только для оболочки, в которой выполняется. Вот основной синтаксис команды:
$ cd опции папка_назначения
Опций всего две, это -P и -L. Они влияют на то, как будут обрабатываться символы возврата в предыдущую директорию и символические ссылки:
- -P — позволяет следовать по символическим ссылкам перед тем, как будут обработаны все переходы «..»;
- -L — переходит по символическим ссылкам только после того, как были обработаны «..»;
- -e — если папку, в которую нужно перейти не удалось найти — выдает ошибку.
Дальше нужно указать директорию, в которую следует перейти. Если этого не сделать, а вызвать cd без параметров, то рабочей папкой будет выбран ваш домашний каталог. А теперь давайте рассмотрим несколько примеров работы с cd linux.
Использование cd в linux
Я не буду здесь описывать какими бывают пути в Linux. Мы рассматривали эту тему в отдельной статье. По умолчанию, в качестве рабочего каталога используется домашняя папка пользователя. Давайте сначала перейдем в одну из подпапок домашней папки:

Домашняя папка обозначается как
/. Поэтому следующая команда выполнит аналогичное действие:

Правда, здесь есть преимущество. В первой команде используется относительный путь, тогда как вторая правильно выполнится из любой папки. Теперь переместимся в папку /usr/lib относительно корня:

С помощью символа черты «-» вы можете вернуться в предыдущую папку:

Используя двойную точку «..» можно перейти в родительский каталог:

Вы можете использовать несколько блоков с точками для перемещения на несколько уровней вверх:

Как уже говорилось, если не передать папку, в которую нужно перейти, будет открыта домашняя папка:

Аналогичный результат выдаст команда:
Для упрощения перехода по папкам можно использовать символ звездочки. Правда, автодополнение сработает только если на указанные символы будет начинаться только одна папка.

Кроме cd, есть еще две дополнительные команды, это pushd и popd. Можно сказать, что простая реализация стека для рабочих каталогов. Когда вы выполняете pushd, текущий рабочий каталог сохраняется в памяти, а на его место устанавливается указанный:
Теперь наберите popd, чтобы вернуться в предыдущий каталог:

Это реализация стека, поэтому количество каталогов в памяти не ограничено двумя. Вы можете перемещаться по такому количеству папок, как вам нужно.
Наконец, еще один момент, если вам нужно перейти в каталог, в имени которого есть пробелы, используйте символ экранирования обратный слэш «\» или просто возьмите его имя в скобки:
/Загрузки/новая\ папка/ $ cd «
Выводы
Теперь вы знаете зачем нужна команда cd Linux, а также как максимально эффективно ею пользоваться при работе в терминале. Надеюсь, эта информация была полезной для вас. Если у вас остались вопросы, спрашивайте в комментариях!