Если вы уже используете Linux и имеете неплохое представление о его администрировании, то смело пропустите эту главу. Если информация из неё будет для вас совсем новой, то для дальнейшего чтения желательно почитать дополнительную литературу, потренироваться в написании скриптов на bash.
В любом случае мы рекомендуем ознакомиться с книгами из списка ниже, в них есть масса информации, полезной даже опытным профессионалам:
Эви Немет, Гарт Снайдер, Трент Хейн, Бэн Уэйли
Unix и Linux: руководство системного администратора
Это классический учебник по Unix и Linux. В нём нередко случаются отсылки к таким древним системам, как VAX и PDP-11, тем не менее он отлично отражает суть работы UNIX и остаётся актуальным по сей день.
Томас Лимончелли, Кристина Хоган, Страта Чейлап
Системное и сетевое администрирование. Практическое руководство
Более новый учебник по Linux, содержит массу полезных примеров.
Брайан Керниган, Роб Пайк
Unix – Программное окружение
Эта книга в большей степени посвящена программированию как в оболочке bash, так и с помощью иных инструментов. Даже если вам не приходится регулярно этим заниматься, настоятельно советую прочесть эту книгу, так как она откроет вам те принципы, по которым строится работа в UNIX, вам станут более понятны многие процессы, происходящие внутри ОС.
Томас Лимончелли
Тайм-менеджмент для системных администраторов
Название говорит само за себя. В книге есть множество ситуаций, в которые попадает любой системный администратор, и практические советы, как из них выходить с минимальными потерями.
Эта глава не претендует на статус учебника по UNIX, но мы постарались собрать в ней все основные понятия, знание которых в дальнейшем вам обязательно потребуется. На сегодняшний день на суперкомпьютерах в подавляющем большинстве случаев используется UNIX-подобная операционная система. Мы говорим UNIX-подобная, так как легендарная ОС UNIX в чистом виде сейчас не развивается и практически не используется.
Краткая историческая справка. После разделения компании AT&T, которая и разработала эту ОС, товарный знак UNIX и права на оригинальный исходный код неоднократно меняли владельцев, в частности, длительное время они принадлежали компании Novell. В 1993 г. Novell передала права на товарный знак и на сертификацию программного обеспечения на соответствие этому знаку консорциуму X/Open, который затем объединился с Open Software Foundation и сейчас называется «The Open Group». Этот консорциум занимается разработкой открытых стандартов для ОС, таких как POSIX (сейчас он переименован в Single UNIX Specification).
Согласно положению «The Open Group», название «UNIX» могут носить только системы, прошедшие сертификацию на соответствие Single UNIX Specification. В настоящее время несколько ОС прошли разные версии этой сертификации, например Solaris, AIX.
Даже те ОС, которые не проходили сертификации UNIX (например Linux), стараются соответствовать этим стандартам. Именно поэтому архитектура приложений на этих ОС очень похожа, а перенос приложения с одной ОС на другую прост, особенно если при написании программы использовались только стандартные библиотеки и функции. Именно эти качества и огромная популярность UNIX в прошлом, а также отлично зарекомендовавшие себя её наследники – Solaris, OpenBSD, FreeBSD, AIX и, конечно же, Linux – обеспечили UNIX-подобным ОС лидерство на серверах всего мира.
Вычислительные кластеры и суперкомпьютеры не исключение. Здесь стандартом de facto является Linux. Именно на эту операционную систему мы и будем ориентироваться. Несмотря на то что существует немало установок на других операционных системах, таких как Windows, FreeBSD, Solaris и других, в данной книге мы не будем останавливаться на их особенностях в классе HPC.
Основное понятие в любой ОС – процесс. Это нечто типа контейнера (реально – описания в таблицах ОС), содержащего уникальный идентификатор (
PID
), права (владелец, группа и некоторые другие), код программы, область данных, стек, набор страниц памяти, таблицу открытых файлов и прочие атрибуты. Для ОС процесс – единица планирования процессорного времени, каждый процесс может исполняться процессором, быть в ожидании исполнения, быть в состоянии системного вызова (передать запрос к ОС и ждать ответ), быть остановленным или завершившимся. Обозначаются они как R (running
), S (sleeping
), D (uninterruptable sleep
), T (stopped
) и Z (zombie
).
Например, если запустить на компьютере с 2 ядрами 10 программ расчёта числа пи, то одновременно смогут считаться только 2, но ОС будет с большой частотой (например 100 раз в секунду) приостанавливать выполнение активного процесса, помещать его в очередь и отправлять на выполнение следующий процесс из очереди (очень грубо, но суть именно такая). Для процесса это выглядит как будто он монопольно владеет процессором, просто скорость этого процессора раз в 5 ниже, чем могла бы.
Среднее число процессов в очереди обозначается как «уровень загрузки» – Load Average. Если он больше числа ядер, то обычно это значит, что не всем задачам «достаётся» процессор, и они работают медленнее. Надо учесть что в очередь включаются и процессы в состоянии D, то есть высокий LA могут вызвать процессы, которые, например, много читают с диска или пишут (и постоянно ждут в вызове read или write). То есть высокий LA – это сигнал, что потенциально что-то не так, но хорошо бы проверить.
В состояние
stopped
процесс переводится, только если другой процесс послал ему сигнал STOP. В этом случае он «замирает» и перестаёт исполняться до тех пор, пока не получит сигнал CONT (или не будет завершён). Если процесс в состоянии D, то сигнал игнорируется. В принципе, сигнал STOP процесс может игнорировать, но так делается очень редко.
Состояние
zombie
возникает, когда процесс завершился, но его родитель «не подтвердил» это (не вызвал системный вызов wait
). Это делается для того, чтобы родительский процесс мог получить данные о том, как завершился процесс. т. е. процессы в состоянии zombie
уже не потребляют никаких ресурсов ни процессора, ни памяти. По этой же причине их нельзя принудительно завершить – они уже завершены.
Родительский процесс (
PPID
) есть у каждого процесса в системе, если родительский процесс завершился, то им становится процесс с PID
1 (обычно это специальный процесс init
в системе, мы про него поговорим ниже), который выполняет wait
для всех таких процессов.
Посмотреть список процессов и их состояние можно с помощью команды
ps
. У неё нелёгкая судьба, т. к. в разных вариантах популярных ОС (Unix, BSD, Solaris) исторически у неё было много разных, в том числе конфликтующих опций. В результате в Linux используется вариант GNU, который пытается их сочетать. В частности, есть опции, которые обязательно надо указывать с минусом впереди, а другие – наоборот только без минуса. Ниже самые полезные с нашей точки зрения:
К большинству комбинаций можно добавить w, тогда поле имени процесса (обычно программа с аргументами) будет шире. Если добавить дважды, то будет ещё шире, а если трижды, то ограничений на ширину не будет совсем.
Бывает удобно отслеживать активность процессов в реальном времени. Тут помогут команды
top
и более новомодная htop
. Они показывают процессы в виде таблицы, отсортированной по одному полю, и обновляют её раз в 5 секунд (можно поменять интервал). При этом показываются только те процессы, которые поместились на экране, плюс некоторые общие данные о системе – загрузка процессора, памяти, loadaverage, число процессов в разных состояниях.
Можно переключать режимы отображения и сортировки. Для
top
есть несколько горячих клавиш, их список можно получить, нажав 'h'. Наиболее удобные варианты сортировки и команды:
+
– сортировать процессы по использованию процессора;
+
– сортировать процессы по использованию памяти;
1
– показывать загрузку каждого ядра или суммарную;
k
– послать сигнал процессу;
r
– изменить приоритет процесса;
u
– фильтровать по пользователю;
q
– выход.
У
htop
более дружественный интерфейс, по возможности она использует цветной вывод, загрузку процессора и памяти выводит в виде текстовых прогресс-баров, умеет организовывать процессы в деревья (и схлопывать их с одну строку, что иногда очень удобно). Клавиши управления выведены в нижней строке в стиле Norton Commander (Midnight Commander/FAR manager).
Мы уже не раз упомянули сигналы – это простой способ общения процессов, любой процесс может послать другому сигнал, если он принадлежит тому же пользователю (пользователь
root
может посылать всем). Сигнал – целое число, так что много информации им не передать, но его функция – попросить процесс выполнить какое-то действие. Все сигналы, кроме KILL, могут быть перехвачены и обработаны, если процесс не обрабатывает сигнал, то ОС выполняет заранее определённое действие за него.
Для большинства сигналов есть стандартные значения и действия, ниже – самые часто используемые:
Таблица 3: некоторые сигналы в Linux
Действия «по умолчанию» процесс может изменять (кроме сигнала KILL). Их можно обработать или игнорировать. При корректном завершении память процесса может быть записана в т. н. core-файл для того, чтобы после можно было исследовать причину ошибки отладчиком. Будет ли создан core-файл, определяется настройками ОС и лимитами (см. главу о квотах).
Послать сигнал из командной строки можно командой
kill
. Например, kill -9 1234
принудительно завершит процесс 1234, а kill -STOP 2345
остановит процесс 2345. Как видно, можно использовать как номер сигнала, так и его обозначение. kill -l
покажет список всех сигналов. Иногда требуется послать сигнал не одному процессу, а многим, например всем процессам пользователя. Тогда на помощь приходит программа pkill
: pkill -u vasya -TERM
пошлёт сигнал TERM
всем процессам пользователя vasya
.
Выше мы говорили о том, что процессы, желающие выполняться, ставятся в очередь. В ней они выполняются не всегда подряд, у каждого есть приоритет и влияющий на него параметр
nice
(вежливость). Чем выше приоритет, тем быстрее процесс продвигается к началу очереди. Явно задать приоритет нельзя, но можно поменять вежливость (часто её тоже называют приоритетом для простоты, но это не совсем так). Делается это командой nice или renice, первая запускает программу с заданным приоритетом, вторая меняет приоритет уже запущенной. Чем выше вежливость, тем ниже приоритет, программа чаще будет «пропускать» других вперёд. Исторически вежливость меняется от 20 до +20, и обычный пользователь не может указать её меньше 0. Например:
Здесь мы меняем вежливость с 0 до 15 (приоритет понижается) или до -10 (приоритет повышается).
Кроме очереди на ресурсы процессора есть очередь к ресурсам жёстких дисков, несколько процессов могут одновременно читать-писать, и их запросы будут конкурировать. В этой очереди тоже есть приоритет, им управляет команда
ionice
. Есть три класса приоритетов – idle
(выполнять запрос, если больше никого в очереди нет), best effort
(нормальная очередь) и real time
(запрос должен быть выполнен за заданное время). Внутри классов, кроме idle,
есть собственные приоритеты, но в наших задачах можно ограничиться назначением класса idle процессу, занимающему много времени на дисковых операциях, но не приоритетному:
Понятие процесса – основное в любой ОС. Не следует путать процессы и нити, важно знать, что такое реальная и виртуальная память процесса, как работают разделяемые библиотеки (shared objects, so) и динамический линкер (ld.so). Изучите документацию на эту тему в дистрибутиве своей ОС или в обширной документации в Интернете.
Unix-подобные ОС изначально проектировались как многопользовательские системы, а значит, нужно защитить данные и процессы пользователей от нежелательных посягательств других пользователей. Чуть выше мы уже упомянули права процесса и отметили, что, например, нельзя послать сигнал процессу другого пользователя (если нет особых прав на это). Подобный принцип применяется и для разделения прав на прочие объекты в ОС.
Базовый механизм разделения прав в UNIX-подобных системах основан на понятиях UID, или User ID (идентификатор пользователя) и GID, или Group ID (идентификатор группы, которой принадлежит пользователь). UID и GID – числа, но обычно с ними связывают текстовые имена. Каждый процесс имеет «реальные» UID и GID (ruid/rgid), которые не меняются со временем, а также список дополнительных групп, в которые он входит. Кроме реальных, процесс имеет «эффективные» UID и GID (euid/egid), которые определяют его текущие возможности (т. е. именно по ним определяются его права), а также «сохранённые» UID и GID (suid/sgid) – в них копируются эффективные UID/GID при смене UID/GID. Смена UID/GID может происходить, если у процесса есть такое разрешение (capability) или его EUID либо SUID равен 0.
Пользователь с UID = 0 обычно имеет текстовое имя '
root
' и имеет почти неограниченные права, поэтому часто его называют «суперпользователь».
Чаще всего, наверное, приходится сталкиваться с правами на файловой системе. Здесь каждый объект (файл, ссылка, каталог, устройство, сокет, канал, далее будем для краткости писать «файл») имеет владельца и группу, а также связанные с ними права – чтение, запись и исполнение. Часто для их записи используют восьмеричную запись или формат команды
ls
. Например, права с восьмеричным кодом 750
(в выдаче ls rwxr-x–
) обозначают, что владельцу разрешено чтение, запись и исполнение (rwx / 7
), группе – чтение и исполнение (r-x / 5
), остальным – ничего (-– / 0
).
Проверка прав производится в таком порядке – если владелец файла совпадает с EUID, берутся права владельца. Иначе, если группа или одна из дополнительных групп совпадают с группой файла, то берутся права группы, и в противном случае – права «остальные».
Для каталога право на «исполнение» означает возможность войти в каталог. При этом посмотреть список файлов в нём не гарантируется – для этого нужно право на чтение. Право на запись означает возможность создавать и удалять файлы в каталоге. Сменить права на файл (или другой объект) может только его владелец. Если нужно сменить права для группы, то владелец должен в неё входить. Ну и конечно, суперпользователь может менять любые права, а также владельца и группу любого файла.
Как уже было сказано, право записи в каталог позволяет создавать и удалять в нём файлы. В том числе чужие. Чтобы обеспечить комфорт работы с общими каталогами, например
/tmp
, и не позволять удаление чужих файлов, был придуман дополнительный «липкий» флаг (sticky
). Если каталог обладает им, то удаление файлов разрешается только тем, кто владеет файлом и имеет право записи в каталог (и root
-у, конечно).
Раз уж мы коснулись файловой системы, то стоит отметить ещё два флага –
suid
и sgid
. Если файл имеет флаг suid
, то при его запуске EUID процесса сменится на владельца файла. Для sgid
– аналогично, но для группы. Чаще всего он ставится на файлы, исполнение которых необходимо с правами суперпользователя, например passwd
. Для скриптов они не работают. Если флаг sgid
устанавливается на каталог, то созданные в нём файлы и каталоги автоматически наследуют группу. Флаг suid
на каталогах игнорируется.
Как уже упоминалось выше, посмотреть права можно командой
ls
. В строке прав первым символом показывается тип файла ('-
' = файл, 'd
' = каталог, 'l
' = ссылка, 's
' = сокет и т. п.), далее три группы прав владельца, группы и остальных по три символа 'r/-
', 'w/-
' 'x/-
' для чтения, записи и исполнения соответственно ('-
' означает отсутствие прав). Флаг sticky
обозначается символом 't
' вместо 'x
' в группе «остальные». флаги suid/sgid – символом 's
' вместо 'x
' в группе «владелец» или «группа» соответственно. Если за этой строчкой идёт символ '+
', это значит, что на этот файл установлены acl (см. ниже).
Менять права на файл можно командой
chmod
. Сменить владельца файла – командой chown
, группу – chgrp
. Для того, чтобы сменить права на файл, команде chmod нужно указать новые в восьмеричном виде или в символьном. Последний вариант позволяет добавить или удалить отдельные права для владельца, группы или остальных, например:
В символьном виде для
chmod
указывается один или более символов 'u/g/o/a
' (владелец, группа, остальные, все три группы вместе), затем символ '+
' или '-
' для установки или сброса прав, и затем один или более символов 'r/w/x
' – какие права затрагиваются. Например, chmod go+rx myfile
добавит права на чтение и исполнение для группы и остальных файлу myfile
.
Описанная выше система покрывает множество потребностей, но не все. В попытках улучшить её были созданы различные расширения, реализованные в файловых системах Linux. Одно из них – расширенные атрибуты файлов. Они включены по умолчанию, и их можно смотреть и изменять командами
lsattr
и chattr
. Самые важные для нас:
Таблица 4: некоторые расширенные атрибуты
Если расширенный атрибут запрещает какое-то действие (например удаление), то это распространяется даже на суперпользователя (в отличие от обычных атрибутов). Но суперпользователь может легко снять или установить любой из них.
Другое расширение, как правило требующее активации на файловой системе, – ACL (Access Control List), списки контроля доступа. Посмотреть и изменить их можно командами
getfacl
и setfacl
. Они работают аналогично традиционным правам доступа, рассмотренным выше, однако права на чтение/запись/исполнение теперь можно устанавливать отдельным пользователям и/или группам, а также ограничивать эти права маской. Маска – набор «максимальных» прав из правил acl (традиционные к ним не относятся), которые будут работать. Например, разрешим пользователю vasya
чтение файла и запись в файл test.txt
:
Здесь ключ '
-m
' указывает модифицировать правила acl. Указав ключ '--set
', можно заменить правила, т. е. удалить старые и заменить новыми (в setfacl
можно указать несколько правил одновременно). Ключом '-x
' правила можно удалять. Строка 'u:vasya;rw
' указывает на то, что правило относится к пользователю (u = user, g = group, o = others), его и<я vasya,
и устанавливаются права на чтение и запись. Теперь установим маску – разрешим пользователю vasya
(и другим, имеющим доступ через правила acl) «не более чем» чтение:
Как видим, правило осталось, но права на запись ограничены маской.
Ещё одно полезное свойство acl – наследование правил. На каталог можно установить acl «по умолчанию», они могут не совпадать с acl на сам каталог, и они будут автоматически применяться ко всем создаваемым файлам и каталогам.
Советуем подробнее прочесть о правах в Linux и опциях вышеупомянутых команд, тут мы их коснулись совсем немного.
Выше мы уже не раз использовали термины «сервис», «демон», «служба». Все они обозначают одно и то же: процесс или группу процессов, которые работают постоянно или автоматически запускаются по запросу. Их задача – обслуживать определённые запросы от пользователей, других процессов, других компьютеров в сети. Например, web-сервер
apache
– сервис, обслуживающий запросы по http-протоколу. SMTP-сервер отвечает за запросы на передачу почтовых сообщений и т. д. Рассмотрим сервисы, часто используемые в суперкомпьютерах. О некоторых из них мы уже говорили выше и здесь только перечислим их.
Некоторые сервисы запускаются через «супердемон»
inetd
или более новую его реализацию – xinetd
. В этом случае в конфигурационном файле inetd/xinetd
описываются необходимые сервисы: команда запуска, на каком порту слушать, от имени какого пользователя запускать и т. п. После запуска inetd/xinetd
начинает слушать на указанных портах и при получении запроса запускает соответствующую команду, которой на стандартный поток ввода направляется установленное сетевое соединение. Такой принцип облегчает написание сервиса, а также позволяет более гибко настраивать политику доступа к нему. Например, xinetd
позволяет задать диапазон адресов, с которых разрешён доступ, максимальное число одновременных запросов к сервису и т. п.
Чтобы узнать, работает ли конкретный сервис, можно проверить, запущен ли соответствующий процесс (за исключением сервисов, запускаемых через
inetd/xinetd
), слушает ли какой-либо процесс нужный порт (если сервис привязан к порту) командой netstat -lpn
.
Основные (но не все) сервисы для кластера:
Таблица 5: некоторые стандартные сервисы и их порты
Более полный список можно найти в файле
/etc/services
– он содержит соответствие номера порта традиционно используемому сервису. Некоторые сервисы в нём не представлены ввиду не очень широкого распространения, и, конечно, ничто не мешает запустить какой-либо сервис на нестандартном порту, не забывайте об этом. Через супердемон inetd/xinetd
часто запускаются такие сервисы, как tftp, echo, ftp
.
В системе UNIX несколько тысяч команд, однако в обычной работе пользователю достаточно хорошо знать несколько десятков команд. В этом пособии мы кратко рассмотрим небольшой набор наиболее употребительных команд. В первую очередь потребуются команды для работы с каталогами и файлами. Как и ранее, в квадратных скобках будем указывать необязательные параметры.
Самая главная команда, которая вам потребуется, –
man
. Её имя происходит совсем не от английского «человек» (man), а от «руководство, учебник» (manual). Это – основной источник справочной информации по командам, пакетам и многому другому в UNIX и Linux. Вся информация в man
разделена по разделам, исторически им присвоены номера. Как правило, для получения справки по какой-то команде достаточно набрать man имя_команды
. Man найдёт первую страницу с заданным именем и отобразит её.
Таблица 6: разделы справки man
Так как в разных разделах могут быть страницы с одинаковыми именами, то иногда надо явно указать номер раздела. Например, по команде
man crontab
отобразится информация по команде crontab
из раздела 1. Чтобы показать справку по формату файла crontab
, надо набрать man 5 crontab
, отобразить список файлов, в которых упомянуто нужное слово – man -k слово
. И конечно, не забудьте выполнить man man
.
Кроме
man,
есть ещё команда info
, которая была призвана заменить man
, но, несмотря на массу новых возможностей, так и не стала популярной. Но многие аспекты стандартных программ и сервисов описаны в info
намного подробнее, чем в man
.
В именах файлов и каталогов можно использовать любые символы, кроме '/' и '
\0
'. Одним из самых распространённых средств работы для UNIX является оболочка – shell. В shell некоторые символы имеют специальное значение (которое можно отменить) – это облегчает работу с файлами. Ниже приведён список спецсимволов shell:
Таблица 7: спецсимволы shell
UNIX не запрещает использовать эти символы в именах файлов, но необходимо экранировать их специальное назначение символом '\' или заключать их в одинарные кавычки
'…'
.
Расширение файла – часть имени после последней точки; например, файл '
text.cc
' имеет расширение '.cc
'. Для большинства программ расширение не имеет принципиального значения, но его наличие облегчает понимание назначения файла. Ниже – наиболее часто встречающиеся расширения:
Таблица 8: распространённые расширения файлов
Важно понимать, что расширение файла не имеет принципиального значения для ОС и большинства программ. Поменяв расширение файла на '
.exe
' или '.sh
', вы не сделаете его исполняемым. А вот скрипт с именем 'do_it_now
' можно сделать исполняемым, выполнив 'chmod a+x do_it_now
'. Расширения всего лишь упрощают восприятие файлов, давая понять, что это.
Имена, начинающиеся с точки (.), часто присваиваются служебным файлам и каталогам. Эти файлы и каталоги обычно игнорируются программами и файловыми менеджерами по умолчанию. Например, команда
ls
не показывает их, если не указать ключ '-a'
.
Многие команды допускают в качестве аргумента использование списков имён файлов. Эти списки удобно формировать с помощью шаблонов shell. Рассмотрим их ниже.
Стандартная оболочка (shell) в UNIX – очень мощный инструмент и кроме запуска команд имеет массу возможностей, упрощающих работу в консоли. Самое простое средство – шаблоны имён файлов. Например, написав команду '
ls *.c
', мы получим список всех файлов с расширением '.c' в текущем каталоге.
Важно понимать, что '
*.c
' – не один аргумент, вместо него сам shell подставит нужный список. Если в каталоге только два файла – 1.c
и 2.с
, то будет выполнена команда 'ls 1.c 2.c
'. Если ни одного файла с подходящим под шаблон именем нет, то будет подставлен сам шаблон (т. е. будет выполнена команда 'ls *.c
').
Таблица 9: шаблоны в shell
Все шаблоны, кроме '
{}
', применяются к реальному списку файлов и выбирают из него только те, которые попадают под шаблон. С помощью скобок '{}
' можно конструировать более сложные шаблоны.
Например, '
ls *.{cxx,h,la}
' превратится в ls *.cxx *.h *.la
. Более интересный приём – 'cp config{,.bak}
', который превратится в cp config config.bak
. Второй файл не существует, он явно задан шаблоном.
Если задан шаблон символами '
*
', '?' или '[]
', но под него не попадает ни один файл, то команде будет передан сам шаблон. Например, если каталог пуст, а мы выполняем в нём команду 'ls *.abc
', то выполнится команда 'ls *.abc
', т. е. текст шаблона будет дан команде в качестве аргумента. Будьте осторожны со случайно или намеренно созданными файлами, начинающимися с тире, так как их имена после раскрытия шаблона могут быть восприняты командой как имя управляющего ключа команды!
Чтобы отменить действие спецсимвола, достаточно поставить перед ним обратную косую черту '\' или заключить весь аргумент в одинарные кавычки. Например, если мы хотим удалить файл с именем «
--rf *.?
», то можно использовать команду:
rm – –rf\ \*.\?
или
rm – '–rf *.?'
Обратите внимание на первый аргумент '
--
' – он нередко используется в командах Linux и обозначает «здесь закончились ключи, далее только имена файлов». В данном случае он не обязателен, но, к примеру, если потребуется удалить файл с именем '-f
', то команда 'rm -f
' не сработает, так как '-f
' – это ключ команды rm
. Сработает команда 'rm – -f
'.
pwd
– напечатать полное имя текущего каталога.
cd [ dirname ]
– перейти в указанный каталог (в домашний каталог, если dirname не задано); dirname здесь – имя каталога, которое может состоять из собственно имени и пути к нему. Путь может быть абсолютным, если он начинается с символа /, и относительным, если начинается с любого другого символа.
Примеры перемещения по дереву каталогов:
сd /export/home/user1
– переход в домашний каталог пользователя user1;
cd /
– переход в корневой каталог файловой системы;
cd prog/cc
– переход из текущего каталога в каталог cc, находящийся в каталоге prog;
cd ../gosha/bin
– возврат на шаг назад и переход в каталог bin пользователя gosha;
cd
– переход в свой домашний каталог.
Специальные имена каталогов:
. (точка) – текущий каталог;
.. (две точки) – родительский каталог по отношению к текущему.
В bash или zsh можно использовать спецсимволы, которые shell преобразует в имена каталогов:
~
(тильда) – домашний каталог;
~name
– домашний каталог пользователя name;
– (тире) – возврат в предыдущий каталог (опция встроенной команды cd).
mkdir [опции] имя_каталога …
– создать новые каталоги.
Опции:
-m mode
– задать права доступа;
-p
– создавать при необходимости родительские каталоги.
rmdir имя_каталога …
– удалить каталоги (каталоги должны быть пустыми).
ls [опции/имена]
– выводит содержимое каталога или атрибутов файлов.
имена
– это имена каталогов или файлов. Если имена не указаны, то выводится содержание текущего каталога.
Наиболее часто используются опции:
-a
– вывести все файлы (даже если имена начинаются с точки);
-l
– вывести подробную информацию о файлах и папках (права доступа, имя владельца и группы, размер в блоках по 512 байт, время последней модификации, имя файла или каталога);
-t
– имена файлов сортируются не по алфавиту, а по времени последнего изменения;
-R
– рекурсивно пройти по всем подкаталогам, выводя по ним информацию.
touch [опции] имя_файла
– создать файл, если он не существовал, или изменить время последнего изменения файла.
rm [опции] имя_файла … —
удаление файлов
опции
-i
– интерактивное удаление (с требованием подтверждения);
-f
– без выдачи сообщений;
-r
– рекурсивное удаление каталогов вместе с содержимым.
Примеры:
Для задания списка файлов можно использовать шаблоны, но пользоваться ими следует крайне осторожно. Команда
rm test*
удалит все файлы с именами, начинающимися на test
;
rm test *
(после test стоит пробел) удалит вообще все файлы в каталоге (кроме начинающихся на точку).
mv [опции] источник назначение
– перемещение файлов и каталогов.
Опции:
-i
– интерактивное перемещение (с требованием подтверждения);
-f
– без выдачи сообщений.
Команда mv выполняет множество функций в зависимости от типа аргументов.
1) Переименовывает файлы и каталоги, если оба аргумента являются либо файлами, либо каталогами:
mv file1 file2
– в рабочем каталоге файл file1
получит имя file2
;
mv dir1 dir2
– если dir2
не существовал в рабочем каталоге, то каталог dir1
получит имя dir2
; если dir2
существовал, то каталог dir1
будет перемещён в него.
2) Перемещает файл или каталог в другой каталог с тем же именем или другим:
mv file1 dir2
– перемещает file1
из рабочего каталога в каталог dir2
с тем же именем;
mv file1 dir2/file2
– перемещает file1
из рабочего каталога в каталог dir2
с именем file2.
Если источником является список файлов, а назначением – каталог, то можно использовать шаблоны:
mv file* ../dir2
– перемещает все файлы, имена которых начинаются со строки file
, в каталог одного уровня с рабочим.
Во всех операциях объекты, выступающие в качестве источника, исчезают: меняют имя или расположение.
cp [опции] источник назначение
– копирование файлов и каталогов.
Опции:
-i
– интерактивное копирование (с требованием подтверждения, если объект назначение уже существует );
-f
– без выдачи сообщений;
-r
– рекурсивное копирование каталогов вместе с содержимым;
-p
– копирование с сохранением атрибутов файлов (прав доступа, времени модификации).
Примеры:
cp file1 file2
– будет создана копия файла file1
в файле с именем file2
;
cp file1 dir2
– будет создана копия файла file1
в каталоге dir2
(т. е. с именем dir2/file1
);
cp -r dir1 dir2
– будет создана копия каталога dir1
в каталоге dir2
;
cp file1 file2 file3 /tmp
– копирует файлы с именами file1
, file2
, file3
в подкаталог tmp
корневого каталога. Это можно выполнить командой:
Команда
cat
объединяет файлы и выдаёт их на стандартный поток вывода. Если аргумент файл отсутствует, то команда cat
будет принимать входной поток из стандартного файла ввода (клавиатуры). Поскольку команда работает со стандартным файлом вывода (терминалом), то чаще всего она используется для просмотра на экране содержимого файла. Не рекомендуется выдавать на экран бинарные файлы.
cat ls.txt
– выводит содержимое файла с именем ls.txt
на терминал;
cat ls1.txt ls2.txt ls3.txt
– по очереди выводит на терминал содержимое файлов ls1.txt, ls2.txt, ls3.txt
;
cat ls1.txt ls2.txt ls3.txt > lsall.txt
– объединяет три файла в один. При этом старые файлы сохраняются. Если файл lsall.txt
уже существовал, то он затрётся новым содержимым. Можно дописать в конец файла, если использовать для перенаправления знак >>
(два знака «больше»).
Команду
cat
можно использовать для создания файла:
cat > ls.txt
– все набранное на клавиатуре будет записано в файл ls.txt
. Оборвать ввод можно сочетанием клавиш Ctrl-D
.
Команда
cat
выдаёт все содержимое на экран. Если файл большой, то на экране можно будет увидеть только последние строки.
Для просмотра текстовых файлов порциями можно напрямую использовать команды:
•
more file.txt
•
less file.txt
Команда
less
содержит большой набор внутренних команд для перемещения по файлу, поиска контекста и даже редактирования:
Таблица 10: некоторые клавиатурные команды less
tail [опции] файл —
просмотр конца файла. По умолчанию выдаётся 10 последних строк. С помощью опций можно начать просмотр с любой позиции.
Опции:
-n number
– сколько выдавать строк;
-r number
– отображение в обратном порядке;
-f
– непрерывная выдача файла по мере его заполнения.
Прерывание интерактивной выдачи комбинацией
Ctrl-С
.
grep [опции] строка [файл][файл]…
– поиск контекста «строка» в указанных файлах.
Опции:
-i
– поиск без учёта регистра;
-n
– отображать номера строк, содержащих контекст;
-v
– отображать строки, не содержащие контекста.
find [опции] каталог выражение
– рекурсивный поиск файлов в указанном каталоге по различным атрибутам, таким как имя, размер, время модификации, права доступа.
Выражения:
-name filename
– поиск файла с именем filename
. Возможно использование шаблонов, но тогда надо брать их в кавычки 'test*
' либо экранировать символы шаблона test\*
;
-size [+|-]number
– поиск файлов с заданным размером, превышающим его (+) или меньшим (−). Размер указывается в блоках по 512 байт;
-atime number
– поиск файлов, к которым происходил доступ number суток назад;
-mtime number
– поиск файлов, которые были модифицированы number суток назад;
-exec command \{\} \;
– выполнить команду command
над списком файлов, найденных командой find
. Здесь выражение «{}
» будет заменяться именем найденного файла, а ';' означает конец команды. Так как эти символы обрабатываются оболочкой, то их надо экранировать, например:
– рекурсивно удалить все core-файлы, начиная с текущего каталога.
Следует отметить, что многие действия из перечисленных выше и связанных с манипуляциями с каталогами и файлами можно выполнять с помощью специальной программы – файлового менеджера Midnight Commander. Он не требует графической оболочки, вызывается в терминальном окне командой:
С помощью этой программы можно перемещаться по дереву каталогов, просматривать содержимое каталогов и файлов, создавать каталоги (но не файлы), удалять, копировать, перемещать каталоги и файлы, вести поиск файлов. Для многих пользователей текстовый редактор Midnight Commander является очень хорошим выбором. Его можно вызвать отдельно командой
mcedit
.
Редактирование файлов – отдельная важная тема. Существует большое число редакторов, работающих как в текстовом, так и в графическом режимах. Нас как администраторов в первую очередь будет интересовать редактор, который может работать в самых сложных условиях – без графического интерфейса, возможно, по сети, когда функциональные клавиши недоступны или работают неверно. Таких редакторов существует несколько, например
gnu nano
. Но, на наш взгляд, самый гарантированно работающий вариант, который, ко всему прочему установлен на 99% Linux-систем, – это редактор vi
.
Его интерфейс на первый взгляд совсем не дружественен и не логичен, на деле же большинство его команд продуманы и удобны. Главное его преимущество – возможность работы практически в любых условиях и быстрое выполнение массовых операций (поиск, замена и т. п.). Он имеет два режима работы – командный и режим вставки. Изначально файл открывается в командном режиме. Для перемещения по тексту используйте клавиши курсора, если же они не работают, – клавиши '
h,j,k,l
' (посмотрите на клавиатуру и поймёте, почему такой странный набор). Клавиши w
и b
перемещают вперёд и назад на слово. И конечно, «главная» команда – выход с сохранением: ':wq
' или просто 'ZZ
' (заглавными буквами). Выйти без сохранения можно командой ':q!
'.
Полезные команды:
Таблица 11: некоторые клавиатурные команды vi
Режим вставки позволяет вписывать текст в нужную позицию. Выйти из него можно клавишей
. Перед любой командой можно набрать число, тогда команда будет повторена это число раз. Например, '10dd
' удалит 10 строк (и поместит их вместе в буфер, потом можно будет их вставить в другом месте командой 'p
'). Повтор команды вставки или замены повторит и ввод, например ввод 'cwNEW_WORD
' приведёт в замене слова после курсора на 'NEW_WORD
', а если потом переместить курсор на начало другого слова и нажать '.', то оно также будет заменено на 'NEW_WORD
'.
Из расширенных команд особенно удобна команда массовой замены '
s
'. Её синтаксис взят из команды sed
. Перед командой можно указать через запятую диапазон строк, на которые она будет действовать, при этом '.' обозначает текущую строку, $
– последнюю, а знак +
указывает на то, что номер дан относительно текущей строки.
Например, заменить адрес old-cluster на new-supercomputer в 10 строках после текущей включительно можно, набрав:
Очень непривычно, но очень эффективно. Обязательно почитайте учебник по
vi
и попробуйте использовать его для редактирования. Такие возможности, как быстрая замена слов и предложений, исправление переставленных местами букв, моментальная навигация, поддержка работы с файлами огромных объёмов делают его исключительно эффективным для редактирования файлов конфигурации, журналов и многих других.
Во всех Linux-дистрибутивах есть прекрасная (на наш взгляд) система – упаковка ПО в так называемые «пакеты». Самих вариантов систем пакетирования много, наиболее популярны rpm (RedHat, Fedora, CentOS, SuSE и другие), deb (Debian, Ubuntu, Mint и другие), ports (Arch Linux и производные), ebuild (Gentoo и производные), pkg (Slackware и производные). Все они предлагают хранение дерева всех файлов некоторого ПО, например web-сервера, или его части, например модуля шифрования, в одном файле (обычно это сжатый архив). Кроме файлов в пакете хранятся метаданные, такие как название пакета, описание и другие данные. Набор метаданных в разных пакетных системах разный, поэтому и возможности тоже разные.
Самые важные особенности метаданных пакетов на наш взгляд:
• зависимости – указание других пакетов, установка которых необходима или желательна. Вместо пакетов может указываться функция (например smtp-сервер), если из метаданных её можно получить;
• хэш-суммы файлов;
• указание, какие файлы являются конфигурационными.
С помощью зависимостей установка ПО становится намного проще, можно быстро выяснить, какие дополнительные пакеты необходимо установить. Часто вычисление и установку всех дополнительных пакетов берут на себя «пакетные менеджеры», такие как yum (RedHat), apt или aptitude (Debian), pacman (Arch Linux) и т. п.
В формате deb зависимости можно указывать гибко: от «необходимо» до «желательно» (обычно это документация и примеры) и «опционально», поэтому в интерактивном пакетном менеджере типа aptitude можно выбрать именно тот набор дополнительных пакетов, который нужен. В мире формата rpm нередко с пакетом автоматически устанавливается ещё десяток ненужного ПО, которое теоретически может с ним потребоваться…
Имея хэш-суммы всех файлов пакета, можно проверять целостность системы, не изменились ли какие-то важные файлы (конечно, только из тех, что входят в пакеты), в большинстве пакетных систем для этого есть отдельные команды.
Знание файлов конфигурации позволяет не затирать их при обновлении – новая версия копируется «рядом» с оригинальной, чтоб можно было проверить разницу. А в интерактивном режиме aptitude можно эту разницу сразу посмотреть и выбрать, какой вариант использовать, старый или из обновлённого пакета. Аналогично при удалении пакета, как правило, его файлы конфигурации остаются и при новой установке не затираются. Удалить пакет вместе с настройками обычно можно, указав дополнительный ключ при удалении. Информация об установленных на компьютере пакетах хранится в базе данных, если она повреждается, то восстановить её очень тяжело. Поэтому не рекомендуем удалять или ставить пакеты на файловой системе, занятой на 100%, это может привести к потере базы.
Сами файлы пакетов можно просто скачать или скопировать откуда-либо, но чаще всего используются так называемые репозитории – индексированные каталоги пакетов. На CD/DVD-диске с дистрибутивом ОС почти всё место занимает репозиторий пакетов, после установки он будет прописан в настройках. Кроме него почти наверняка будет указан основной сетевой репозиторий ОС (или несколько). Кроме основного репозитория могут потребоваться дополнительные или даже совсем сторонние. Например, в стандартном репозитории RedHat не так уж и много пакетов, очень часто приходится подключать проверенные сторонние, типа EPEL. Некоторые программные проекты создают собственные мини-репозитории только для своего ПО. Иногда имеет смысл создавать и собственные локальные репозитории, например для компьютеров без доступа в Интернет.
Самые важные варианты использования команды
yum
и полезные ключи:
Таблица 12: важные команды и ключи команды yum
Когда приходится работать с конкретным пакетом или rpm-файлом, то на помощь приходит команда
rpm
. Её важные ключи:
Таблица 13: некоторые ключи команды rpm
Поскольку вычислительные кластеры по своей сути являются сетевыми структурами, то важную роль для администраторов кластеров играют сетевые команды. Рассмотрим наиболее важные из них.
Команда
ping
– команда для проверки соединения между двумя компьютерами в сетях, построенных на базе стека протоколов TCP/IP. Команда отправляет на другой компьютер запросы Echo-Request по протоколу ICMP и принимает поступающие ответы. Засекая время между отправкой запроса и получением ответа, программа определяет задержку в передаче пакетов по маршруту и частоту потерь пакетов, позволяя оценить качество сетевого соединения между двумя узлами.
Синтаксис команды:
Пример:
Результат работы команды:
При запуске без специальной опции команда ping в UNIX-подобных системах работает неограниченно долго, посылая запросы указанному узлу. Каждый отправленный запрос имеет свой номер, по которому программа определяет, дошёл он до целевого компьютера или нет. В выводе команды номер запроса показывает поле
icmp_seq
, поле ttl
– Time To Live – определяет время жизни ответного пакета, заданное в числе узлов. Ровно столько узлов пакет может пройти, передаваясь по маршруту до узла назначения.
Каждый узел, через который проходит пакет, уменьшает величину
ttl
на единицу; если значение счётчика станет равным нулю, то пакет будет уничтожен как «заблудившийся» и не будет отправлен дальше по маршруту. Последнее поле показывает время обмена сообщениями между двумя узлами. Оборвать работу команды ping
можно с терминала, нажав комбинацию клавиш Ctrl-C, после чего команда ping
выведет статистику работы: сколько пакетов было отправлено, сколько получено, процент потерянных пакетов, общее время работы в миллисекундах. Кроме того, выводится минимальное, среднее и максимальное время прохождения пакетов.
Основные опции команды
ping
:
-c count
ограничивает число посылаемых пакетов значением count;
-n
отменяет преобразование IP-адреса отвечающего узла в его DNS-имя. Такой режим может ускорить работу программы и исключить проблемы с настройками DNS при диагностике сети;
-i interval
задаёт время ожидания перед посылкой следующего пакета;
-l size
задаёт размер пакета.
Эта команда может служить в том числе для тестирования сети InfiniBand, если на интерфейсах InfiniBand поднят протокол IPoIB (IP over InfiniBand). Если вы поняли, что удалённый узел или сеть недоступны, можно выяснить, где происходит обрыв связи. Для этого используется команда
traceroute
или её более современный аналог tracepath
. В качестве аргумента команда принимает адрес узла.
Она посылает пакеты
ping
на этот узел со значением ttl, равным 1, затем 2 и т. д. В выдаче программы видно, какие узлы по пути следования пакета обработали факт обнуления ttl и сообщили об этом. Таким образом, мы можем отследить путь пакета.
Пример работы команды
traceroute
:
Видно, что 10-й по счёту узел не ответил; это значит, что он просто игнорирует пакет, не уведомляя об этом отсылающего.
Полезные опции команды
traceroute
:
-n
не преобразовывать DNS-имена узлов,
-f N
начать с TTL с указанным номером,
-m N
ограничить TTL указанным числом (по умолчанию 30),
-w N
время ожидания отклика (по умолчанию 5 сек.).
Команда
route
показывает текущую таблицу маршрутизации, т. е. правила, по которым узел определяет, куда послать пакет. Типичный вывод команды:
Значения столбцов:
•
Destination
– адрес назначения пакета;
•
Gateway
– адрес хоста(роутера), куда будет направлен пакет;
•
Genmask
– маска адреса(destination);
•
Flags, Metric, Ref, Use
– служебная информация;
•
Iface
– имя интерфейса, куда будет передан пакет.
Если необходимо передать пакет по сети на адрес x.y.z.q, ядро последовательно проверит этот адрес по таблице: на адрес и на поле
destination
будет наложена маска (genmask
), и если результаты совпадут, то пакет будет пересылаться на роутер (gateway
) через сетевой интерфейс (interface
). Наложение маски производится битовой операцией AND, т. е. все биты, установленные в маске в 0, будут в результате сброшены в 0, а биты, установленные в маске в 1, будут в результате такими же, как и у исходного адреса.
Отсюда, в частности, следует, что маска
0.0.0.0
задаёт маршрут, который сработает всегда, так как результат её применения всегда будет 0.0.0.0
. Такой маршрут часто называют default
(по умолчанию). В нашем примере сеть 9.10.11.*
доступна через eth1
, сеть 10.*.*.*
– через интерфейс eth0
(это внутренняя сеть), а все остальные пакеты направляются на роутер 9.10.11.1
, который доступен через интерфейс eth1
.
Командой
route
можно также добавлять и удалять маршруты. Для добавления маршрута к сети используйте:
Здесь мы добавляем маршрут для сети 1.2.3.* на интерфейсе eth0:
Эта команда – сокращённый вариант команды
Интерфейс определяется автоматически, если роутер (gw) доступен через другие правила. Если заменить в предыдущих командах '
add
' на 'del
', получим команду удаления маршрута. Обратите внимание, что при удалении надо также указать все параметры: netmask, gw, dev
и т. п., даже если они очевидны, иначе команда может не отработать.
Команда
ifconfig
управляет работой сетевого интерфейса. Без аргументов она показывает состояние активных интерфейсов:
Тут мы видим MAC-адреса карт (HWaddr), IP-адреса интерфейсов (inet addr), широковещательный адрес сети и маску сети (Bcast, Mask), а также статистику:
RX/TX packets
– передано/принято пакетов;
RX/TX bytes
– передано/принято байт;
UP BROADCAST RUNNING MULTICAST
– состояние карты;
MTU
– размер фрейма Ethernet;
txqueuelen
– лимит очереди пакетов;
errors
– число ошибок;
dropped
– число сброшенных пакетов;
overruns
– число переполнений буфера;
frame
– число ошибок при принятии фрейма;
carrier
– число потери связи;
collisions
– число коллизий при передаче.
Чтобы посмотреть данные о всех, а не только о работающих интерфейсах, запустите
ifconfig
с ключом -a
. С правами root командой ifconfig
можно управлять параметрами интерфейсов. Быстро отключить интерфейс eth0
можно командой ifconfig eth0 down
, включить обратно – ifconfig eth0 up
. Пример быстрой настройки интерфейса и его адреса:
Эта команда задаст для интерфейса eth0 адрес
192.168.0.1
и маску 255.255.255.0
. После этого надо включить (поднять) интерфейс командой ifconfig eth0 up
. В большинстве реализаций команда ifconfig
автоматически создаёт правило маршрутизации.
В современном ядре Linux команды
route
и ifconfig
считаются устаревшими, и на смену им пришла команда ip
из пакета iproute2
. Настоятельно рекомендуем использовать новые команды, если вы всё ещё не применяете их.
Формат команды
ip
прост:
«Объектом» может быть одна из более чем десяти подсистем, здесь мы кратко рассмотрим только некоторые. «Команда» – действие, которое мы хотим выполнить. С помощью необязательных опций можно, например, ограничить действие команды только сетями ipv4 или запросить более подробный вывод.