КулЛиб - Классная библиотека! Скачать книги бесплатно 

Руководство по командам и shell-программированию в Linux [Денис Николаевич Колисниченко] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Денис Колисниченко

Санкт-Петербург
«БХВ-Петербург»
2011

УДК
ББК

681.3.068
32.973.26-018.1
К60

Колисниченко Д. Н.
К60

Руководство по командам и shell-программированию в Linux. — СПб.:
БХВ-Петербург, 2011. — 288 с.: ил. — (БЛЦ)
ISBN 978-5-9775-0619-9
Рассмотрены команды Linux, основы работы в командной строке, а также настройка системы с помощью программ, обладающих только текстовым интерфейсом. Работа с системой
выполняется только в режиме консоли, что требует определенной квалификации пользователя.
Подробно описаны наиболее полезные команды Linux, особенности файловой системы Linux,
системы инициализации, загрузчики GRUB и GRUB2. С позиции пользователя оценены интерактивные возможности оболочки zsh. Даны практические примеры разработки сценариев на
языках оболочек bash и tcsh. Рассмотрено управление пакетами для наиболее актуальных на
данный момент дистрибутивов. Для энтузиастов Linux написана отдельная глава о разработке
собственного дистрибутива Linux и создании загрузочного LiveCD.
Для системных администраторов, программистов
и квалифицированных пользователей Linux

УДК 681.3.068
ББК 32.973.26-018.1

Группа подготовки издания:
Главный редактор
Зам. главного редактора
Зав. редакцией
Редактор
Компьютерная верстка
Корректор
Дизайн серии
Оформление обложки
Зав. производством

Екатерина Кондукова
Евгений Рыбаков
Григорий Добин
Владимир Красовский
Натальи Караваевой
Виктория Пиотровская
Инны Тачиной
Елены Беляевой
Николай Тверских

Лицензия ИД № 02429 от 24.07.00. Подписано в печать 26.08.10.
Формат 70 1001/16. Печать офсетная. Усл. печ. л. 23,22.
Тираж 2000 экз. Заказ №
"БХВ-Петербург", 190005, Санкт-Петербург, Измайловский пр., 29.
Санитарно-эпидемиологическое заключение на продукцию
№ 77.99.60.953.Д.005770.05.09 от 26.05.2009 г. выдано Федеральной службой
по надзору в сфере защиты прав потребителей и благополучия человека.
Отпечатано с готовых диапозитивов
в ГУП "Типография "Наука"
199034, Санкт-Петербург, 9 линия, 12.

ISBN 978-5-9775-0619-9

© Колисниченко Д. Н., 2010
© Оформление, издательство "БХВ-Петербург", 2010

Оглавление
Введение ............................................................................................................................ 1
ЧАСТЬ I. Командная строка ........................................................................................ 5
Глава 1. Введение в командную строку...................................................................... 7
1.1. Вход в систему ........................................................................................................... 7
1.2. Команды poweroff, halt, reboot, shutdown .............................................................. 10
1.3. Как работать в консоли ........................................................................................... 10
1.4. Графические терминалы.......................................................................................... 11
Глава 2. Командные интерпретаторы ...................................................................... 13
2.1. Файл /etc/shells ......................................................................................................... 13
2.2. Оболочка sh .............................................................................................................. 14
2.3. Оболочка csh............................................................................................................. 14
2.4. Оболочка ksh............................................................................................................. 15
2.5. Оболочка bash .......................................................................................................... 15
2.6. Оболочка zsh ............................................................................................................. 16
2.7. Оболочка tcsh ........................................................................................................... 17
2.8. Оболочка ash ............................................................................................................ 17
2.9. Выбор оболочки ....................................................................................................... 17
Глава 3. Базовые команды Linux............................................................................... 18
3.1. О командах Linux ..................................................................................................... 18
3.2. Команда arch: вывод архитектуры компьютера ................................................... 18
3.3. Команда banner: текстовый баннер........................................................................ 19
3.4. Команда chsh: изменение командного интерпретатора ....................................... 19
3.5. Команда cksum: вычисление контрольной суммы файла..................................... 19
3.6. Команда clear: очистка экрана................................................................................ 19
3.7. Команда date: вывод даты и времени..................................................................... 20
3.8. Команда echo: вывод сообщения ............................................................................ 21
3.9. Команда exit: выход из системы ............................................................................. 21
3.10. Команда env: установка переменных окружения ............................................... 21
3.11. Команды man и info: вывод справки .................................................................... 22

IV

Оглавление

3.12. Команда printenv: вывод значения переменной окружения .............................. 22
3.13. Команда reset: сброс терминала ........................................................................... 22
3.14. Команда sleep: пора спать ..................................................................................... 22
3.15. Команда startx — запуск графического интерфейса X.Org ............................... 23
3.16. Команда tee: перенаправление ввода ................................................................... 23
3.17. Команда true: успешное завершение ................................................................... 23
3.18. Команда yes: возвращает y .................................................................................... 23
Глава 4. Файловая система. Команды для работы с файловой системой ......... 24
4.1. Файловые системы, поддерживаемые Linux .......................................................... 24
4.1.1. Выбор файловой системы................................................................................. 25
4.1.2. Linux и файловые системы Windows............................................................... 26
4.1.3. Сменные носители............................................................................................. 27
4.2. Особенности файловой системы Linux .................................................................. 27
4.2.1. Имена файлов в Linux ....................................................................................... 27
4.2.2. Файлы и устройства .......................................................................................... 27
4.2.3. Корневая файловая система и монтирование ................................................. 28
4.2.4. Стандартные каталоги Linux ............................................................................ 29
4.3. Команды для работы с файлами и каталогами ..................................................... 30
4.3.1. Работа с файлами ............................................................................................... 30
4.3.2. Работа с каталогами .......................................................................................... 33
4.4. Команда ln: создание ссылок .................................................................................. 35
4.5. Команды chown, chmod и chattr .............................................................................. 35
4.5.1. Команда chmod: права доступа к файлам и каталогам .................................. 35
4.5.2. Команда chown: смена владельца файла ......................................................... 37
4.5.3. Специальные права доступа (SUID и SGID) ................................................... 38
4.5.4. Команда chattr: атрибуты файла, запрет изменения файла........................... 38
4.6. Монтирование файловых систем ........................................................................... 39
4.6.1. Команды mount и umount .................................................................................. 39
4.6.2. Файлы устройств и монтирование ................................................................... 39
Жесткие диски.......................................................................................................... 40
Приводы оптических дисков .................................................................................. 41
Дискеты и USB-накопители.................................................................................... 42
4.6.3. Опции монтирования файловых систем ......................................................... 42
4.6.4. Монтирование разделов при загрузке ............................................................. 43
4.6.5. Подробно о UUID и файле /etc/fstab ................................................................ 45
4.6.6. Монтирование Flash-дисков ............................................................................. 48
4.7. Настройка журнала файловой системы ext3 ......................................................... 49
4.8. Файловая система ext4............................................................................................. 49
4.8.1. Сравнение ext3 и ext4 ........................................................................................ 50
4.8.2. Совместимость с ext3 ........................................................................................ 51
4.8.3. Переход на ext4 .................................................................................................. 51
4.9. Особые команды ...................................................................................................... 52
4.9.1. Команда mkfs: создание файловой системы ................................................... 52

Оглавление

V

4.9.2. Команда fsck: проверка и восстановление файловой системы ..................... 52
4.9.3. Команда chroot: смена корневой файловой системы..................................... 53
4.9.4. Установка скорости CD/DVD .......................................................................... 53
4.9.5. Монтирование каталога к каталогу ................................................................. 54
4.9.6. Команды поиска файлов ................................................................................... 54
Глава 5. Процессы ........................................................................................................ 56
5.1. Команды kill, killall, xkill и ps ................................................................................. 56
5.2. Программа top: кто больше всех расходует процессорное время ....................... 58
5.3. Команды nice и renice: изменение приоритета процесса ..................................... 60
5.4. Перенаправление ввода/вывода .............................................................................. 60
Глава 6. Запись CD/DVD из консоли......................................................................... 62
6.1. Команда dd: создание образа диска ....................................................................... 62
6.2. Команды cdrecord и dvdrecord: запись образа на болванку ................................ 63
6.3. Команды очистки перезаписываемых дисков ....................................................... 64
6.4. Команда mkisofs: создание ISO-образа .................................................................. 64
6.5. Преобразование образов дисков ............................................................................. 64
6.6. Создание и монтирование файлов с файловой системой..................................... 65
Глава 7. Команды для работы с текстом ................................................................. 66
7.1. Команда cmp: сравнение двух файлов ................................................................... 66
7.2. Команда column: разбивка текста на столбцы....................................................... 66
7.3. Команда comm: еще одна команда для сравнения файлов .................................. 67
7.4. Команда diff: сравнение файлов ............................................................................. 67
7.5. Команда diff3: сравнение трех файлов ................................................................... 68
7.6. Команда egrep: расширенный текстовый фильтр ................................................. 69
7.7. Команда expand: замена символов табуляции пробелами ................................... 70
7.8. Команда fmt............................................................................................................... 70
7.9. Команда fold ............................................................................................................. 70
7.10. Команда grep: текстовый фильтр ......................................................................... 71
7.11. Команды more и less: постраничный вывод ........................................................ 71
7.12. Команды head и tail: вывод начала и хвоста файла ............................................ 71
7.13. Команда look ........................................................................................................... 71
7.14. Команда sort: сортировка файлов......................................................................... 72
7.15. Команда split: разбиение файлов на несколько частей ...................................... 72
7.16. Команда unexpand: замена пробелов на символы табуляции ............................ 73
7.17. Команды vi, nano, ee, mcedit, pico: текстовые редакторы .................................. 73
7.18. Команда wc: подсчет слов в файле ....................................................................... 77
Глава 8. Команды для работы с сетью и Интернетом ........................................... 78
8.1. Команда ifconfig: управление сетевыми интерфейсами ....................................... 78
8.2. Команда route ........................................................................................................... 79

VI

Оглавление

8.3. Команда pppoeconf: настройка DSL-соединения .................................................. 80
8.4. Команда pppconfig: настройка модемного (PPP) соединения ............................. 84
8.5. Команда wvdial: настройка PPP-соединения ......................................................... 84
8.6. Текстовые браузеры ................................................................................................. 86
8.7. Команда ftp: FTP-клиент ......................................................................................... 87
8.8. Команда wget: загрузка файлов .............................................................................. 88
8.9. Команды для диагностики сети .............................................................................. 89
Глава 9. Команды системного администратора ..................................................... 94
9.1. Программы разметки диска .................................................................................... 94
9.1.1. Программа fdisk ................................................................................................. 94
9.1.2. Программа parted .............................................................................................. 97
9.2. Информация о системе и пользователях ............................................................. 101
9.2.1. Команда uptime: информация о работе системы .......................................... 101
9.2.2. Команда users: информация о пользователях ............................................... 101
9.2.3. Команды w, who, ftpwho и whoami: информация о пользователях ............. 101
9.3. Планировщик at ..................................................................................................... 102
9.3.1. Команда at: добавление задания .................................................................... 102
9.3.2. Команды atq и atrm: очередь заданий и удаление задания ......................... 102
9.4. Планировщик crond ............................................................................................... 103
9.5. Планировщик anacron ........................................................................................... 104
9.6. Команда date: вывод и установка даты и времени ............................................. 105
9.7. Команды free и df: информация о системных ресурсах ..................................... 105
9.8. Команда md5sum: вычисление контрольного кода MD5 ................................... 106
9.9. Команда ssh: удаленный вход в систему ............................................................. 106
9.10. Устройства и драйверы ....................................................................................... 108
ЧАСТЬ II. ОПЕРАЦИОННАЯ СИСТЕМА ........................................................... 111
Глава 10. Загрузчики Linux ...................................................................................... 113
10.1. Основные загрузчики........................................................................................... 113
10.2. Конфигурационные файлы GRUB и GRUB2 .................................................... 114
10.2.1. Конфигурационный файл GRUB ................................................................. 114
10.2.2. Конфигурационный файл GRUB2 ............................................................... 116
10.3. Команды установки загрузчиков ........................................................................ 120
10.4. Установка тайм-аута выбора операционной системы. Редактирование
параметров ядра Linux .................................................................................................. 120
10.5. Установка собственного фона загрузчика GRUB и GRUB2 ............................ 124
10.6. Постоянные имена и GRUB ................................................................................ 124
10.7. Восстановление загрузчика GRUB/GRUB2 ...................................................... 125
10.8. Две и более ОС Linux на одном компьютере .................................................... 126
10.9. Загрузка с ISO-образов ........................................................................................ 128
10.10. Установка пароля загрузчика GRUB2.............................................................. 128

Оглавление

VII

Глава 11. Системы инициализации Linux ............................................................. 130
11.1. Начальная загрузка Linux .................................................................................... 130
11.2. Система инициализации init ............................................................................... 131
11.2.1. Файл /etc/inittab .............................................................................................. 131
11.2.2. Команда init .................................................................................................... 132
11.2.3. Команда service .............................................................................................. 133
11.2.4. Редакторы уровней запуска .......................................................................... 133
11.3. Система инициализации upstart .......................................................................... 136
11.3.1. Как работает upstart ....................................................................................... 136
11.3.2. Конфигурационные файлы upstart ............................................................... 136
11.4. Система инициализации Slackware .................................................................... 137
Глава 12. Команды управления пользователями ................................................ 140
12.1. Многопользовательская система ........................................................................ 140
12.2. Пользователь root ................................................................................................. 141
12.2.1. Максимальные полномочия ......................................................................... 141
12.2.2. Как работать без root ..................................................................................... 141
Команда sudo .......................................................................................................... 142
Команда su .............................................................................................................. 142
Проблемы с sudo в Ubuntu и Kubuntu .................................................................. 143
Ввод серии команд sudo ........................................................................................ 144
12.2.3. Переход к традиционной учетной записи root ........................................... 144
Преимущества и недостатки sudo ........................................................................ 144
Традиционная учетная запись root в Ubuntu ....................................................... 145
Традиционная учетная запись root в Mandriva ................................................... 146
Вход в качестве root в Fedora................................................................................ 146
12.3. Создание, удаление и модификация пользователей стандартными
средствами ............................................................................................................ 147
12.3.1. Команды adduser и passwd ........................................................................... 147
12.3.2. Команда usermod ........................................................................................... 148
12.3.3. Команда userdel ............................................................................................. 149
12.3.4. Подробно о создании пользователей ........................................................... 149
12.4. Группы пользователей ......................................................................................... 151
12.5. Команды квотирования ....................................................................................... 151
Глава 13. Ядро ............................................................................................................. 154
13.1. Команда dmesg: вывод сообщений ядра ............................................................ 154
13.2. Параметры ядра .................................................................................................... 163
13.3. Компиляция ядра.................................................................................................. 165
13.3.1. Установка исходных кодов ядра .................................................................. 166
13.3.2. Команда make menuconfig: настройка ядра ................................................. 167
13.3.3. Команды компиляции ядра........................................................................... 170

VIII

Оглавление

ЧАСТЬ III. ПРОГРАММИРОВАНИЕ В LINUX .................................................. 175
Глава 14. Программирование на языке C. Утилиты для программиста ........ 177
14.1. Команда gcc: компилятор .................................................................................... 177
14.2. Команда make: сборка проекта ........................................................................... 179
14.3. Команды из пакета binutils .................................................................................. 180
14.4. Другие полезные команды .................................................................................. 181
14.5. Команда gdb: отладка программ......................................................................... 181
Глава 15. Командный интерпретатор bash ............................................................ 184
15.1. Настройка bash ..................................................................................................... 184
15.2. Автоматизация задач с помощью bash .............................................................. 186
15.3. Привет, мир! ......................................................................................................... 187
15.4. Использование переменных в собственных сценариях ................................... 187
15.5. Передача параметров сценарию ......................................................................... 188
15.6. Массивы и bash .................................................................................................... 189
15.7. Циклы .................................................................................................................... 189
15.8. Условные операторы ........................................................................................... 190
15.9. Функции ................................................................................................................ 192
15.10. Примеры сценариев ........................................................................................... 192
15.10.1. Сценарий мониторинга журнала................................................................ 192
15.10.2. Переименование файлов ............................................................................. 193
15.10.3. Преобразование систем счисления ............................................................ 194
Глава 16. Сценарии на tcsh ....................................................................................... 195
16.1. Использование tcsh .............................................................................................. 195
16.2. Конфигурационные файлы tcsh .......................................................................... 196
16.3. Создание сценариев на tcsh ................................................................................. 197
16.3.1. Переменные, массивы и выражения ............................................................ 197
16.3.2. Чтение ввода пользователя ........................................................................... 200
16.3.3. Переменные оболочки tcsh ......................................................................... 200
16.3.4. Управляющие структуры .............................................................................. 203
Условный оператор if ............................................................................................ 203
Условный оператор if..then..else ........................................................................... 204
Оператор foreach .................................................................................................... 205
Оператор while ....................................................................................................... 206
Оператор switch ...................................................................................................... 207
16.3.5. Встроенные команды tcsh ............................................................................. 207
Глава 17. Язык gawk .................................................................................................. 210
17.1. Введение в gawk ................................................................................................... 210
17.2. Основы языка ....................................................................................................... 210
17.2.1. Образцы и действия ...................................................................................... 210

Оглавление

IX

17.2.2. Операторы ...................................................................................................... 211
17.2.3. Переменные ................................................................................................... 212
17.2.4. Ассоциативные массивы............................................................................... 212
17.2.5. Функции ......................................................................................................... 212
17.2.6. Вывод с помощью printf ............................................................................... 213
17.2.7. Управляющие структуры .............................................................................. 214
Условный оператор if..else .................................................................................... 214
Цикл while ............................................................................................................... 214
Цикл for ................................................................................................................... 215
17.3. Примеры................................................................................................................ 215
Глава 18. Собственный сервер для PHP-программиста ..................................... 218
18.1. Зачем нужен сервер PHP-программисту? .......................................................... 218
18.2. Web-сервер............................................................................................................ 218
18.2.1. Установка Apache и PHP .............................................................................. 218
18.2.2. Тестирование настроек Web-сервера .......................................................... 219
18.2.3. Конфигурационные файлы сервера. Команды запуска
и останова сервера ......................................................................................... 221
18.3. Сервер баз данных MySQL ................................................................................. 221
18.3.1. Установка сервера ......................................................................................... 221
18.3.2. Команды управления пользователями MySQL-сервера ............................ 222
18.3.3. Команды запуска и останова сервера .......................................................... 223
18.3.4. Программа MySQL Administrator ................................................................ 223
18.4. Быстрая настройка FTP-сервера ......................................................................... 225
ЧАСТЬ IV. УПРАВЛЕНИЕ ПАКЕТАМИ ............................................................. 229
Глава 19. Введение в пакеты. Программы rpm и dpkg ........................................ 231
19.1. Что такое пакет..................................................................................................... 231
19.2. Репозитарии пакетов ............................................................................................ 233
19.3. Программы для управления пакетами ............................................................... 234
19.4. Программа rpm (все Red Hat-совместимые дистрибутивы)............................. 235
19.5. Программа rpmbuild: простая сборка пакетов исходного кода ....................... 236
19.6. Программа dpkg: управление DEB-пакетами .................................................... 236
19.7. Команда alien: установка RPM-пакетов............................................................. 238
Глава 20. Управление пакетами в Debian/Ubuntu ............................................... 239
20.1. Программы для управления пакетами ............................................................... 239
20.2. Программа apt-get ................................................................................................ 239
20.2.1. Установка пакетов. Источники пакетов ...................................................... 239
20.2.2. Основные команды программы apt-get ....................................................... 240
Обновление источников ........................................................................................ 241
Удаление и переустановка пакетов ...................................................................... 241

X

Оглавление

Обновление пакета и системы .............................................................................. 242
Очистка кэша пакетов ........................................................................................... 242
Опции программы apt-get ..................................................................................... 242
Покдлючение репозитария Medibuntu в Ubuntu ................................................. 243
Корова в apt-get ...................................................................................................... 244
20.3. Программа aptitude .............................................................................................. 244
Глава 21. Управление пакетами в Fedora .............................................................. 245
21.1. Использование программы yum .......................................................................... 245
21.2. Управление источниками пакетов...................................................................... 247
21.3. Установка пакетов через прокси-сервер ............................................................ 249
21.4. Плагины для программы yum ............................................................................. 249
Глава 22. Управление пакетами в openSUSE. Менеджер пакетов zypper ........ 250
Глава 23. Управление пакетами в Slackware ........................................................ 254
23.1. Особенности Slackware........................................................................................ 254
23.2. Управление пакетами .......................................................................................... 255
23.2.1. Команда installpkg: установка пакетов ........................................................ 256
23.2.2. Команда removepkg: удаление пакетов ....................................................... 257
23.2.3. Команда upgradepkg: обновление пакетов.................................................. 258
23.3. Нет нужного пакета — вам поможет программа rpm2tgz ................................ 258
23.4. Программа slackpkg: установка пакетов из Интернета .................................... 258
Глава 24. Управление пакетами в Mandriva ......................................................... 260
24.1. Команда urpmi: установка пакетов ..................................................................... 260
24.2. Команда urpme: удаление пакетов ..................................................................... 265
24.3. Поиск пакета. Получение информации о пакете .............................................. 265
Заключение .................................................................................................................. 266
Приложение. Создание дистрибутива ..................................................................... 267
П1.1. Зачем нужно создавать еще один дистрибутив ................................................ 267
П1.2. Инструменты для создания дистрибутива ........................................................ 268
П1.3. Этапы создания дистрибутива ........................................................................... 269
П1.4. Процесс создания дистрибутива ........................................................................ 269
П1.5. Развитие дистрибутива ....................................................................................... 272
П1.6. Быстрое создание LiveUSB ................................................................................ 273
Предметный указатель .............................................................................................. 274

Введение

Linux — особенная операционная система, и сейчас мы поговорим о ее особенностях. Начнем с залога популярности Linux — лицензии GPL, по которой и распространяется эта операционная система. Согласно GPL, Linux распространяется
абсолютно свободно. Заметьте, я не сказал "бесплатно". Многие думают, что
Linux — это бесплатная операционная система. Отчасти это так. Но главное то, что
она свободная, т. е. всем желающим доступен исходный код ядра (как и любых
других Linux-программ) и вы можете распространять без всяких ограничений как
любой дистрибутив Linux, так и исходные коды программ. Вы можете установить
Linux на любое количество компьютеров и даже создать свой дистрибутив Linux
и распространять его под другим названием — главное, чтобы он распространялся
под лицензией GPL.
Сравните это с лицензией на Windows, где вы имеете право установить приобретенный дистрибутив только на несколько компьютеров (количество указывается
в лицензии) и где вы не можете распространять дистрибутив. А в мире Linux никаких ограничений нет. Скачали дистрибутив (необязательно даже покупать его
в магазине), установили на любое количество компьютеров (пока "болванка" не
испортится), затем передали диск друзьям (желательно, пока он не испортился) —
пусть они его распространяют дальше. А фанаты Linux могут даже создавать собственные дистрибутивы — как с нуля, так и на базе одного из существующих дистрибутивов (что намного проще). Кстати, в приложении этой книги мы как раз и поговорим о создании собственного дистрибутива.
Теперь, думаю, вам стало ясно, почему Linux настолько популярна. Но свободное распространение — это далеко не все. Судите сами: если операционная система бесплатная, но не соответствует требованиям пользователей, то ее установят,
попробуют поработать и на следующий день деинсталлируют.
С технической точки зрения можно выделить следующие особенности Linux.
 Реальная многозадачность — Linux, как и ее родственник UNIX, использует
режим разделения времени центрального процессора (time-sharing system). Работает это так: планировщик выделяет каждому процессу фиксированный интервал для выполнения. По окончанию выделенного времени планировщик приостанавливает выполнение процесса и передает управление другому процессу.

2













Введение

А другие операционные системы используют режим вытесняющей многозадачности, когда процесс сам должен уступить место "под солнцем", т. е. сам приостановить свое выполнение и передать право на выполнение другому процессу.
Все бы хорошо, но некоторые процессы могут "узурпировать" все процессорное
время, и якобы многозадачная операционная система превращается в… однозадачную со всеми вытекающими последствиями.
Многопользовательский доступ — Linux не только многозадачная, но и многопользовательская операционная система. Это означает, что в системе могут одновременно работать несколько пользователей. Как именно — это уже другой
вопрос. Один пользователь может находиться непосредственно за компьютером,
а остальные — подключены по сети. Но не забывайте, что Linux можно установить и на мейнфрейм — суперкомпьютер с несколькими терминалами. Правда,
такие компьютеры постепенно отходят, а их место занимают так называемые
тонкие клиенты, когда терминал подключен к компьютеру не физически, а по
сети. Но в любом случае, несмотря на способ соединения, Linux является многопользовательской системой.
Страничная организация памяти — память в Linux организована в виде страниц по 4 Кбайт каждая. Когда физическая оперативная память заканчивается,
включается механизм подкачки и неиспользуемые данные сбрасываются в область подкачки на жесткий диск. Правда, такой организацией памяти и механизмом подкачки сейчас никого не удивишь — все современные операционные
системы работают примерно так же.
Загрузка выполняемых модулей "по требованию" — чтобы ядро системы поддерживало определенное устройство или функцию (например, протокол), нужно
добавить программный код в состав ядра. Но ядро, поддерживающее все возможности и все устройства, будет просто огромным. В Linux эта проблема решается загрузкой модулей, которые добавляют поддержку определенных устройств. Например, вам нужна поддержка звуковой платы Creative — загрузите
модуль, реализующий поддержку этой платы. При этом в память загружаются
только те модули, которые необходимы для полноценной работы конкретной
системы, что позволяет оптимизировать использование ресурсов компьютера.
Совместное использование исполняемых программ — если несколько пользователей запустили одну и ту же программу, то в память загружается всего одна
копия этой программы, а не несколько, что позволяет экономить оперативную
память.
Общие библиотеки — библиотеки содержат наборы процедур, которые используются различными приложениями. Вместо того чтобы скомпилировать в один
исполнимый файл все процедуры, приложение использует библиотеку (которая
также может использоваться другими приложениями), что позволяет существенно экономить место на диске.
Поддержка различных файловых систем — Linux поддерживает много различных файловых систем, в том числе и файловые системы Windows. О поддержке
файловых систем мы поговорим в главе 4.

Введение

3

 Поддержка разных аппаратных платформ — Linux может работать не только

на платформах x86/x64. Поддерживаются аппаратные платформы ARM, DEC
Alpha, SUN Sparc, M68000 (Atari и Amiga), MIPS, PowerPC и др.
Мы перечислили далеко не все технические особенности Linux. Полный список
может занять еще несколько страниц, введение затянется и книга покажется вам
скучной. А этого нельзя допустить, поскольку данная книга — не просто справочник по командам ОС, а нечто большее — учебник по командной строке.
Технические особенности — это прекрасно, но чем же Linux хорош для обычного пользователя? Начнем с безопасности. Linux не страшны обычные вирусы, которые постоянно поражают Windows-компьютеры и которых насчитывается несколько сотен тысяч. Для Linux создано не более 1000 вирусов, да и то встретить
такой вирус — это что-то из области ненаучной фантастики. К тому же вирус может причинить ущерб системе, только если пользователь откровенно не соблюдает
правила безопасности, например всегда работает под учетной записью root.
Если раньше у Linux были проблемы с русским языком и наличием пользовательских приложений, то сейчас все иначе. С русским, как и с другими языками,
проблем нет, поскольку все современные дистрибутивы уже давно перешли на
UTF-8. А пользовательских приложений (работающих в графическом режиме) тоже достаточно — медиапроигрыватели, офисные пакеты, браузеры, почтовые клиенты — в общем все, что нужно обычному пользователю. К тому же для Linux разработаны эмуляторы (wine, cedega), позволяющие запускать Windows-игры.
Со временем Linux становится все проще и проще в использовании. Помню, как
устанавливал в 1999 году свой первый дистрибутив (Red Hat). Перечитал множество документации (документации по Red Hat не нашел, зато воспользовался руководством по установке Slackware, где была подробно описана программа fdisk —
в Red Hat того времени при установке как раз и вызывался fdisk) и только потом
приступил к установке. На все про все потратил весь рабочий день (это было первое знакомство с Linux), а настройку системы отложил на следующий день.
Но настроить за один день не получилось — то нужно было настроить монитор, то
русифицировать X Window, то устранить некоторые проблемы в GNOME, установить русские шрифты для принтера и т. д. Работы хватало. Чтобы получить полностью рабочую систему (учитывая, что Linux я видел в первый раз в жизни), мне
понадобилось около недели.
Сейчас все иначе. На установку системы в зависимости от дистрибутива и производительности компьютера уходит 15–40 минут. После этого в большинстве случаев вы получаете полностью рабочую систему. Вам останется только настроить
соединение с Интернетом и доустановить необходимые программы. Если вы знаете, что делаете, то все это займет еще час, пусть два. А если не знаете, максимум —
1 день. Установка программ тоже стала намного проще — вам больше не нужно
вручную бороться с зависимостями, нужно только указать менеджеру пакетов, какой пакет вам нужно установить, — все дополнительные пакеты будут установлены автоматически.
Конечно, есть частные случаи, когда не удается сразу заставить работать то
или иное устройство, например Wi-Fi-адаптер. Но это частные случаи. Помню,

4

Введение

в Windows тоже пытался 4 часа настроить звуковую плату, причем драйвер у меня
был...
В современных книгах по Linux все больше внимания уделяется графическим
программам и графическому интерфейсу. Это правильно — нужно соответствовать
времени, ведь Linux уже больше не воспринимается без графического интерфейса.
Но не нужно забывать, что изначально в Linux не было графического интерфейса. А была командная строка — вы вводили команду и получали результат выполнения (список файлов, список процессов, содержимое файла и т. д.). Даже когда
появился графический интерфейс, многие пользователи предпочитали работать
в командной строке. Сейчас все поменялось. Большинство пользователей работает
исключительно в графическом интерфейсе, а некоторые даже не знают о существовании командной строки! Современные пользователи Linux уподобились Windowsпользователям, которые могут работать только с графическим интерфейсом и не
знают ни одной команды операционной системы.
Эта книга посвящена командной строке Linux. В ней вообще не будут рассматриваться графические программы и графический интерфейс Linux. Только консоль,
команды и файлы конфигурации — ничего больше. Зачем это нужно? А затем, что
многие так называемые проблемы возникают от незнания и решаются вводом той
или иной команды. Не нужно воспринимать данную книгу как сухой и скучный
справочник по командам. Если вам нужен такой справочник, то вообще не нужно
тратиться на покупку книги — он у вас всегда под рукой — это команда man. Данная книга — это учебник по использованию команд Linux. В ней вы найдете описание синтаксиса команд, описание параметров и, конечно же, практические примеры. Чувствую, введение затянулось, поэтому самое время приступить к чтению
книги.

ЧАСТЬ I
Командная строка
Часть I полностью посвящена командной строке. Мы научимся правильно использовать командную строку, познакомимся с различными
командными интерпретаторами, а также рассмотрим множество полезных команд Linux.

Глава 1

Введение в командную строку
1.1. Вход в систему
Настоящий линуксоид должен уметь работать в консоли. Ведь когда система
Linux только появилась, существовала одна консоль, о графическом интерфейсе не
было и речи. Знаете, почему UNIX и Linux отталкивали обычных пользователей?
Потому что не было хорошего графического интерфейса. Раньше в Linux работали
одни профессионалы. Сейчас все изменилось — в Linux очень удобный графический интерфейс, который с удовольствием используют и профессионалы (дождались наконец-то!), забывая о командной строке. Наш дистрибутив вообще ориентирован на работу в графическом режиме, а в официальных руководствах, которые
можно найти в Интернете, о консоли вообще не упоминается. А ведь она есть!
В этой главе мы поговорим о том, как правильно работать в консоли. Совсем необязательно работать полностью в текстовом режиме, вы можете использовать материал данной главы для эффективной работы с Терминалом — эмулятором консоли.
Обычные пользователи в консоль ни ногой — даже принципиально, мол, зачем
возвращаться в DOS? Под "DOS" имелась в виду командная строка Linux. Да, ее
вид не очень дружелюбный, но это только кажется. Стоит вам поработать в консоли, и вы поймете все ее преимущества. Начнем с того, что командная строка Linux
намного удобнее командной строки DOS — об этом мы еще поговорим. В консоли
можно выполнять те же операции, что и в графическом режиме, причем все намного быстрее. Хотите бороздить просторы Интернета? Пожалуйста, но без картинок.
Не так красиво, но зато сэкономите трафик. А на обмен электронными сообщениями это никак не влияет. В консоли также можно работать и с документами, правда,
тоже о графике можно забыть. Консоль позволяет эффективно использовать ресурсы старых компьютеров. Да, в графическом режиме на стареньком "Пентиуме" не
поработаешь, зато в текстовом режиме его можно быстро превратить в очень полезный для всей сети компьютер — в шлюз, через который его более мощные собратья будут получать доступ к Интернету.
По умолчанию в современных дистрибутивах при входе в систему запускается
графический менеджер регистрации (рис. 1.1). Однако из всех правил могут быть
исключения. Пример тому дистрибутив Slackware — в нем сначала нужно выполнить вход в консоли (см. далее), а потом для запуска графического интерфейса ввести команду startx.

8

Часть I. Командная строка

Рис. 1.1. Графический вход в систему (Mandriva 2010)

Рис. 1.2. Выбор типа сеанса (Mandriva 2010)

Глава 1. Введение в командную строку

9

Для входа в систему вам нужно указать имя пользователя и пароль. После этого
загрузится KDE или GNOME (в зависимости от того, какая графическая среда установлена в вашем дистрибутиве по умолчанию). Конечно, может быть загружена
какая-то другая графическая среда, но обычно по умолчанию устанавливается KDE
или GNOME. Для выбора графической среды нужно нажать кнопку Тип сеанса
(или Сеанс — в Fedora и некоторых других дистрибутивах, а в некоторых дистрибутивах эта кнопка может быть представлена графической пиктограммой), как показано на рис. 1.2.
Сейчас вы находитесь в графическом режиме. Для того чтобы перейти из графического режима в консоль (рис. 1.3), нажмите клавиатурную комбинацию
++, где n — номер консоли (от 1 до 6). Чтобы перейти на первую
консоль, нужно нажать комбинацию клавиш ++, на вторую —
++ и т. д. Обратите внимание, что так можно перейти в консоль
только из графического режима. Если вы уже находитесь в консоли, то для переключения между консолями служат комбинации клавиш + ...
+, а также + — для перехода в графический режим. Для лучшего запоминания эти комбинации клавиш приведены в табл. 1.1.

Рис. 1.3. Регистрация в консоли (Slackware)

Таблица 1.1. Клавиши переключения между консолями и графическим режимом
Комбинация клавиш

Назначение

++ (n от 1 до 6)

Переключение из графического режима
в консоль с номером n

+ (n от 1 до 6)

Переключение между консолями

+

Переключение из консоли в графический режим

Часть I. Командная строка

10

1.2. Команды poweroff, halt, reboot, shutdown
Для выхода из консоли (чтобы ею никто не воспользовался во время вашего отсутствия) предусмотрена команда logout, она же команда exit.
Для перезагрузки компьютера существует команда reboot. Кроме нее вы можете использовать еще две команды — halt и poweroff:
 команда halt завершает работу системы, но не выключает питание. Вы увидите
сообщение System is halted, свидетельствующее о возможности выключения
питания. Эта команда предназначена для старых компьютеров, не поддерживающих расширенное управление питанием;
 команда poweroff завершает работу системы и выключает ее питание.
Самая "продвинутая" команда — shutdown — позволяет завершить работу и перезагрузить систему в назначенное время. Предположим, что вы хотите уйти пораньше, но компьютер нужно выключить ровно в 19:30 (вдруг некоторые пользователи задержались на работе, а вы выключите сервер, — некрасиво получится). Вот
тут-то вам и поможет команда shutdown:
# shutdown -h 19:30 [сообщение]

ПРИМЕЧАНИЕ
Здесь и далее решетка (#) означает, что команда должна быть выполнена от имени
пользователя root. Если перед командой ничего не указано или же указан символ
доллара ($), команду можно выполнить от имени обычного пользователя.

Сообщение [сообщение] можно и не указывать, все равно Windowsпользователи его не увидят.
Если нужно завершить работу системы прямо сейчас, вместо времени укажите now:
# shutdown -h now

Для перезагрузки системы есть опция –r:
# shutdown -r now

1.3. Как работать в консоли
Работа в консоли заключается во вводе нужной команды. Вы вводите команду
(например, создания каталога, просмотра файла, вызова редактора и т. д.) и нажимаете клавишу . Команда содержит как минимум имя запускаемой программы. Кроме имени программы команда может содержать параметры, которые
будут переданы программе, а также символы перенаправления ввода/вывода (об
этом чуть позже). Естественно, вам нужно знать имя программы, а также параметры, которые нужно ей передать. Если вы помните название программы, а назначение параметров забыли, вспомнить поможет команда man. Man (от англ. manual) —
это справочная система Linux. В ней есть информация о каждой программе, которая установлена в вашей системе. Как система знает все обо всех программах? Все
очень просто. Разработчики программ под Linux договорились, что вместе с программой будет поставляться специальный man-файл — файл справочной системы.

Глава 1. Введение в командную строку

11

Понятно, если разработчик не добросовестный, он может и не создать файл справочной системы, но это происходит очень редко. Чтобы получить справку по какой-нибудь программе, нужно ввести команду:
man имя_программы

Вы никак не можетезапомнить, как пишется та или иная команда? Если вы
помните хотя бы, на какую букву она начинается, то воспользуйтесь функцией автодополнения командной строки: введите первые буквы команды и нажмите клавишу . При первом нажатии система попытается дополнить команду, если
это возможно. Иногда дополнить команду невозможно. Например, вы ввели букву
a и нажали клавишу . Ясное дело, в системе есть несколько команд, которые
начинаются на букву "a". Тогда система не дополнит командную строку. Если
вы хотите просмотреть все командаы на букву "a", тогда нажмите еще раз клавишу .
ПРИМЕЧАНИЕ
Описанная здесь функция автодополнения работает в командной оболочке bash (которая используется по умолчанию). В следующей главе будут рассмотрены особенности и других оболочек.

Вам лень писать (даже с автодополнением) длинные команды? Тогда можно
создать псевдонимы команд. Для этого в файл .bash_profile добавьте строки вида:
alias псевдоним='команда'

Например:
alias cfg-net='system-config-network'

Для того чтобы изменения вступили в силу, выйдите из консоли (команда
и заново зарегистрируйтесь.
Пожалуй, для полноценной работы с консолью вам нужно знать еще одну команду — clear. Данная команда очищает консоль (терминал). Очень полезная команда, особенно когда вы хотите все начать с "чистого листа".
logout)

1.4. Графические терминалы
Понимаю, что большинство дистрибутивов оснащены графическим интерфейсом, который к тому же запускается по умолчанию. Поэтому большинство пользователей не будут жертвовать удобным и привычным интерфейсом ради консоли.
Вместо того чтобы переключиться в консоль, можно использовать терминалы — эмуляторы консоли. Терминал — это графическая программа (рис. 1.4),
в окне которой вы можете вводить команды и видеть результат их выполнения.
Запустить терминал можно через меню GNOME/KDE (Система | Стандартные |
Терминал или Система | Системные | Терминал — в зависимости от дистрибутива).

Часть I. Командная строка

12

Рис. 1.4. Терминал

Глава 2

Командные интерпретаторы
2.1. Файл /etc/shells
По умолчанию во всех современных дистрибутивах используется командный
интерпретатор bash. Основное предназначение bash, как и любой другой оболочки, — выполнение команд, введенных пользователем. Пользователь вводит команду, bash ищет программу, соответствующую команде, в каталогах, указанных в переменной окружения PATH. Если такая программа найдена, то bash запускает ее
и передает введенные пользователем параметры. В противном случае выводится
сообщение о невозможности выполнения команды.
Кроме bash существуют и другие оболочки — sh, csh, ksh, zsh и пр. Все командные оболочки, установленные в системе, прописаны в файле /etc/shells. Список оболочек может быть довольно длинным. В листинге 2.1 представлен файл
/etc/shells дистрибутива Fedora (установка по умолчанию).
Листинг 2.1. Файл /etc/shells дистрибутива Fedora
/bin/ash
/bin/bash
/bin/csh
/bin/false
/bin/ksh
/bin/sh
/bin/tcsh
/bin/true
/bin/zsh
/usr/bin/csh
/usr/bin/ksh
/usr/bin/bash
/usr/bin/tcsh
/usr/bin/zsh

С точки зрения пользователя указанные оболочки мало чем отличаются. Все они
позволяют выполнять введенные пользователем команды. Но оболочки используются

Часть I. Командная строка

14

не только для выполнения команд, а еще и для автоматизации задач с помощью
сценариев. Так вот, все эти оболочки отличаются синтаксисом языка описания сценариев.
ПРИМЕЧАНИЕ
В листинге 2.1 программы /bin/false и /bin/true не являются оболочками. Это "заглушки", которые можно использовать, если вы хотите отключить ту или иную учетную запись пользователя. При входе пользователя в систему запускается установленная
для него оболочка. Для каждого пользователя имеется возможность задать свою оболочку (изменить оболочку пользователь может самостоятельно командой chsh). Так
вот, если для пользователя задать оболочку /bin/false (или /bin/true), он не сможет
войти в систему. Точнее, он войдет в систему, но и сразу выйдет из нее, поскольку
обе "заглушки" ничего не делают, а просто возвращают значение 0 (для false) или 1
(для true). Сессия же пользователя длится до завершения работы его оболочки.

2.2. Оболочка sh
Самым первым командным интерпретатором (оболочкой) в операционной системе UNIX (да, именно UNIX, поскольку корни Linux уходят в далекие 70-е годы)
была sh (сокращение от shell). Данная оболочка до сих пор используется в современных версиях Linux (и FreeBSD).
Оболочка sh была разработана Стивеном Борном (Steve Bourne), поэтому ее
второе название — Bourne Shell. Изначально sh была разработана для операционной системы AT&T (разработка Bell Labs). Чуть позже sh была усовершенствована
и вошла в состав POSIX (Portable Operating System Interface for UNIX — Переносимый интерфейс операционных систем UNIX). Усовершенствованная версия sh до
сих пор устанавливается (но не используется по умолчанию) в современных версиях FreeBSD.
С точки зрения пользователя оболочка sh не очень удобна, поэтому пользователи предпочитают другие оболочки, например tcsh или bash.

2.3. Оболочка csh
Оболочка csh (C Shell) по умолчанию используется в FreeBSD. Разработка csh
началась еще в первых версиях BSD (Linux будет создан лет через 15). Тогда в институте Беркли начали создавать новую оболочку (csh), потому что не захотели
мириться с ограничениями sh.
Внутренний синтаксис csh очень напоминает язык программирования C, поэтому он должен был понравиться программистам (а в то время все пользователи компьютеров являлись программистами). Хотя сами программисты отмечали, что синтаксис не очень удобен, даже несмотря на то, что он похож на C.
По сравнению с sh, у csh есть множество преимуществ: она умеет управлять заданиями, хранит историю ранее введенных команд, а также у csh есть сценарии,
которые выполняются при входе пользователя (запуске оболочки) и при выходе

Глава 2. Командные интерпретаторы

15

пользователя (когда пользователь вводит команду exit). В то время у sh не было
таких сценариев, которые оказались очень удобными.
С точки зрения обычного использования оболочки (а не программирования) csh
тоже была на высоте.
В последних версиях FreeBSD и Linux вместо csh используется ее усовершенствованная версия tcsh, а файл /bin/csh — это просто ссылка на /bin/tcsh.

2.4. Оболочка ksh
Не хочется делать экскурс в историю UNIX, но пару слов сказать все же придется. Изначально система UNIX появилась в лабораториях компании AT&T, позже
появились версии UNIX института Беркли (операционная система называлась
BSD). Так уж сложилось исторически, что AT&T и институт Беркли постоянно
конкурировали между собой. Как только в Беркли разработали оболочку csh,
в AT&T принялись разрабатывать собственную оболочку, которая получила название ksh (Korn Shell) — по имени разработчика Дэвида Корна (David Korn).
Оболочка ksh по функциям похожа на csh: есть поддержка управления заданиями, история команд, позволяет назначать командам псевдонимы, а также создавать
конфигурационные файлы для подоболочек.
Несмотря на то что оболочка была разработана в 1986 году, она до сих пор используется в некоторых версиях UNIX по умолчанию, а также устанавливается по
умолчанию во всех дистрибутивах Linux (но не используется по умолчанию).
Правда, изначально ksh — это коммерческий продукт, поэтому в FreeBSD и Linux
используется не ksh, а ее бесплатная версия — pdksh, но для краткости исполнимый файл называется ksh.
Начинающим пользователям ksh не понравится (лучше использовать bash) —
она слишком неудобна в использовании, зато у нее довольно развитый синтаксис
внутреннего языка, что понравится программистам.

2.5. Оболочка bash
Командный интерпретатор bash (Bourne Again Shell) был разработан фондом
свободного программного обеспечения (Free Software Foundation, FSF). За основу
была взята оболочка sh. Оболочка стала очень популярной и сейчас используется
по умолчанию во всех дистрибутивах Linux.
Оболочка bash может использоваться также и для запуска сценариев sh, поэтому sh во многих системах уже не устанавливается, а файл /bin/sh — это ссылка на
/bin/bash.
С точки зрения пользователей bash намного удобнее, чем ksh. Вы можете легко
редактировать командную строку, просматривать историю команд, создавать псевдонимы команд, создавать переменные окружения и использовать их в собственных сценариях. Как и в csh, в bash есть сценарии, которые вызываются при запуске
оболочки и при выходе из нее.
Синтаксис bash довольно прост, поэтому бóльшая часть сценариев, разрабатываемых в Linux, пишется именно на bash.

Часть I. Командная строка

16

2.6. Оболочка zsh
Оболочки bash и tcsh (современная версия csh) будут рассмотрены в части III,
оболочка ksh используется редко. Поэтому сейчас мы поближе познакомимся
с оболочкой zsh, которая становится все более популярной.
До того как я не познакомился с zsh, я считал самой удобной оболочку bash.
Однако это не так.
Что же удобного в zsh? Во-первых, навигация. В bash для перехода в каталог
/dir/subdir1/subdir2 нужно ввести команду:
cd /dir/subdir1/subdir2

Можно использовать автодополнение bash — вводить начальные символы каталога и нажимать клавишу . Это будет выглядеть примерно так:
cd /dir/sub [Tab]/subdi [Tab]

В zsh можно ввести:
/d/s/s

Затем нажать клавишу — вы перейдете в нужный каталог. Например, для
перехода в /etc/sysconfig/network, нужно ввести /e/s/n и нажать клавишу .
Кстати, команда cd уже не нужна.
Покажу еще один трюк. Предположим, у нас есть каталог files, а в нем есть каталоги f1 и f2. Внутри каждого каталога f* есть каталоги source и last. То есть
структура каталогов будет примерно такой:
/files/f1/sources/last
/files/f2/sources/last
Пусть мы находимся в каталоге /files/f1/sources/last, для перехода в каталог
/files/f2/sources/last введите команду:
cd 1 2

Но одной лишь навигацией возможности zsh не ограничиваются. Можно, например, использовать вот такое перенаправление:
< /var/log/messages

Оболочка запустит программу, указанную в переменной $PAGER. В большинстве
случаев это аналогично команде:
cat /var/log/messages | less

Все возможности zsh в этой главе мы рассматривать не будем — их намного
больше, чем вам кажется. Если вы заинтересовались, то прочитайте следующие
страницы:
 http://opennet.ru/base/dev/zsh_intro.txt.html;
 http://citkit.ru/articles/1083/;
 http://alexott.net/ru/writings/zsh/index.html;
 http://habrahabr.ru/blogs/linux/82537/.

Глава 2. Командные интерпретаторы

17

2.7. Оболочка tcsh
Оболочка tcsh является модифицированной версией csh. Буква t в названии означает TENEX: изначально оболочка была разработана для операционной системы
TENEX (использовалась в далеком прошлом на компьютерах DEC PDP-10).
В tcsh усовершенствована фкнкция редактирования командной строки, есть автозавершение команд (как в bash). Кроме того, tcsh может распознавать потенциально опасные команды. Если вы от имени root попытаетесь удалить все файлы,
оболочка потребует подтверждения.
Оболочка tcsh очень удобна в использовании, но ее синтаксис сценариев сложнее, чем у bash. Однако в части III мы все же рассмотрим разработку сценариев на
tcsh, чтобы вы смогли оценить сложность создания разработки сценариев на bash
и на tcsh.

2.8. Оболочка ash
Almquist shell (ash) — самая простая командная оболочка. Это самая маленькая
оболочка, доступная для UNIX (у нее самые низкие требования к дисковому пространству).
У ash всего 24 встроенных команд и 10 опций командной строки. Обычно ash
используется при загрузке Linux в однопользовательском режиме (или в режиме
восстановления).
Оболочка ash совместима с sh, с ее помощью можно проверить сценарии на совместимость с традиционным синтаксисом sh. А в операционной системе NetBSD
оболочка ash используется вместо /bin/sh.

2.9. Выбор оболочки
Какую оболочку выбрать? Первым делом нужно оценить простоту использования оболочки. Ведь вы будете использовать эту оболочку каждый день, поэтому
простота использования должна быть на первом месте.
Затем нужно оценить простоту синтаксиса оболочки. Конечно, это только в том
случае, если вы планируете разрабатывать собственные сценарии. Также не нужно
забывать, что вы можете использовать одну оболочку, а разрабатывать сценарии —
на языке другой оболочки. Например, в повседневной работе вы можете использовать zsh, а разрабатывать сценарии на языке bash.
Довольно удобны в использовании оболочки bash, tcsh и zsh. Скорее всего, вы
выберете одну из них. А вот для программирования вы будете использовать или
bash, или tcsh (синтаксис zsh не очень понятен).

Глава 3

Базовые команды Linux
3.1. О командах Linux
Все команды Linux можно условно разделить на несколько групп:
 команды общего назначения — эти команды могут понадобиться в любой
момент как при работе в консоли, так и при написании собственных сценариев;
 команды для работы с файлами и каталогами — эти команды будут рассмотрены в главе 4 вместе с основами файловой системы Linux, без которых данные
команды не будут понятны читателю;
 команды обработки текста — будут рассмотрены в главе 7;
 команды для работы с сетью и Интернетом — выйти в Интернет в Linux можно даже без запуска графического интерфейса, что и будет показано в главе 8;
 команды системного администратора — любой системный администратор
просто обязан знать команды, представленные в главе 9.
Некоторые команды могут относиться к одной из групп, но в этой книге выделены в специальную главу, поскольку заслуживают отдельного разговора. Например, команды управления пользователями и группами выделены в главу 12. Можно
было бы просто упомянуть команды adduser и passwd в главе 9, но в главе 12 помимо рассмотрения формата важных конфигурационных файлов приводится описание множества дополнительных команд, так или иначе связанных с пользователями и группами пользователей.
В этой главе будут рассмотрены базовые команды Linux, т. е. команды общего
назначения.

3.2. Команда arch:
вывод архитектуры компьютера
Данная команда поможет узнать тип аппаратной платформы, например: i386,
i586, i686 и др.
Пример использования:
$ arch
i686

Глава 3. Базовые команды Linux

19

3.3. Команда banner: текстовый баннер
Команда banner выводит строку (максимальная длина — 10 символов), рисуя
буквы символом звездочки (*). Данную команду можно использовать в своих сценариях для вывода названия сценария. Пример использования:
$ banner Denix

3.4. Команда chsh:
изменение командного интерпретатора
Команда chsh позволяет изменить командный интерпретатор, вывести список
установленных интерпретаторов, а также установить командный интерпретатор по
умолчанию. Синтаксис вызова программы:
$ chsh [параметры] интерпретатор

В качестве параметров вы можете передать:
 -L — выводит список установленных командных интерпретаторов (список хранится в файле /etc/shells);
 -s — устанавливает командный интерпретатор по умолчанию.
Примеры использования команды:
$ chsh zsh
$ chsh -s zsh

Первая команда изменяет текущий интерпретатор команд на оболочку zsh. Как
только пользователь выйдет из системы и снова зайдет, будет запущен его интерпретатор по умолчанию (который установлен в файле /etc/passwd). Вторая команда устанавливает командный интерпретатор по умолчанию для текущего пользователя.

3.5. Команда cksum:
вычисление контрольной суммы файла
Команда cksum вычисляет контрольную сумму (CRC) указанных файлов. Формат
вызова:
$ cksum файлы

Пример:
$ cksum file1.txt file2.txt

3.6. Команда clear: очистка экрана
Команда clear очищает экран при работе в консоли (терминале).
Пример использования:
$ clear

Часть I. Командная строка

20

3.7. Команда date: вывод даты и времени
Команда date относится как к командам общего назначения, так и к командам
системного администратора. Обычные пользователи могут только просматривать
дату и время в заданном формате, а пользователь с правами root может еще и устанавливать дату и время. Об установке даты и времени мы поговорим в главе 9,
а сейчас разберемся с выводом даты и времени.
Команда date (без параметров) просто выводит текущую дату и время. Но вы
можете уточнить формат вывода даты и времени так:
$ date +формат

Строка формат может состоять из модификаторов, указанных в табл. 3.1.
Таблица 3.1. Модификаторы даты и времени
Модификатор

Описание

%%

Знак %

%a

Сокращенное название дня недели (например, Вск)

%A

Полное название дня недели (например, Вторник)

%b

Сокращенное название месяца (например, Мар)

%B

Местное полное название месяца (напр., Март)

%c

Дата и время (в формате, заданном в настройках системы)

%C

Век

%d

День месяца (с предшествующим нулем, например, 07)

%D

Дата (в формате %m/%d/%y)

%F

Полная дата (в формате %Y-%m-%d)

%g

Последние две цифры года, соответствующего номеру недели в году
согласно ISO 8601

%G

Год, соответствующий номеру недели в году согласно ISO 8601

%H

Час (00..23)

%I

Час (01..12)

%j

Номер дня в году

%k

Час ( 0..23)

%l

Час ( 1..12)

%m

Месяц (01..12)

%M

Минута (00..59)

%n

Вставляет разрыв строки

%r

12-часовое время (например, 12:12:07 PM)

%R

24-часовой формат часов и минут

Глава 3. Базовые команды Linux

21

Таблица 3.1 (окончание)
Модификатор

Описание

%s

Число секунд, прошедших с 1970-01-01 00:00:00 UTC (это так называемый timestamp)

%S

Секунда

%t

Вставляет символ табуляции

%T

Время (в формате %H:%M:%S)

%U

Номер недели в году (неделя начинается с воскресенья)

%V

Номер недели в году (неделя начинается с понедельника)

%w

День недели (0..6, где 0 — воскресенье)

%y

Последние две цифры года (00..99)

%Y

Год (все четыре цифры, например 2010)

%z

Часовой пояс в формате '+ччмм' (например, +0200)

%:z

Часовой пояс в формате '+чч:мм' (например, +02:00)

%Z

Алфавитное сокращение часового пояса (например, EST)

3.8. Команда echo: вывод сообщения
Команда echo выводит текстовую строку, указанную в качестве аргумента, например:
$ echo "Hello world!"
Hello world!

Обычно данная команда используется в сценариях командного интерпретатора
для вывода сообщений на экран.

3.9. Команда exit: выход из системы
Для завершения сеанса работы в системе (при условии, что вы работаете в консоли) нужно использовать команду exit. Если не завершить сеанс работы, кто
угодно сможет работать в системе под вашим именем (понятно, что во время вашего отсутствия за компьютером).

3.10. Команда env:
установка переменных окружения
Команда env используется для установки переменных окружения во время выполнения команды, например ее можно использовать для установки переменной

Часть I. Командная строка

22
EDITOR,

которая содержит команду текстового редактора по умолчанию. Формат
вызова команды:
$ env переменная=значение команда

Пример:
# env EDITOR=nano edquota -u user

3.11. Команды man и info: вывод справки
Команда man используется для получения справки о любой команде системы.
Например, команда man ls выведет справку об использовании команды ls, которая
выводит содержимое каталога. О том, как правильно использовать саму справочную систему, вам расскажет команда man man.
Команда info — это альтернативная справочная система. Если вы не нашли нужной информации с помощью команды man, попробуйте использовать команду info.

3.12. Команда printenv:
вывод значения переменной окружения
Команда env используется для установки значений переменной окружения,
а команда printenv позволяет просмотреть текущее значение переменной окружения, например:
$ printenv EDITOR

3.13. Команда reset: сброс терминала
Полезна при некоторых проблемах с терминалом (консолью). Команда reset
производит сброс терминала и его начальную инициализацию, что позволяет восстановить параметры по умолчанию без выхода и входа в систему. Нужно отметить, что данную команду вы будете выполнять очень редко.

3.14. Команда sleep: пора спать
Команда sleep приостанавливает дальнейшее выполнение команд на указанное
время. Данную команду полезно использовать в собственных сценариях, когда
нужно приостановить выполнение сценария, чтобы пользователь успел прочитать
сообщение. Когда мы будем разрабатывать собственные сценарии, мы будем часто
пользоваться этой командой.
Формат вызова:
$ sleep число

По умолчанию число — это количество секунд, если после числа указан суффикс m, h, d, то считается, что число — это количество минут, часов и дней соответственно.

Глава 3. Базовые команды Linux

23

3.15. Команда startx — запуск графического
интерфейса X.Org
Linux может запускаться на разных уровнях запуска. На пятом уровне запуска
графический интерфейс X.Org (бывшее название — X Window) запускается автоматически (если он вообще был установлен). На третьем же уровне запуск графического интерфейса не производится. Если он вам тем не менее нужен, то его можно запустить с помощью команды startx. Никаких параметров не требуется.

3.16. Команда tee: перенаправление ввода
Перенаправляет стандартный ввод в два файла. Если задан только один файл, то
в этот файл и на стандартный вывод. По умолчанию файлы, если существуют, перезаписываются. Чтобы файлы не были перезаписаны, указывается параметр -a.
Пример:
$ tee output.1 output.2

3.17. Команда true: успешное завершение
Данная команда ничего не делает, но всегда возвращает код возврата 0, что соответствует успешному завершению. Часто используется при написании сценариев.

3.18. Команда yes: возвращает y
Команда пригодится при написании сценариев. Она возвращает символ y (или
строку, переданную ей в качестве параметра) и символ новой строки — как будто
пользователь ввел y и нажал клавишу .
Пример использования этой команды:
# yes | apt-get install mc

Глава 4

Файловая система. Команды
для работы с файловой системой
4.1. Файловые системы, поддерживаемые Linux
Linux поддерживает много различных файловых систем. Начинающий пользователь просто теряется, когда видит такое многообразие выбора, — ведь в качестве
корневой файловой системы доступны: ext2, ext3, ext4, XFS, ReiserFS, JFS.
Ранее "родной" файловой системой Linux была ext2 (файловая система ext использовалась разве что в самых первых версиях Linux), затем ей на смену пришла журналируемая версия файловой системы — ext3. Сегодня все современные дистрибутивы
по умолчанию используют следующее поколение файловой системы — ext4. В этой
главе помимо всего прочего вы найдете сравнение последних версий файловых систем Linux — ext3 и ext4.
ПРИМЕЧАНИЕ
Linux до сих пор поддерживает файловую систему ext, но она считается устаревшей,
и рекомендуется воздержаться от ее использования.

Таким образом, в качестве корневой файловой системы и файловой системы
других Linux-разделов используются файловые системы ext3, ext4, XFS, ReiserFS,
JFS. Все перечисленные файловые системы (кроме ext2) ведут журналы своей работы, что позволяет восстановить данные в случае сбоя. Осуществляется это следующим образом — перед тем как выполнить операцию, журналируемая файловая
система записывает эту операцию в журнал, а после выполнения операции удаляет
запись из журнала. Представим, что после занесения операции в журнал произошел
сбой (например, выключили свет). Позже, когда сбой будет устранен, файловая
система по журналу выполнит все действия, которые в него занесены. Конечно,
и это не всегда позволяет уберечься от последствий сбоя — стопроцентной гарантии никто не дает, но все же такая схема работы лучше, чем вообще ничего.
Файловые системы ext2 и ext3 совместимы. По сути, ext3 — та же ext2, только
с журналом. Раздел ext3 могут читать программы (например, Total Commander
и Ext2Fsd в Windows), рассчитанные на ext2. В свою очередь, ext4 — это усовершенствованная версия ext3.
В современных дистрибутивах по умолчанию задана файловая система ext4 (хотя
в некоторых дистрибутивах все еще может использоваться ext3). При необходимости
можно выбрать другие файловые системы. Далее мы рассмотрим их особенности,

Глава 4. Файловая система. Команды для работы с файловой системой

25

чтобы понять, нужно ли их использовать или же остановить свой выбор на стандартной ext3/ext4.
 Файловая система XFS была разработана компанией Silicon Graphics в 2001 году. Основная особенность данной системы — высокая производительность
(до 7 Гбайт/с). XFS может работать с блоками размером от 512 байтов до 64 Кбайт.
Ясно, что если у вас много маленьких файлов, то в целях экономии места можно
установить самый маленький размер блока. А если вы работаете с файлами
большого размера (например, мультимедиа), то нужно выбрать самый большой размер блока — так файловая система обеспечит максимальную производительность (конечно, если "железо" позволяет). Учитывая высокую производительность этой файловой системы, ее нет смысла устанавливать на домашнем
компьютере, поскольку все ее преимущества будут сведены на нет. А вот если
вы будете работать с файлами очень большого размера, XFS проявит себя с лучшей стороны.
 Файловая система ReiserFS считается самой экономной, поскольку позволяет
хранить несколько файлов в одном блоке (другие файловые системы могут хранить в одном блоке только один файл или одну его часть). Например, если размер
блока равен 4 Кбайт, а файл занимает всего 512 байт (а таких файлов очень много
в разных каталогах), то 3,5 Кбайт просто не будут использоваться. А вот ReiserFS
позволяет задействовать буквально каждый байт вашего жесткого диска!
Но у этой файловой системы есть два больших недостатка: она неустойчива
к сбоям, и ее производительность сильно снижается при фрагментации. Поэтому, если вы выбираете данную файловую систему, покупайте UPS (источник
бесперебойного питания) и почаще дефрагментируйте жесткий диск.
 Файловая система JFS (разработка IBM) сначала появилась в операционной
системе AIX, а потом была модифицирована под Linux. Основные достоинства
этой файловой системы — надежность и высокая производительность (выше, чем
у XFS). Но у нее маленький размер блока (от 512 байтов до 4 Кбайт). Следовательно, она хороша на сервере баз данных, но не при работе с данными мультимедиа, поскольку блок в 4 Кбайт для работы, например, с видео в реальном времени будет маловат.
ПРИМЕЧАНИЕ
Особенности новой файловой системы ext4 будут рассмотрены в разд. 4.8.

4.1.1. Выбор файловой системы
Учитывая производительность рассматриваемых файловых систем, можно дать
следующие рекомендации:
 для рабочей станции и сервера общего назначения оптимальной файловой системой являются ext3/ext4 или ReiserFS (в крайнем случае);
 на сервере баз данных можно использовать JFS — в этом случае (особенно, если
база данных огромная) будет наблюдаться определенный прирост производительности;

26

Часть I. Командная строка

 файловая система XFS — это удел станции мультимедиа, на обычной рабочей

станции или обычном сервере ее использовать не следует.
Но производительность — это не единственный критерий выбора файловой системы, особенно для сервера. Да, производительность учитывать нужно, но кроме
того нельзя пренебрегать и следующими факторами:
 надежностью — все-таки мы выбираем файловую систему для сервера, а не
для домашнего компьютера;
 наличием программ для восстановления файловой системы в случае сбоя —
сбой может произойти даже в случае использования самой надежной файловой
системы, поэтому наличие программного комплекса для восстановления файловой системы не будет лишним;
 максимальным размером файла — сервер обрабатывает огромные объемы информации, поэтому данный критерий для нас также важен.
Файловые системы ext3/ext4, ReiserFS и XFS одинаково надежны, а вот надежность JFS иногда оставляет желать лучшего. Учитывая это, а также то, что программы для восстановления файловой системы имеются только для ext*, на сервере лучше использовать все-таки ext3/ext4.
Если вы уже интересовались характеристиками файловых систем, то могли
в некоторых источниках встретить неправильную информацию о максимальном
размере файла для файловой системы ext3. Так, иногда сообщается, что максимальный размер файла для ext3 равен 2 Гбайт, что делает ее непригодной для использования на сервере. Это не так. Раньше, во времена ext2 и ядер 2.2 и 2.4, действительно, существовало такое ограничение, но для ext2. Файловая система ext3
поддерживает файлы размером до 1 Тбайт, а максимальный размер тома (раздела)
равен 4 Тбайт, что вполне достаточно даже для сервера. Если же вам нужна поддержка больших объемов данных, то рекомендую обратить внимание на другие
файловые системы, например на ReiserFS (максимальный размер файла —
16 Тбайт) или на XFS/JFS (размер файла вообще исчисляется в петабайтах).

4.1.2. Linux и файловые системы Windows
Linux почти безо всяких ограничений поддерживает файловые системы FAT12
(DOS), FAT16 (или просто FAT, как в Windows 95) и FAT32 (Windows 98 и все последующие версии). Вы можете из Linux читать в файловых системах Windows
файлы и каталоги, изменять, создавать новые файлы и каталоги, удалять их —
в общем все, что можно делать в файловой системе непосредственно в Windows.
Однако файловые системы Windows не поддерживают установку прав доступа,
поэтому можно даже не пытаться установить в Linux права доступа к файлу, который находится на Windows-разделе — у вас ничего не получится.
О файловой системе NTFS — отдельный разговор. По умолчанию (без перекомпиляции ядра) Linux умеет только читать данные, расположенные в NTFS-разделе.
Однако даже после перекомпиляции ядра останется ряд ограничений на запись
в NTFS-раздел: например, вы не можете создавать новые файлы, а можете только

Глава 4. Файловая система. Команды для работы с файловой системой

27

редактировать уже имеющиеся. Кстати, поддержка NTFS современным ядром до
сих пор экспериментальна, т. е. в один не совсем прекрасный момент при попытке
записи вы можете потерять данные в вашем NTFS-разделе.
Я вас напугал? Существуют решения (мы их рассмотрим в этой книге), позволяющие снять бόльшую часть ограничений на запись в NTFS-разделы. Конечно,
все эти решения не идеальные: что-то работает, но ужасно медленно, что-то снимает далеко не все ограничения на запись, но тем не менее все же есть возможность
записывать данные в NTFS-раздел без потери данных.

4.1.3. Сменные носители
Linux превосходно работает со сменными CD/DVD- и USB-дисками, в большинстве случаев даже выполняется автоматическое монтирование и размонтирование
сменных носителей (хотя эта функция доступна не во всех дистрибутивах). С другой стороны, автоматическое монтирование сменных носителей на сервере — это
от лукавого, на домашнем компьютере — да, но не на сервере. О монтировании,
в том числе автоматическом, мы поговорим чуть позже в этой главе.

4.2. Особенности файловой системы Linux
4.2.1. Имена файлов в Linux
По сравнению с Windows в Linux несколько другие правила построения имен
файлов, вам придется с этим смириться. Начнем с того, что в Linux нет такого понятия, как расширение имени файла. В Windows, например, для файла Document1.doc именем файла является фрагмент Document1, а doc — это расширение.
В Linux Document1.doc — это имя файла, никакого расширения нет.
Максимальная длина имени файла — 254 символа. Имя может содержать любые
символы (в том числе и кириллицу), кроме / \ ? < > * " |. Но кириллицу в именах
файлов я бы не рекомендовал вообще. Впрочем, если вы уверены, что не будете эти
файлы передавать Windows-пользователям (на дискете, по электронной почте), —
используйте на здоровье. А при обмене файлами по электронной почте (кодировкато у всех разная, поэтому вместо русскоязычного имени пользователь увидит абракадабру) имя файла лучше писать латиницей.
Также вам придется привыкнуть к тому, что система Linux чувствительна к регистру в имени файла: FILE.txt и FiLe.Txt — это два разных файла.
Разделение элементов пути осуществляется символом / (прямой слэш), а не \
(обратный слэш), как в Windows.

4.2.2. Файлы и устройства
Пользователи Windows привыкли к тому, что файл — это именованная область
данных на диске. Отчасти так оно и есть. Отчасти — потому, что приведенное определение файла было верно для DOS (Disk Operating System) и Windows.

Часть I. Командная строка

28

В Linux же понятие файла значительно шире. Сейчас Windows-пользователи будут очень удивлены: в Linux есть файлы устройств, позволяющие обращаться
с устройством, как с обычным файлом. Файлы устройств находятся в каталоге /dev
(от devices). Да, через файл устройства мы можем обратиться к устройству! Если
вы работали в DOS, то, наверное, помните, что что-то подобное было и там — существовали зарезервированные имена файлов: PRN (принтер), CON (клавиатура
при вводе, дисплей при выводе), LPTn (параллельный порт, n — номер порта),
COMn (последовательный порт).
ПРИМЕЧАНИЕ
Кому-то может показаться, что разработчики Linux "украли" идею специальных файлов у Microsoft — ведь Linux появилась в начале 90-х годов, а DOS — в начале 80-х
годов прошлого века. На самом деле это не так. Наоборот, Microsoft позаимствовала
идею файлов устройств из операционной системы UNIX, которая была создана еще
до создания DOS. Однако сейчас не время говорить об истории развития операционных систем, поэтому лучше вернемся к файлам устройств.

Вот самые распространенные примеры файлов устройств:
 /dev/sdx — файл жесткого диска или USB-накопителя;
 /dev/sdxN — файл устройства раздела на жестком диске, N — это номер раздела;
 /dev/mouse — файл устройства мыши;
 /dev/modem — файл устройства модема (на самом деле является ссылкой на

файл устройства ttySn);
 /dev/ttySn — файл последовательного порта, n — номер порта (ttyS0 соответст-

вует COM1, ttyS1 — COM2 и т. д.).
ПРИМЕЧАНИЕ
В современных дистрибутивах имена вида /dev/hdx уже не используются (см. далее).

В свою очередь, файлы устройств бывают двух типов: блочные и символьные.
Обмен информации с блочными устройствами, например с жестким диском, осуществляется блоками информации, а с символьными — отдельными символами. Пример символьного устройства — последовательный порт.

4.2.3. Корневая файловая система и монтирование
Наверняка на вашем компьютере установлена система Windows. Выполните команду Пуск | Компьютер (рис. 4.1).
Скорее всего, вы увидите пиктограмму гибкого диска (имя устройства — A:),
пиктограммы разделов жесткого диска (пусть будет три раздела — C:, D: и E:),
пиктограмму привода CD/DVD (F:). На рис. 4.1 нет диска A:, т. к. мой ноутбук не
оснащен дисководом для гибких дисков.
Таким способом, с помощью буквенных обозначений A:, C:, D: и т. д. в Windows
обозначаются корневые каталоги разделов жесткого диска и сменных носителей.
В Linux существует понятие корневой файловой системы. Допустим, вы установили Linux в раздел с именем /dev/sda3. В этом разделе и будет развернута корне-

Глава 4. Файловая система. Команды для работы с файловой системой

29

вая файловая система вашей Linux-системы. Корневой каталог обозначается прямым слэшем (/), т. е. для перехода в корневой каталог в терминале (или консоли)
нужно ввести команду cd /.

Рис. 4.1. Окно Компьютер

Понятно, что на вашем жестком диске есть еще разделы. Чтобы получить доступ к этим разделам, вам нужно подмонтировать их к корневой файловой системе.
После монтирования вы можете обратиться к содержимому разделов через точку
монтирования — назначенный вами при монтировании специальный каталог, например /mnt/cdrom. Монтированию файловых систем посвящен разд. 4.6, поэтому
сейчас не будем говорить об этом процессе подробно.

4.2.4. Стандартные каталоги Linux
Файловая система любого дистрибутива Linux содержит следующие каталоги:
 / — корневой каталог;
 /bin — содержит стандартные программы Linux (cat, cp, ls, login и т. д.);
 /boot — каталог загрузчика, содержит образы ядра и Initrd (RAM-диска инициализации), может содержать конфигурационные и вспомогательные файлы загрузчика;

Часть I. Командная строка

30

 /dev — содержит файлы устройств;
 /etc — содержит конфигурационные файлы системы;
 /home — содержит домашние каталоги пользователей;
 /lib — библиотеки и модули;
 /lost+found — восстановленные после некорректного размонтирования файло-

вой системы файлы и каталоги;
 /media — в современных дистрибутивах содержит точки монтирования сменных
носителей (CD-, DVD-, USB-накопителей);
 /misc — может содержать все, что угодно, равно как и каталог /opt;
 /mnt — обычно содержит точки монтирования;
 /proc — каталог псевдофайловой системы procfs, предоставляющей информацию о процессах;
 /root — каталог суперпользователя root;
 /sbin — каталог системных утилит, выполнять которые имеет право пользователь root;
 /tmp — каталог для временных файлов;
 /usr — содержит пользовательские программы, документацию, исходные коды
программ и ядра;
 /var — постоянно изменяющиеся данные системы, например очереди системы
печати, почтовые ящики, протоколы, замки и т. д.
В зависимости от дистрибутива, в корневом каталоге могут находиться дополнительные каталоги (либо, наоборот, отсутствовать некоторые каталоги, приведенные в списке). Например, в Debian и Ubuntu обязательно есть каталог /opt (ранее он
использовался для установки альтернативного программного обеспечения, сейчас
его можно использовать для чего угодно), а в Ubuntu есть каталог /cdrom (который
по непонятным мне причинам не используется).

4.3. Команды для работы с файлами
и каталогами
4.3.1. Работа с файлами
Здесь мы рассмотрим основные команды для работы с файлами в Linux (табл. 4.1),
а в последующих разделах этой главы — команды для работы с каталогами, ссылками и поговорим о правах доступа к файлам и каталогам.
Таблица 4.1. Основные команды Linux, предназначенные для работы с файлами
Команда

Назначение

touch

Создает пустой файл

cat

Просмотр текстового файла

Глава 4. Файловая система. Команды для работы с файловой системой

31

Таблица 4.1 (окончание)
Команда

Назначение

tac

Вывод содержимого текстового файла в обратном порядке, т. е.
сначала выводится последняя строка, потом предпоследняя и т. д.

cp


Копирует файл в файл . Если существует, программа попросит разрешение на его перезапись

mv


Перемещает файл в файл . Эту же команду можно
использовать и для переименования файла

rm

Удаляет файл

locate

Производит быстрый поиск файла

which


Выводит каталог, в котором находится программа, если она вообще установлена. Поиск производится в каталогах, указанных в переменной окружения PATH (это путь поиска программ)

less

Используется для удобного просмотра файла с возможностью
скроллинга (постраничной прокрутки)

ПРИМЕЧАНИЕ
Все представленные команды предназначены для работы в консоли, т. е. в текстовом
режиме. Понятно, что большинство современных дистрибутивов запускаются в графическом режиме, поэтому некоторые пользователи Linux даже не подозревают о
том, что существует консоль. Да, таково новое поколение Linux-пользователей, которым проще использовать графический файловый менеджер, чем вводить команды.
Но если вы хотите стать квалифицированным пользователем Linux, то просто обязаны знать, как работать в консоли, иначе уподобитесь Windows-пользователям, которые при каждом сбое переустанавливают операционную систему… Если вы пропустили главу 3, в которой рассматривается работа с консолью, настоятельно
рекомендую прочитать ее!

Рассмотрим небольшую серию команд (протокол выполнения этих команд приведен на рис. 4.2):
touch file.txt
echo "some text" > file.txt
cat file.txt
cp file.txt file-copy.txt
cat file-copy.txt
rm file.txt
cat file.txt
mv file-copy.txt file.txt
cat file.txt

Первая команда (touch) создает в текущем каталоге файл file.txt. Вторая команда (echo) записывает строку some text в этот же файл. Обратите внимание на символ > — это символ перенаправления ввода/вывода, о котором мы поговорим чуть
позже.

Часть I. Командная строка

32

Рис. 4.2. Операции с файлом

Третья команда (cat) выводит содержимое файла — в файле записанная нами
строка some text. Четвертая команда (cp) копирует файл file.txt в файл с именем
file-copy.txt. После этого мы опять используем команду cat, чтобы вывести содержимое файла file-copy.txt, — надо же убедиться, что файл действительно скопировался.
Шестая команда (rm) удаляет файл file.txt. При удалении система спрашивает,
хотите ли вы удалить файл. Если хотите удалить, то нужно нажать клавишу ,
а если нет, то . Точно ли файл удален? Убедимся в этом: введите команду cat
file.txt. Система нам сообщает, что нет такого файла.
Восьмая команда (mv) переименовывает файл file-copy.txt в файл file.txt. Последняя команда выводит исходный файл file.txt. Думаю, особых проблем с этими
командами у вас не возникло, тем более что принцип действия этих команд вам
должен быть знаком по командам DOS, которые, как квалифицированный пользователь Windows, вы должны знать наизусть.
Вместо имени файла иногда очень удобно указать маску имени файла. Например, у нас есть много временных файлов, имена которых заканчиваются фрагментом tmp. Для их удаления нужно воспользоваться командой: rm *tmp.
Если же требуется удалить все файлы в текущем каталоге, можно просто указать звездочку: rm *.
Аналогично, можно использовать символ ?, который, в отличие от звездочки,
заменяющей последовательность символов произвольной длины, заменяет всего
один символ. Например, нам нужно удалить все файлы, имена которых состоят из
трех букв и начинаются на s:
rm s??

Будут удалены файлы s14, sqm, sr6 и т. д., но не будут тронуты файлы, имена
которых состоят более чем из трех букв и которые не начинаются на s.
Маски имен можно также использовать и при работе с каталогами.

Глава 4. Файловая система. Команды для работы с файловой системой

33

4.3.2. Работа с каталогами
Основные команды для работы с каталогами приведены в табл. 4.2.
Таблица 4.2. Основные команды для работы с каталогами
Команда

Описание

mkdir

Создание каталога

cd

Изменение каталога

ls

Вывод содержимого каталога

rmdir

Удаление пустого каталога

rm -r

Рекурсивное удаление каталога

При указании имени каталога можно использовать следующие символы:
 . — означает текущий каталог. Если вы введете команду cat ./file, то она выведет файл file, который находится в текущем каталоге;
 .. — родительский каталог. Например, команда cd .. переведет вас на один
уровень вверх по дереву файловой системы;
 ~ — домашний каталог пользователя (об этом мы поговорим позже).
Теперь рассмотрим пример работы с каталогами на практике. Выполните следующие команды:
mkdir directory
cd directory
touch file1.txt
touch file2.txt
ls
cd ..
ls directory
rm directory
rmdir directory
rm -r directory

Первая команда (mkdir) создает каталог directory в текущем каталоге. Вторая
команда (cd) переводит (изменяет каталог) в только что созданный каталог. Следующие две команды touch создают в новом каталоге два файла — file1.txt
и file2.txt.
Команда ls без указания каталога выводит содержимое текущего каталога.
Команда cd .. переводит в родительский каталог. Как уже было отмечено,
в Linux родительский каталог обозначается так: .. (две точки), а текущий так:
. (одна точка). То есть находясь в каталоге directory, мы можем обращаться
к файлам file1.txt и file2.txt без указания каталога или же так:./file1.txt
и ./file2.txt.

Часть I. Командная строка

34

ВНИМАНИЕ!
Еще раз обратите внимание: в Linux в отличие от Windows для разделения элементов
пути используется прямой слэш (/), а не обратный (\)!

Кроме обозначений .. и . в Linux часто используется обозначение ~ — это домашний каталог. Предположим, что наш домашний каталог /home/den. В нем мы
создали подкаталог dir и поместили в него файл file1.txt. Полный путь к файлу
можно записать так:
/home/den/dir/file1.txt

или же так:
~/dir/file1.txt

Как видите, тильда (~) заменяет часть пути. Удобно? Конечно!
Поскольку мы находимся в родительском для каталога directory каталоге, чтобы
вывести содержимое только что созданного каталога в команде ls, нам нужно четко указать имя каталога:
ls directory

Команда rm используется для удаления каталога. Но что мы видим — система
отказывается удалять каталог! Пробуем удалить его командой rmdir, но и тут отказ. Система сообщает нам, что каталог не пустой, т. е. содержит файлы. Для удаления каталога нужно удалить все файлы. Конечно, делать это не сильно хочется,
поэтому проще указать опцию -r команды rm для рекурсивного удаления каталога.
В этом случае сначала будут удалены все подкаталоги (и все файлы в этих подкаталогах), а затем будет удален сам каталог (рис. 4.3).
Команды cp и mv работают аналогично: для копирования (перемещения/переименования) сначала указывается каталог-источник, а потом каталог-назначение.
Для каталогов желательно указывать параметр -r, чтобы копирование (перемещение) производилось рекурсивно.

Рис. 4.3. Операции с каталогами

Глава 4. Файловая система. Команды для работы с файловой системой

35

4.4. Команда ln: создание ссылок
В Linux допускается, чтобы один и тот же файл существовал в системе под разными именами. Для этого используются ссылки. Ссылки бывают двух типов: жесткие и символические. Жесткие ссылки жестко привязываются к файлу — вы не
можете удалить файл, пока на него указывает хотя бы одна жесткая ссылка. А вот
если на файл указывают символические ссылки, его удалению ничто не помешает.
Жесткие ссылки не могут указывать на файл, который находится за пределами
файловой системы. Предположим, у вас два Linux-раздела: один корневой, а второй используется для домашних файлов пользователей и монтируется к каталогу
/home корневой файловой системы. Так вот, вы не можете создать в корневой файловой системе ссылку, которая ссылается на файл в файловой системе, подмонтированной к каталогу /home. Это очень важная особенность жестких ссылок. Если
вам нужно создать ссылку на файл, который находится за пределами файловой
системы, вам следует использовать символические ссылки.
Для создания ссылок используется команда ln:
ln file.txt link1
ln -s file.txt link2

Первая команда создает жесткую ссылку link1, ссылающуюся на текстовый
файл file.txt. Вторая команда создает символическую ссылку link2, которая ссылается на этот же текстовый файл file.txt.
Модифицируя ссылку (все равно какую — link1 или link2), вы автоматически
модифицируете исходный файл — file.txt.
Особого внимания заслуживает операция удаления. По идее, если вы удаляете
ссылку link2, файл file.txt также должен быть удален, но не тут-то было — вы не
можете его удалить до тех пор, пока на него указывает хоть одна жесткая ссылка.
При удалении ссылки link2 просто будет удалена символьная ссылка, но жесткая
ссылка и сам файл останутся. Если же вы удалите ссылку link1, будет удален
и файл file.txt, поскольку на него больше не ссылается ни одна жесткая ссылка.

4.5. Команды chown, chmod и chattr
4.5.1. Команда chmod: права доступа
к файлам и каталогам
Для каждого каталога и файла вы можете задать права доступа. Точнее, права
доступа автоматически задаются при создании каталога/файла, а вам при необходимости можно их изменить. Какая может быть необходимость? Например, вам
нужно, чтобы к вашему файлу-отчету смогли получить доступ пользователи —
члены вашей группы. Или вы создали обычный текстовый файл, содержащий инструкции командного интерпретатора. Чтобы этот файл стал сценарием, вам нужно
установить право на выполнение для этого файла.
Существуют три права доступа: чтение (r), запись (w), выполнение (x). Для каталога право на выполнение означает право на просмотр содержимого каталога.

Часть I. Командная строка

36

Вы можете установить разные права доступа для владельца (т. е. для себя), для
группы владельца (т. е. для всех пользователей, входящих в одну с владельцем
группу) и для прочих пользователей. Пользователь root может получить доступ
к любому файлу или каталогу вне зависимости от прав, которые вы установили.
Чтобы просмотреть текущие права доступа, введите команду:
ls -l

Например,
ls -l video.txt

В ответ программа выведет следующую строку:
-r--r----- 1 den group 300 Apr 11 11:11 video.txt








В этой строке фрагмент -r--r----- описывает права доступа:
первый символ — это признак каталога. Сейчас перед нами файл. Если бы перед
нами был каталог, то первый символ был бы символом d (от directory);
последующие три символа (r--) определяют права доступа владельца файла
или каталога. Первый символ — это чтение, второй — запись, третий — выполнение. Как можно видеть, владельцу разрешено только чтение этого файла,
запись и выполнение запрещены, поскольку в правах доступа режимы w и x не
определены;
следующие три символа (r--) задают права доступа для членов группы владельца. Права такие же, как и у владельца: можно читать файл, но нельзя изменять
или запускать;
последние три символа (---) задают права доступа для прочих пользователей.
Прочие пользователи не имеют права ни читать, ни изменять, ни выполнять
файл. При попытке получить доступ к файлу они увидят сообщение Access
denied.
ПРИМЕЧАНИЕ
После прав доступа команда ls выводит имя владельца файла, имя группы владельца, размер файла, дату и время создания, а также имя файла.

Права доступа задаются командой chmod. Существуют два способа указания
прав доступа: символьный (когда указываются символы, задающие право доступа, — r, w, x) и абсолютный.
Так уж заведено, что в мире UNIX чаще пользуются абсолютным методом. Разберемся, в чем он заключается. Рассмотрим следующий набор прав доступа:
rw-r-----

Данный набор прав доступа предоставляет владельцу право чтения и модификации файла (rw-), запускать файл владелец не может. Члены группы владельца могут только просматривать файл (r--), а все остальные пользователи не имеют вообще никакого доступа к файлу.
Возьмем отдельный набор прав, например для владельца: rwЧтение разрешено — мысленно записываем 1, запись разрешена — запоминаем
еще 1, а вот выполнение запрещено, поэтому запоминаем 0. Получается число 110.

Глава 4. Файловая система. Команды для работы с файловой системой

37

Если из двоичной системы перевести число 110 в восьмеричную, получится число 6.
Для перевода можно воспользоваться табл. 4.3.
Таблица 4.3. Преобразование чисел из двоичной системы в восьмеричную
Двоичная
система

Восьмеричная
система

Двоичная
система

Восьмеричная
система

000

0

100

4

001

1

101

5

010

2

110

6

011

3

111

7

Аналогично произведем разбор прав для членов группы владельца. Получится
двоичное 100, т. е. восьмеричное 4. С третьим набором (---) все вообще просто —
это 000, т. е. 0.
Записываем полученные числа в восьмеричной системе в порядке владелецгруппа-остальные. Получится число 640 — это и есть права доступа. Для того чтобы установить эти права доступа, выполните команду:
chmod 640

Наиболее популярные права доступа:
 644 — владельцу можно читать и изменять файл, остальным пользователям —
только читать;
 666 — читать и изменять файл можно всем пользователям;
 777 — всем можно читать, изменять и выполнять файл.
ПРИМЕЧАНИЕ
Напомню, что для каталога право выполнения — это право просмотра оглавления каталога.

Иногда символьный метод оказывается проще. Например, у нас есть файл script,
который нужно сделать исполнимым, для этого можно применить команду:
chmod +x script

Для того чтобы снять право выполнения, указывается параметр -x:
chmod -x script

Подробнее о символьном методе вы сможете прочитать в руководстве по
команде chmod (выполнив команду man chmod).

4.5.2. Команда chown: смена владельца файла
Если вы хотите "подарить" кому-то файл, т. е. сделать какого-то пользователя
владельцем файла, то вам нужно применить команду chown:
chown пользователь файл

Часть I. Командная строка

38

ПРИМЕЧАНИЕ
Возможно, что после изменения владельца файла вы сами не сможете получить к
нему доступ, ведь владельцем будете уже не вы.

4.5.3. Специальные права доступа (SUID и SGID)
Мы рассмотрели обычные права доступа к файлам, но в Linux есть еще так называемые специальные права доступа: SUID (Set User ID root) и SGID (Set Group
ID root).
Данные права доступа позволяют обычным пользователям запускать программы, требующие для своего запуска привилегий пользователя root. Например, демон
pppd требует привилегий root, но чтобы каждый раз при установке PPP-соединения
(модемное, ADSL-соединение) не входить в систему под именем root, достаточно
установить специальные права доступа для демона pppd. Делается это так:
chmod u+s /usr/sbin/pppd

Однако не нужно увлекаться такими решениями, поскольку каждая программа,
для которой установлен бит SUID, является потенциальной "дырой" в безопасности
вашей системы. Для выполнения программ, требующих прав root, намного рациональнее использовать программы sudo и su (описание которых можно получить по
командам man sudo и man su).

4.5.4. Команда chattr: атрибуты файла,
запрет изменения файла
С помощью команды chattr можно изменить атрибуты файла. Параметр + устанавливает атрибут, а параметр – атрибут снимает. Например:
# chattr +i /boot/grub/menu.lst

Данная команда устанавливает атрибут i, запрещающий любое изменение, переименование и удаление файла. Установить этот атрибут, равно как и снять его,
имеет право только суперпользователь или процесс с возможностью
CAP_LINUX_IMMUTABLE. Чтобы изменить файл, нужно очистить атрибут с помощью
команды:
# chattr -i /boot/grub/menu.lst

Если установить атрибут j, то все данные, прежде чем они будут записаны непосредственно в файл, будут сохранены в журнал ext3. Данный атрибут имеет
смысл, только если файловая система смонтирована с опциями data=ordered или
data=writeback (см. разд. 4.7). Когда файловая система смонтирована с опцией
data=journal, данный атрибут не имеет значения, поскольку все данные файла
и так уже журналируются. Об остальных атрибутах вы сможете прочитать в справочной системе:
man chattr

Глава 4. Файловая система. Команды для работы с файловой системой

39

4.6. Монтирование файловых систем
4.6.1. Команды mount и umount
Чтобы работать с какой-либо файловой системой, необходимо примонтировать
ее к корневой файловой системе. Например, вставив в дисковод дискету, нужно
подмонтировать файловую систему дискеты к корневой файловой системе — только так мы сможем получить доступ к файлам и каталогам, которые на этой дискете
записаны. Аналогичная ситуация с жесткими, оптическими дисками и другими носителями данных.
Если вы хотите заменить сменный носитель данных (дискету, компакт-диск), вам
нужно сначала размонтировать файловую систему, затем извлечь носитель данных,
установить новый и заново смонтировать файловую систему. В случае с дискетой
о размонтировании должны помнить вы сами, поскольку при этом выполняется синхронизация буферов ввода/вывода и файловой системы, т. е. данные физически записываются на диск, если это еще не было сделано. А компакт-диск система не разрешит вам извлечь, если он не размонтирован. В свою очередь, размонтировать
файловую систему можно, только когда ни один процесс ее не использует.
При завершении работы системы (перезагрузке, выключении компьютера) размонтирование всех файловых систем выполняется автоматически.
Команда монтирования (ее нужно выполнять с привилегиями root) выглядит так:
# mount [опции]

Точка монтирования — это каталог, через который будет осуществляться доступ к монтируемой файловой системе. Например, если вы подмонтировали компакт-диск к каталогу /mnt/cdrom, то получить доступ к файлам и каталогам, записанным на компакт-диске, можно будет через точку монтирования (именно этот
каталог /mnt/cdrom). Точкой монтирования может быть любой каталог корневой
файловой системы, хоть /aaa-111. Главное, чтобы этот каталог существовал на момент монтирования файловой системы.
В некоторых современных дистрибутивах запрещен вход в систему под именем
суперпользователя — root. Поэтому для выполнения команд с привилегиями root
вам нужно использовать команду sudo. Например, чтобы выполнить команду монтирования привода компакт-диска, вам нужно ввести команду:
sudo mount /dev/hdc /mnt/cdrom

Перед выполнением команды mount команда sudo попросит вас ввести пароль
root. Если введенный пароль правильный, то будет выполнена команда mount.
Для размонтирования файловой системы используется команда umount:
# umount

4.6.2. Файлы устройств и монтирование
В этой главе мы уже говорили о файлах устройств. Здесь мы вернемся к ним
снова, но в контексте монтирования файловой системы.

Часть I. Командная строка

40

Как уже было отмечено, для Linux нет разницы между устройством и файлом. Все
устройства системы представлены в корневой файловой системе как обычные файлы.
Например, /dev/fd0 — это ваш дисковод для гибких дисков, /dev/hda (/dev/sda) — жесткий диск. Файлы устройств хранятся в каталоге /dev.

Жесткие диски
С жесткими дисками сложнее всего, поскольку одно и то же устройство может
в разных версиях одного и того же дистрибутива называться по-разному. Например,
мой IDE-диск, подключенный как первичный мастер, в Fedora 5 все еще назывался
/dev/hda, а в Fedora 8 он стал называться /dev/sda. Раньше накопители, подключающиеся к интерфейсу IDE (PATA), назывались /dev/hdx, а SCSI/SATA-накопители —
/dev/sdx (где в обоих случаях x — буква устройства).
После принятия udev и глобального уникального идентификатора устройств
(UUID) все дисковые устройства, вне зависимости от интерфейса подключения
(PATA, SATA, SCSI), называются /dev/sdx, где x — буква устройства. Все современные дистрибутивы поддерживают udev и UUID. Так что не удивляйтесь, если
вдруг ваш старенький IDE-винчестер будет назван /dev/sda. С одной стороны, это
вносит некоторую путаницу (см. разд. 4.6.5). С другой стороны, все современные
компьютеры оснащены именно SATA-дисками (т. к. PATA-диски уже устарели,
а SCSI — дорогие), а на современных материнских платах только один контроллер
IDE (PATA), потому многие пользователи даже ничего не заметят.
ПОЯСНЕНИЕ
udev — это менеджер устройств, используемый в ядрах Linux версии 2.6. Пришел на
смену более громоздкой псевдофайловой системе devfs. Управляет всеми манипуляциями с файлами из каталога /dev.

Рассмотрим ситуацию с жесткими дисками чуть подробнее. Пусть у нас есть
устройство /dev/sda. На жестком диске, понятное дело, может быть несколько разделов (логических дисков). В нашем случае на диске имеются три раздела, которые
в Windows называются C:, D: и E:. Диск C: обычно является загрузочным (активным), поэтому он будет записан в самом начале диска. Нумерация разделов жесткого диска в Linux начинается с 1, поэтому в большинстве случаев диску C: будет
соответствовать имя /dev/sda1 — первый раздел на первом жестком диске.
Резонно предположить, что двум оставшимся разделам (D: и E:) были присвоены имена /dev/sda2 и /dev/sda3. Это может быть так — и не так. Сейчас поясню.
Раздел может быть первичным (primary partition), расширенным (extended partition)
или логическим (logical partition). Всего на диске может быть или четыре первичных раздела, или три первичных и один расширенный.
Пусть на жестком диске есть четыре первичных раздела, для которых зарезервированы номера 1, 2, 3, 4. Если разделы D: и E: — первичные, то им будут присвоены
имена /dev/sda2 и /dev/sda3. Но в большинстве случаев данные разделы являются логическими, а логические разделы содержатся в расширенном разделе (там может
быть максимум 11 логических разделов). При этом в Windows расширенному разделу
не присваивается буква, потому что этот раздел не содержит данных пользователя,

Глава 4. Файловая система. Команды для работы с файловой системой

41

а только информацию о логических разделах. Логические разделы именуются, начиная с 5, т. е. если разделы D: и E: — логические, то им будут присвоены имена
/dev/sda5 и /dev/sda6 соответственно.
Узнать номер раздела очень просто: достаточно запустить утилиту, работающую с таблицей разделов диска — fdisk (будет рассмотрена в главе 9).
Чтобы узнать номера разделов первого жесткого диска (/dev/hda), введите
команду:
# /sbin/fdisk /dev/sda

После этого вы увидите приглашение fdisk. В ответ на приглашение нужно
ввести p и нажать клавишу . Вы увидите таблицу разделов (рис. 4.4). После
этого для выхода из программы введите q и нажмите клавишу .

Рис. 4.4. Таблица разделов жесткого диска

На рис. 4.4 изображена таблица разделов моего первого жесткого диска. Первый
раздел (это мой диск C:, где установлена система Windows) — первичный. Сразу
после него расположен расширенный раздел (его номер — 2). Следующий за
ним — логический раздел (номер 5). Разделы с номерами 3 и 4 пропущены, потому
что их нет на моем жестком диске. Это те самые первичные разделы, которые я не
создал — они мне не нужны.

Приводы оптических дисков
Любое из устройств sdx может быть приводом для чтения CD- или DVD-дисков.
Если система видит, что устройство является приводом CD-ROM, то автоматически
создается ссылка /dev/cdrom. А если ваш привод умеет также читать и DVD-диски,
то в каталоге /dev появится еще одна ссылка — /dev/dvd. Например, мой DVD-RW
подключен как первичный подчиненный (/dev/sdb), а в каталоге /dev есть три фай-

Часть I. Командная строка

42

ла: /dev/sdb, /dev/cdrom, /dev/dvd. Обратиться к устройству можно, используя любой из этих файлов.
Для монтирования привода для чтения оптических дисков нужно ввести одну из
трех команд:
# mount /dev/sdb /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom
# mount /dev/dvd /mnt/cdrom

После этого обратиться к файлам, записанным на диске, можно будет через каталог /mnt/cdrom. Напомню, что каталог /mnt/cdrom должен существовать.

Дискеты и USB-накопители
Аналогичная ситуация и с дискетами. В системе может быть установлено два
дисковода для дискет — первый (/dev/fd0) и второй (/dev/fd1).
Для их монтирования можно использовать команды:
# mount /dev/fd0 /mnt/floppy
# mount /dev/fd1 /mnt/floppy

В Windows-терминологии устройство /dev/fd0 — это диск A:, а устройство
/dev/fd1 — диск B:.
USB-накопители определяются как жесткие диски. Если в вашей системе есть
один жесткий диск, то его имя будет /dev/sda. Когда вы подключите флешку или
другой USB-накопитель (мобильный жесткий диск, card reader и т. д.), то в вашей
системе появится новое устройство — /dev/sdb. Осталось только подмонтировать
его. Далее мы поговорим о монтировании USB-накопителей более подробно.
ОБ АВТОМАТИЧЕСКОМ МОНТИРОВАНИИ
Нужно отметить, что CD/DVD-приводы, а также USB-накопители монтируются автоматически (к каталогу /media/), поэтому все, что было сказано о монтировании таких носителей, — исключительно для общего развития.

4.6.3. Опции монтирования файловых систем
Теперь, когда мы знаем номер раздела, можно подмонтировать его файловую
систему. Делается это так:
# mount

Например:
# mount /dev/sda5 /mnt/win_d

У команды mount довольно много опций, но на практике наиболее часто используются только некоторые из них: -t, -r, -w, -a.
 Параметр -t позволяет задать тип файловой системы. Обычно программа сама
определяет файловую систему, но иногда это у нее не получается. Тогда мы
должны ей помочь. Формат использования этого параметра следующий:
# mount -t

Глава 4. Файловая система. Команды для работы с файловой системой

43

Например:
# mount -t iso9660 /dev/hdc /mnt/cdrom

Вот опции для указания наиболее популярных монтируемых файловых систем:
ext2 или ext3 — файловая система Linux;
iso9660 — указывается при монтировании CD-ROM;
vfat — FAT, FAT32 (поддерживается Windows 9x, ME, XP);
ntfs — NT File System (поддерживается Windows NT, XP), будет использована стандартная поддержка NTFS, при которой NTFS-раздел доступен только для чтения;
ntfs-3g — будет использован модуль ntfs-3g, входящий в большинство современных дистрибутивов. Данный модуль позволяет производить запись
информации на NTFS-разделы.
ПРИМЕЧАНИЕ
Если в вашем дистрибутиве нет модуля ntfs-3g, т. е. при попытке указания данной
файловой системы вы увидели сообщение об ошибке, тогда вы можете скачать его
с сайта www.ntfs-3g.org. На данном сайте доступны как исходные коды, так и уже откомпилированные для разных дистрибутивов пакеты.

 Параметр -r монтирует указанную файловую систему в режиме "только

чтение".
 Параметр -w монтирует файловую систему в режиме "чтение/запись". Данный

параметр используется по умолчанию для файловых систем, поддерживающих
запись (например, NTFS по умолчанию запись не поддерживает, как и файловые
системы CD/DVD-дисков).
 Параметр –a используется для монтирования всех файловых систем, указанных
в файле /etc/fstab (кроме тех, для которых указано noauto — такие файловые
системы нужно монтировать вручную). При загрузке системы вызывается команда mount с параметром -a.
Если вы не можете смонтировать NTFS-раздел с помощью опции ntfs-3g, то,
вероятнее всего, он был неправильно размонтирован (например, работа Windows не
была завершена корректно). В этом случае для монтирования раздела нужно использовать опцию –o force, например:
sudo mount -t ntfs-3g /dev/sdb1 /media/usb -o force

4.6.4. Монтирование разделов при загрузке
Если вы не хотите при каждой загрузке монтировать постоянные файловые системы (например, ваши Windows-разделы), то вам нужно прописать их в файле
/etc/fstab. Обратите внимание: в этом файле не нужно прописывать файловые системы сменных носителей (дисковода, CD/DVD-привода, Flash-диска). Следует отметить, что программы установки некоторых дистрибутивов, например Mandriva,
читают таблицу разделов и автоматически заполняют файл /etc/fstab. В результате

Часть I. Командная строка

44

все ваши Windows-разделы доступны сразу после установки системы. К сожалению, не все дистрибутивы могут похвастаться такой интеллектуальностью, поэтому вам нужно знать формат файла fstab:
устройство точка_монтирования тип_ФС опции флаг_РК флаг_проверки

Здесь: тип_ФС — это тип файловой системы, а флаг_РК — флаг резервного копирования. Если он установлен (1), то программа dump заархивирует данную файловую систему при создании резервной копии. Если не установлен (0), то резервная
копия этой файловой системы создаваться не будет. Флаг проверки устанавливает,
будет ли данная файловая система проверяться на наличие ошибок программой
fsck. Проверка производится в двух случаях:
 если файловая система размонтирована некорректно;
 если достигнуто максимальное число операций монтирования для этой файловой системы.
Поле опций содержит важные параметры файловой системы. Некоторые из них
представлены в табл. 4.4.
Таблица 4.4. Опции монтирования файловой системы в файле /etc/fstab
Опция

Описание

auto

Файловая система должна монтироваться автоматически при загрузке. Опция используется по умолчанию, поэтому ее указывать не обязательно

noauto

Файловая система не монтируется при загрузке системы (при выполнении команды mount -a), но ее можно смонтировать вручную с помощью все той же команды mount

defaults

Используется стандартный набор опций, установленных по умолчанию

exec

Разрешает запуск выполняемых файлов для данной файловой системы. Эта опция используется по умолчанию

noexec

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

ro

Монтирование в режиме "только чтение"

rw

Монтирование в режиме "чтение/запись". Используется по умолчанию
для файловых систем, поддерживающих запись

user

Данную файловую систему разрешается монтировать/размонтировать
обычному пользователю (не root)

nouser

Файловую систему может монтировать только пользователь root. Используется по умолчанию

umask

Определяет маску прав доступа при создании файлов. Для файловых
систем не Linux'а маску нужно установить так: umask=0

utf8

Применяется только на дистрибутивах, которые используют кодировку
UTF-8 в качестве кодировки локали. В старых дистрибутивах (где используется KOI8-R) для корректного отображения русских имен файлов на Windows-разделах нужно задать параметры iocharset=
koi8-u,codepage=866

Глава 4. Файловая система. Команды для работы с файловой системой

45

ПРИМЕЧАНИЕ
Редактировать файл /etc/fstab, как и любой другой файл из каталога /etc, можно в любом текстовом редакторе (например, gedit, kate), но перед этим нужно получить
права root (команды su или sudo).

Рассмотрим небольшой пример:
/dev/sdc /mnt/cdrom auto umask=0,user,noauto,ro,exec 0 0
/dev/sda1 /mnt/win_c vfat umask=0,utf8 0 0

Первая строка — это строка монтирования файловой системы компакт-диска,
а вторая — строка монтирования диска C:.
 Начнем с первой строки. /dev/hdc — это имя устройства CD-ROM. Точка монтирования — /mnt/cdrom. Понятно, что этот каталог должен существовать. Обратите внимание: в качестве файловой системы не указывается жестко iso9660,
поскольку компакт-диск может быть записан в другой файловой системе, поэтому в качестве типа файловой системы задано auto, т. е. автоматическое определение. Теперь идет довольно длинный набор опций. Ясно, что umask установлен в ноль, поскольку файловая система компакт-диска не поддерживает
права доступа Linux. Параметр user говорит о том, что данную файловую систему можно монтировать обычному пользователю. Параметр noauto запрещает
автоматическое монтирование этой файловой системы, что правильно — ведь на
момент монтирования в приводе может и не быть компакт-диска. Опция ro разрешает монтирование в режиме "только чтение", а exec разрешает запускать исполнимые файлы. Понятно, что компакт-диск не нуждается ни в проверке, ни
в создании резервной копии, поэтому два последних флага равны нулю.
 Вторая строка проще. Первые два поля — это устройство и точка монтирования. Третье — тип файловой системы. Файловая система постоянна, поэтому
можно явно указать тип файловой системы ( vfat), а не auto. Опция umask, как
и в предыдущем случае, равна нулю. Указание опции utf8 позволяет корректно отображать русскоязычные имена файлов и каталогов.

4.6.5. Подробно о UUID и файле /etc/fstab
Пока вы еще не успели забыть формат файла /etc/fstab, нужно поговорить о UUID
(Universally Unique Identifier), или о длинных именах дисков. В некоторых дистрибутивах, например в Ubuntu, вместо имени носителя (первое поле файла fstab) указывается его ID, поэтому fstab выглядит устрашающе, например вот так:
# /dev/sda6
UUID=1f049af9-2bdd-43bf-a16c-ff5859a4116a / ext3 defaults 0 1
# /dev/sda1
UUID=45AE-84D9 /media/hda1 vfat defaults,utf8,umask=007 0 0

В SUSE идентификаторы устройств указываются немного иначе:
/dev/disk/by-id/scsi-SATA_WDC_WD1600JB-00_WD-WCANM7959048-part5 /
ext3 acl,user_xattr 1 1
/dev/disk/by-id/scsi-SATA_WDC_WD1600JB-00_WD-WCANM7959048-part7 swap swap
defaults 0 0

Часть I. Командная строка

46

Понятно, что использовать короткие имена вроде /dev/sda1 намного проще, чем
идентификаторы в стиле 1f049af9-2bdd-43bf-a16c-ff5859a4116a. Использование
имен дисков еще никто не отменял, поэтому вместо идентификатора носителя можете смело указывать его файл устройства — так вам будет значительно проще!
Но все же вам нужно знать соответствие длинных имен коротким именам устройств. Ведь система использует именно эти имена, а в файле /etc/fstab не всегда
указывается, какой идентификатор принадлежит какому короткому имени устройства (или указывается, но не для всех разделов).
Узнать "длинные имена" устройства можно с помощью простой команды:
ls –l /dev/disk/by-uuid/

Результат выполнения этой команды приведен на рис. 4.5.

Рис. 4.5. Соответствие длинных имен дисков коротким

Спрашивается, зачем были введены длинные имена, если короткие имена были
удобнее, во всяком случае для пользователей? Оказывается, разработчики Linux
в первую очередь и заботились как раз о пользователях. Возьмем обычный IDEдиск. Как известно, данный диск можно подключить либо к первичному (primary),
либо к вторичному (secondary), если он есть, контроллеру. В зависимости от положения перемычки выбора режима винчестер может быть либо главным устройством (master), либо подчиненным (slave). Таким образом, в зависимости от контроллера, к которому подключается диск, изменяется его короткое имя — hda (primary
master), hdb (primary slave), hdc (secondary master), hdd (secondary slave). То же самое происходит с SATA/SCSI-винчестерами — при изменении параметров подключения изменяется и короткое имя устройства.
При использовании же длинных имен идентификатор дискового устройства остается постоянным вне зависимости от типа подключения устройства к контроллеру.
Именно поэтому длинные имена дисков часто также называются постоянными именами (persistent name). Получается, что раньше вы могли ошибочно подключить жесткий диск немного иначе, и разделы, которые назывались, скажем, /dev/hdaN, стали
называться /dev/hdbN. Понятно, что загрузить Linux с такого диска не получится, поскольку везде указаны другие имена устройств. Если же используются длинные имена дисков, система загрузится в любом случае, как бы вы ни подключили жесткий
диск. Удобно? Конечно.

Глава 4. Файловая система. Команды для работы с файловой системой

47

Но это еще не все. Постоянные имена — это только первая причина. Вторая
причина заключается в обновлении библиотеки libata. В новой версии libata все
PATA-устройства именуются не как hdx, а как sdx, что (как отмечалось в этой главе
ранее) вносит некую путаницу. Длинные имена дисков от этого не изменяются, поэтому они избавляют пользователя от беспокойства по поводу того, что его старый
IDE-диск вдруг превратился в SATA/SCSI-диск.
При использовании UUID однозначно идентифицировать раздел диска можно
несколькими способами:
 UUID=45AE-84D9 /media/sda1 vfat defaults,utf8,umask=007, gid=46 0 0 — здесь
с помощью параметра UUID указывается идентификатор диска;
 /dev/disk/by-id/scsi-SATA_WDC_WD1600JB-00_WD-WCANM7959048-part7

swap

— здесь указывается длинное имя устройства диска;
 LABEL=/
/
ext3
defaults
1 1 — самый компактный третий способ,
позволяющий идентифицировать устройства по их метке.
swap defaults 0 0

ПРИМЕЧАНИЕ
Первый способ получения длинного имени в англоязычной литературе называется byuuid, т. е. длинное имя составляется по UUID, второй способ называется by-id, т. е. по
аппаратному идентификатору устройства. Третий способ называется by-label — по
метке. Просмотреть соответствие длинных имен коротким можно с помощью команд:
ls –l /dev/disk/by-uuid
ls –l /dev/disk/by-id
ls –l /dev/disk/by-label
Но есть еще и четвертый способ, который называется by-path. В этом случае имя генерируется по sysfs. Данный способ является наименее используемым, поэтому вы
редко столкнетесь с ним.

Узнать метки разделов можно с помощью команды:
ls -lF /dev/disk/by-label

Установить метку можно с помощью команд, указанных в табл. 4.5.
Таблица 4.5. Команды для установки меток разделов
Файловая система

Команда

ext2/ext3/ext4

# e2label /dev/XXX

ReiserFS

# reiserfstune -l /dev/XXX

JFS

# jfs_tune -L /dev/XXX

XFS

# xfs_admin -L /dev/XXX

FAT/FAT32

Только средствами Windows

NTFS

# ntfslabel /dev/XXX

В файле /etc/fstab вы можете использовать длинные имена в любом формате.
Можно указывать имена устройств в виде: /dev/disk/by-uuid/*, /dev/disk/by-id/* или
/dev/disk/by-label/*, можно использовать параметры UUID=идентификатор или
LABEL=метка. Используйте тот способ, который вам больше нравится.

Часть I. Командная строка

48

4.6.6. Монтирование Flash-дисков
В последнее время очень популярна Flash-память. Уже сегодня Flash-память,
точнее Flash-диски (они же USB-диски), построенные с использованием Flashпамяти, практически вытеснили обычные дискеты — они очень компактны и позволяют хранить довольно большие объемы информации. Сегодня никого не удивишь небольшим брелоком, вмещающим до 8 Гбайт информации.
Принцип использования Flash-диска очень прост — достаточно подключить его
к шине USB, и через несколько секунд система определит диск. После этого с ним
можно будет работать как с обычным диском. Да, Flash-диски не очень шустры, но
молниеносной реакции от них никто и не ожидает — во всяком случае, они выглядят настоящими спринтерами на фоне обычных дискет.
Технология Flash-памяти нашла свое применение в различных портативных
устройствах — от мобильных телефонов до цифровых фотоаппаратов. Вы можете
подключить мобильник к компьютеру и работать с ним как с обычным диском —
записывать на него мелодии и картинки. Аналогичная ситуация и с цифровым фотоаппаратом: когда вы фотографируете, то фотографии и видеоролики записываются на его Flash-память. Потом вам нужно подключить его к компьютеру и просто
скопировать фотографии. Вы также можете записать фотографии (или другие файлы — не имеет значения) на фотоаппарат, используя встроенную Flash-память как
большую дискету — для переноса своих файлов.
Все современные дистрибутивы умеют автоматически монтировать Flash-диски.
После монтирования открывается окно с предложением просмотреть содержимое
диска или же импортировать фотографии (в зависимости от типа подключенного
устройства — обычный USB-диск или фотоаппарат).
Понятно, что нам, как настоящим линуксоидам, интересно, как самостоятельно
смонтировать Flash-диск. Оказывается, тут все просто. USB-диск — это обычный
накопитель, и его можно увидеть в каталоге /dev/disk/by-id. Напомню, что способ
by-id подразумевает получение длинного имени по аппаратному идентификатору
устройства, а поэтому с помощью каталога /dev/disk/by-id проще всего найти длинное имя USB-диска среди имен других накопителей: в его начале будет префикс
usb_. Введите команду:
ls –l /dev/disk/by-id | grep usb

Результат выполнения этой команды представлен на рис. 4.6.

Рис. 4.6. USB-диск найден

Исходя из рис. 4.6, для монтирования Flash-диска нужно выполнить команду:
# mount /dev/sdb1 /mnt/flash

Глава 4. Файловая система. Команды для работы с файловой системой

49

4.7. Настройка журнала
файловой системы ext3
Журналируемая файловая система имеет три режима работы: journal, ordered
и writeback. Первый режим является самым медленным, но он позволяет минимизировать потери ваших данных в случае сбоя системы (или отключения питания).
В этом режиме в системный журнал записывается все, что только можно, —это позволяет максимально восстановить файловую систему в случае сбоя.
В последовательном режиме (ordered) в журнал заносится информация только
об изменении метаданных (служебных данных файловой системы). Данный режим
используется по умолчанию и является компромиссным вариантом между производительностью и отказоустойчивостью.
Самым быстрым является режим обратной записи (writeback). Но использовать
его я вам не рекомендую, поскольку особого толку от него не будет. Проще тогда
уже при установке Linux выбрать файловую систему ext2 вместо ext3/ext4.
Если отказоустойчивость для вас на первом месте — выбирайте режим journal,
во всех остальных случаях лучше выбрать ordered. Выбор режима осуществляется
редактированием файла /etc/fstab. Например:
# Режим ordered используется по умолчанию,
# поэтому ничего указывать не нужно
/dev/sda1 / ext3 defaults 1 0
# На этом разделе важные данные — используем режим journal
/dev/sda2 /var ext3 data=journal 1 0
# Здесь ничего важного нет — режим writeback
/dev/sda3 /opt ext3 data=writeback 0 0

После изменения этого файла выполните команду:
# mount -a

Данная команда заново смонтирует все файловые системы, чтобы изменения
вступили в силу.

4.8. Файловая система ext4
Файловая система ext4 заслуживает отдельного разговора. Все, что было сказано о файловых системах ранее, справедливо и для ext4, но у новой файловой системы есть ряд особенностей, о которых мы сейчас и поговорим.
Поддержка ext4 как стабильной файловой системы появилась в ядре Linux версии 2.6.28. Если сравнивать эту файловую систему с ext3, то производительность
и надежность новой файловой системы существенно увеличена, а максимальный
размер раздела доведен до 1024 петабайт (1 эксбибайт). Максимальный размер
файла — более 2 Тбайт. Ресурс Phoronix (www.phoronix.com) произвел тестирование новой файловой системы на SSD-накопителе (такие накопители устанавливаются на современные нетбуки) — результат, как говорится, налицо: ext4 почти
в два раза превзошла файловые системы ext3, XFS, JFS и ReiserFS.

Часть I. Командная строка

50

Впрочем, когда я установил Fedora 11 на рабочую станцию, прироста производительности при работе с файлами мне почувствовать не удалось. Однако производительность — это не основной конек ext4. Но обо всем по порядку.

4.8.1. Сравнение ext3 и ext4
Описание особенностей файловой системы ext4 и ее преимуществ по сравнению
с ext3 сведены в табл. 4.6.
Таблица 4.6. Особенности ext4
Особенность

Комментарий

Увеличенный размер файла и
файловой системы

Для ext3 максимальный размер файловой системы составляет 32 Тбайт, а файла — 2 Тбайт, но на практике
ограничения были более жесткими. Так, в зависимости от
архитектуры, максимальный размер тома составлял
до 2 Тбайт, а максимальный размер файла — до 16 Гбайт.
В случае с ext4 максимальный размер тома составляет
60
1 эксбибайт (EiB) — это 2 байт. Максимальный размер
файла составляет 16 Тбайт. Такие объемы информации
пока не нужны обычным пользователям, однако весьма
пригодятся на серверах, работающих с большими дисковыми массивами

Экстенты

Основной недостаток ext3 — ее метод выделения места
на диске. Дисковые ресурсы выделялись с помощью битовых карт свободного места, а такой способ не отличается ни скоростью, ни масштабируемостью. Получилось,
что ext3 более эффективна для небольших файлов, но
совсем не подходит для хранения больших файлов.
Для улучшения выделения ресурсов и более эффективной организации данных в ext4 были введены экстенты.
Экстент — это способ представления непрерывной последовательности блоков памяти. Благодаря использованию экстентов сокращается количество метаданных
(служебных данных файловой системы), поскольку вместо информации о том, где находится каждый блок памяти, экстент содержит информацию о том, где находится
большой список непрерывных блоков памяти.
Для эффективного представления маленьких файлов в
экстентах применяется уровневый подход, а для больших файлов используются деревья экстентов. Например,
один индексный дескриптор может ссылаться на четыре
экстента, каждый из которых может ссылаться на другие
индексные дескрипторы и т. д. Такая структура является
мощным механизмом представления больших файлов, а
также более защищена и устойчива к сбоям

Отложенное выделение пространства

Файловая система ext4 может отложить выделение дискового пространства до последнего момента, что увеличивает производительность системы

Глава 4. Файловая система. Команды для работы с файловой системой

51

Таблица 4.6 (окончание)
Особенность

Комментарий

Контрольные суммы журналов

Контрольные суммы журналов повышают надежность
файловой системы

Большее количество каталогов

В ext3 могло быть максимум 32 000 каталогов, в ext4 количество каталогов не ограничивается

Дефрагментация "на лету"

Файловая система ext3 не особо склонна к фрагментации, но все же такое неприятное явление имеется. В ext4
производится дефрагментация "на лету", что позволяет
повысить производительность системы в целом

Наносекундные временные
метки

В большинстве файловых систем временные метки
(timestamp) устанавливаются с точностью до секунды,
в ext4 точность повышена до наносекунды. Кроме того,
ext4 поддерживает временные метки до 25 апреля
2514 года, в отличие от ext3 (18 января 2038 г.)

4.8.2. Совместимость с ext3
Файловая система ext4 является прямо и обратно совместимой с ext3, однако все
же существуют некоторые ограничения. Предположим, что у нас на диске имеется
файловая система ext4. Ее можно смонтировать и как ext3, и как ext4 (это и есть
прямая совместимость) — и тут ограничений никаких нет. А вот с обратной совместимостью не все так безоблачно — если файловую систему ext4 смонтировать
как ext3, то она будет работать без экстентов, что снизит ее производительность.

4.8.3. Переход на ext4
Если вы при установке системы выбрали файловую систему ext3, то перейти на
ext4 можно без потери данных и в любой удобный для вас момент. Откройте терминал и введите команду:
sudo tune2fs -O extents,uninit_bg,dir_index /dev/имя_устройства

На момент ввода этой команды устройство должно быть размонтировано.
ВНИМАНИЕ!
Если нужно преобразовать в ext4 корневую файловую систему, то данную команду
нужно вводить с LiveCD, поддерживающего ext4.

После этого проверим файловую систему:
sudo fsck -pf /dev/имя_устройства

Затем смонтируем файловую систему так:
mount -t ext4 /dev/имя_устройства /точка_монтирования
mount -t ext4 /dev/disk/by-uuid/UUID-устройства /точка_монтирования

Часть I. Командная строка

52

Если раздел автоматически монтируется через /etc/fstab, не забудьте исправить
файловую систему на ext4:
UUID=UUID-раздела /точка ext4
0 1

defaults,errors=remount-ro,relatime

Если вы изменили тип файловой системы корневого раздела, то необходимо отредактировать файл /boot/grub/menu.lst и добавить опцию rootfstype=ext4 в список параметров ядра, например:
title
root

Linux
(hd0,1)

kernel
/boot/vmlinuz-2.6.28.1 root=UUID=879f797c-944d-4c28-a720249730705714 ro quiet splash rootfstype=ext4
initrd

/boot/initrd.img-2.6.28.1

quiet

СОВЕТ
Рекомендую прочитать статью Тима Джонса "Анатомия ext4": http://www.ibm.com/
developerworks/ru/library/l-anatomy-ext4/index.html.

4.9. Особые команды
4.9.1. Команда mkfs: создание файловой системы
С помощью команды mkfs мы можем создать файловую систему на разделе жесткого диска, например: mkfs.ext2 /dev/hda1.
Вообще, создать файловую систему нужного типа (если эта файловая система
поддерживается ядром вашей системы) можно с помощью команды mkfs., например:
mkfs.ext3
mkfs.vfat
mkfs.reiserfs

Подробнее прочитать об этом можно, введя команду man

mkfs..

4.9.2. Команда fsck: проверка и восстановление
файловой системы
Для проверки файловой системы используется команда fsck. Использовать ее
нужно так:
fsck

Например:
fsck /dev/sda5

Глава 4. Файловая система. Команды для работы с файловой системой

53

Перед использованием этой команды нужно размонтировать проверяемую файловую систему. Если нужно проверить корневую файловую систему, то нужно загрузиться с LiveCD и запустить fsck для проверки нужного раздела.
Если же жесткий диск "посыпался", т. е. появились "плохие" блоки, нужно, не
дожидаясь полной потери данных, выполнить следующие действия:
1. Выполнить команду fsck -c (данная команда пометит "плохие" блоки).
2. Сделать резервную копию всех важных данных.
3. Отправиться в магазин за новым жестким диском и перенести данные со старого
жесткого диска на новый. Проверить жесткий диск на наличие плохих секторов
можно программой badblocks.
ПРИМЕЧАНИЕ
Программа fsck может проверять не только файловые системы ext2/ext3. Для проверки, например, vfat, можноиспользовать команду fsck.vfat .

Для восстановления "упавшей" таблицы разделов можно использовать программу gpart. Только используйте ее осторожно и внимательно читайте все сообщения, выводимые программой.

4.9.3. Команда chroot:
смена корневой файловой системы
Предположим, мы установили Windows после установки Linux, и программа установки Windows перезаписала начальный загрузчик. Теперь Windows загружается,
а Linux — нет. Что делать? Нужно загрузиться с LiveCD (подробнее о LiveCD мы
поговорим в приложении) и выполнить команду:
# chroot

Например, если Linux был установлен в раздел /dev/sda5, то нужно ввести
команду:
# chroot /dev/sda5

Данная команда сменит корневую файловую систему, т. е. вы загрузите ядро Linux с LiveCD, а затем сделаете подмену корневой файловой системы. Вам останется только ввести команду записи загрузчика (например, lilo) для восстановления
начального загрузчика.

4.9.4. Установка скорости CD/DVD
Программа hdparm позволяет ограничить скорость оптического привода
(CDROM/DVDROM). Иногда нужно ограничить скорость, чтобы информация была
считана без ошибок (как правило, если поверхность носителя информации немного
повреждена). Рассмотрим команду ограничения скорости:
# hdparm -q -E

Часть I. Командная строка

54

Множитель — это и есть скорость, например 1× соответствует скорости 150 KB/s
для CD, 1385 kB/s для DVD. Чтобы установить вторую (2×, 300 КБ/с) скорость чтения для CD, используется команда:
# hdparm -q -E2 /dev/cdrom

Для ограничения скорости DVD можно использовать следующую команду:
# hdparm -q -E1 /dev/dvd

4.9.5. Монтирование каталога к каталогу
В Linux можно подмонтировать каталог к каталогу, а не только каталог к устройству. Делается это с помощью все той же команды mount, запущенной с параметром --bind:
# mount --bind исходный_каталог каталог_назначения

4.9.6. Команды поиска файлов
Для поиска файлов в Linux используется команда find. Это довольно мощная
утилита со сложным синтаксисом и далеко не всегда нужная обычному пользователю. Обычному пользователю намного проще будет установить файловый менеджер mc и использовать встроенную функцию поиска.
Но команду find мы все же рассмотрим, по крайней мере, ее основы. Синтаксис
команды следующий:
find список_поиска выражение

Мощность программы find заключается в множестве самых разных параметров
поиска, которые не так легко запомнить — их просто много. К тому же find может
выполнять команды для найденных файлов. Например, вы можете найти временные файлы и сразу удалить их.
Подробно опции команды find мы рассматривать не будем — это вы можете
сделать самостоятельно с помощью команды man find. Зато мы рассмотрим несколько примеров использования этой команды.
Найти файлы с именем a.out (точнее, в имени которых содержится строка
"a.out"), поиск начать с корневого каталога (/):
find / -name a.out

Найти файлы по маске *.txt:
find / -name '*.txt'

Найти файлы нулевого размера, поиск начать с текущего каталога (.):
find . -size 0c

Хотя для поиска пустых файлов намного проще использовать параметр -empty:
find . -empty

Найти файлы, размер которых от 100 до 150 Мбайт, поиск производить в домашнем каталоге и всех его подкаталогах:
find ~ -size +100M -size -150M

Глава 4. Файловая система. Команды для работы с файловой системой

55

Найти все временные файлы и удалить их (для каждого найденного файла будет
запущена команда rm):
# find / -name *.tmp -ok rm {} \;

Вместо параметра -ok можно использовать параметр -exec, который также запускает указанную после него команду, но не запрашивает подтверждение выполнения этой команды для каждого файла.
Кроме команды find можно использовать команды which и locate. Первая выводит полный путь к программе или к сценарию, если программа или сценарий находится в списке каталогов, заданном в переменной окружения PATH:
which sendmail

Программа locate ищет в базе данных демона located файлы, соответствующие
заданному образцу. Недостаток этой команды в том, что located имеется далеко не
во всех дистрибутивах, поэтому команды locate у вас может и не быть. Зато если
located имеется и запущен, поиск файлов будет осуществляться быстрее, чем с помощью find.

Глава 5

Процессы
5.1. Команды kill, killall, xkill и ps
Каждому процессу в Linux присваивается уникальный номер — идентификатор
процесса (PID, Process ID). Зная ID процесса, вы можете управлять процессом,
а именно — завершить процесс или изменить приоритет процесса. Принудительное
завершение процесса необходимо, если процесс завис, и его нельзя завершить
обычным образом. А изменение приоритета может понадобиться, если вы хотите,
чтобы процесс доделал свою работу быстрее.
Предположим, у вас зависла какая-то программа, например файловый менеджер
mc. Хоть это и маловероятно (не помню, чтобы он когда-нибудь зависал), но для
примера пусть будет так. Принудительно завершить ("убить") процесс можно с помощью команды kill. Формат ее вызова следующий:
kill [параметры] PID

PID (Process ID) — это идентификатор процесса, который присваивается процессу системой; уникален для каждого процесса. Но мы знаем только имя процесса
(имя команды), но не знаем идентификатор процесса. Узнать идентификатор процесса позволяет программа ps. Предположим, что mc находится на первой консоли.
Поскольку он завис, вы не можете более использовать консоль, и вам нужно переключиться на вторую консоль (клавиатурной комбинацией +). Зарегистрировавшись на второй консоли, введите команду ps. Она выведет список процессов, запущенных на второй консоли — это будет bash и сам ps (рис. 5.1).
Чтобы добраться до нужного нам процесса (mc), который запущен на первой
консоли, введите команду ps -a или ps -U root. В первом случае вы получите
список процессов, запущенных вами, а во втором — список процессов, запущенных от вашего имени (я предполагаю, что вы работаете под именем root). Обратите
внимание: вы сами запустили процессы mc и ps (рис. 5.2), а от вашего имени (root)
система запустила множество процессов. Следует заметить, что программа ps выводит также имя терминала (tty1), на котором запущен процесс. Это очень важно — если на разных консолях у вас запущены одинаковые процессы, можно легко
ошибиться и завершить не тот процесс.
Теперь, когда мы знаем PID нашего процесса, мы можем его "убить":
# kill 2484

Глава 5. Процессы

57

Рис. 5.1. Список процессов на текущей консоли

Рис. 5.2. Определение PID программы mc

Перейдите на первую консоль после выполнения этой команды — mc на ней уже
не будет. Если выполнить команду ps -a, то в списке процессов mc тоже не будет.
Проще всего вычислить PID процесса с помощью следующей команды:
# ps –ax | grep

Например, # ps –ax | grep firefox.
Вообще-то все эти действия, связанные с вычислением PID процесса, мы рассмотрели только для того, чтобы познакомиться с командой ps. Так что, если вы
знаете только имя процесса, гораздо удобнее использовать команду:
# killall

Часть I. Командная строка

58

Но имейте в виду, что данная команда завершит все экземпляры данного процесса. А вполне может быть, что у нас на одной консоли находится mc, который
нужно "убить", а на другой — нормально работающий mc. Команда killall "убьет"
оба процесса.
При выполнении команд kill и killall нужно помнить, что если вы работаете
от имени обычного пользователя, они могут завершить только те процессы, которые принадлежат вам. А если вы работаете от имени пользователя root, то можете
завершить любой процесс в системе.
Кроме команды kill пользователи, предпочитающие графический интерфейс, могут использовать программу xkill, позволяющую "убить" графическую программу.
Введите команду xkill, указатель мыши изменится на череп, которым нужно будет
щелкнуть по зависшему окну (иначе, если окно не зависло, зачем его "убивать"?).
Процесс, относящийся к выбранному окну, будет немедленно завершен.

5.2. Программа top: кто больше всех
расходует процессорное время
Иногда бывает, что система ужасно тормозит — весь день работала нормально,
а вдруг начала притормаживать. Если вы даже не догадываетесь, из-за чего это
случилось, вам нужно использовать программу top (рис. 5.3) — она выводит список процессов с сортировкой по процессорному времени. То есть на вершине списка будет процесс, который занимает больше процессорного времени, чем сама
система. Вероятно, из-за него и происходит эффект "торможения".

Рис. 5.3. Программа top

На рис. 5.3 показано, что больше всего процессорного времени (0.3%) занимает программа top. Конечно, в реальных условиях все будет иначе. Выйти из про-

Глава 5. Процессы

59

граммы top можно, нажав клавишу . Кроме действуют следующие клавиши:
 — показывает только пользовательские процессы (т. е. те процессы, которые запустил пользователь, под именем которого вы работаете в системе);
 — изменяет интервал обновления;
 — изменяет столбец, по которому сортируются задачи. По умолчанию задачи сортируются по столбцу %CPU, т. е. по процессорному времени, занимаемому процессом;
 — получить справку по остальным командам программы top.
Назначение столбцов программы top указано в табл. 5.1.
Таблица 5.1. Назначение столбцов программы top
Столбец

Описание

PID

Идентификатор процесса

USER

Имя пользователя, запустившего процесс

PR

Приоритет процесса

NI

Значение nice (см. разд. 5.3)

VIRT

Виртуальная память, использованная процессом (в Кбайт)

RES

Размер процесса, не перемещенный в область подкачки (в Кбайт).
Этот размер равен размерам сегментов кода и данных, т. е.
RES = CODE + DATA

S

Состояние процесса:
R — выполняется;
S — "спит" (режим ожидания), в этом состоянии процесс выгружен из оперативной памяти в область подкачки;
D — "непрерываемый сон" (uninterruptible sleep), из такого состояния процесс может вывести только прямым сигналом от
оборудования;
T — процесс в состоянии трассировки или остановлен;
Z ("зомби") — специальное состояние процесса, когда сам процесс уже завершен, но его структура еще осталась в памяти

%CPU

Занимаемое процессом процессорное время

%MEM

Использование памяти процессом

TIME+

Процессорное время, израсходованное с момента запуска
процесса

COMMAND

Команда, которая использовалась для запуска процесса (обычно
имя исполнимого файла процесса)

Часть I. Командная строка

60

5.3. Команды nice и renice:
изменение приоритета процесса
Предположим, что вы работаете с видео и вам нужно перекодировать файл из
одного видеоформата в другой. Конвертирование видео занимает много процессорного времени, а хотелось бы все сделать как можно быстрее и уйти раньше домой. Тогда вам поможет программа nice — она позволяет запустить любую программу с указанным приоритетом. Ясно — чем выше приоритет, тем быстрее будет
выполняться программа. Формат вызова команды следующий:
nice -n команда аргументы

Максимальный приоритет задается числом −20, а минимальный числом 19.
Приоритет по умолчанию равен 10.
Если процесс уже запущен, тогда для изменения его приоритета можно использовать команду renice:
renice –n -p PID

5.4. Перенаправление ввода/вывода
С помощью перенаправления ввода/вывода мы можем перенаправить вывод одной программы в файл или на стандартный ввод другой программы. Например, у
вас не получается настроить сеть, и вы хотите перенаправить вывод команды
ifconfig в файл, а затем разместить этот файл на форуме, где вам помогут разобраться с этой проблемой. А можно перенаправить список всех процессов (командой ps –ax) команде grep, которая найдет в списке интересующий вас процесс.
Рассмотрим следующую команду:
echo "some text" > file.txt

Символ > означает, что вывод команды, находящейся слева от этого символа,
будет записан в файл, находящийся справа от символа, при этом файл будет перезаписан.
Чуть ранее мы говорили о перенаправлении вывода программы ifconfig
в файл. Команда будет выглядеть так:
ifconfig > ifconfig.txt

Если вместо > указано >>, то исходный файл не будет перезаписан, а вывод команды добавится в конец файла:
echo "some text" > file.txt
echo "more text" >> file.txt
cat file.txt
some text
more text

Кроме символов > и >> для перенаправления ввода/вывода часто употребляется вертикальная черта |. Предположим, что мы хотим вывести содержимое файла big_text:
cat big_text

Глава 5. Процессы

61

Но в файле big_text много строк, поэтому мы ничего не успеем прочитать. Следовательно, целесообразно отправить вывод команды cat какой-нибудь программе,
которая будет выводить файл постранично, например:
cat big_text | more

Конечно, этот пример не очень убедительный, потому что для постраничного
вывода гораздо удобнее команда less:
less big_text

Вот еще один интересный пример. Допустим, мы хотим удалить файл file.txt без
запроса — для этого можно указать команду:
echo y | rm file.txt

Команда rm запросит подтверждение удаления (нужно нажать клавишу ), но
за нас это сделает команда echo.
И еще один пример. Пусть имеется большой файл и нам нужно найти в нем все
строки, содержащие подстроку "555-555". Чтобы не делать это вручную, можно
воспользоваться командой:
cat file.txt | grep "555-555"

Глава 6

Запись CD/DVD из консоли
6.1. Команда dd: создание образа диска
Довольно часто бывает нужно создать образ оптического диска (не знаю, как у
вас, но у меня такая потребность возникает примерно один раз в неделю). Причина
проста — или под рукой нет чистой болванки, или же нужно поработать с диском,
который придется отдать, но при этом нет никакого желания записывать его на
болванку.
В Windows для создания образа диска обычно используются посторонние программы, например Nero или WinImage. В Linux мы будем пользоваться только
средствами операционной системы.
Образ CD/DVD-диска можно создать с помощью команды dd:
dd if=/dev/cdrom of=~/cd.iso

Вместо /dev/cdrom надо подставить имя файла устройства вашего привода
CD/DVD (обычно этого делать не приходится, поскольку ссылка /dev/cdrom устанавливается самой системой на ваш привод CD/DVD).
Указанная команда создаст файл образа cd.iso, который будет записан в ваш домашний каталог. Аналогично с помощью этой команды можно создать и образ дискеты — только вместо /dev/cdrom нужно указать имя файла устройства /dev/fd0.
Что можно сделать с ISO-образом в Windows? Его можно записать на чистую
болванку или же открыть в специальной программе (например, ISOpen или UltraISO)
для изменения. В Linux открыть образ можно с помощью средств самой операционной системы. Для этого его надо просто подмонтировать к корневой файловой
системе с помощью команды следующего формата:
# mount -o loop -t iso9660 образ точка_монтирования

 опция -o loop означает, что будет монтироваться не файл устройства, а образ

диска, который записан на жесткий диск;
 параметр -t 9660 задает тип файловой системы образа: iso9660 — стандартная

файловая система для CD/DVD;
 после файловой системы указывается файл образа, например ~/cd.iso;
 последний параметр — это точка монтирования, каталог, к которому будет под-

монтирован образ (напомню, что каталог должен существовать).

Глава 6. Запись CD/DVD из консоли

63

ПРИМЕЧАНИЕ
В большинстве случаев команду mount нужно выполнять от имени пользователя root
или с помощью команд sudo или su.

В нашем случае для монтирования образа ~/cd.iso к каталогу /mnt/image нужно
выполнить команду:
# mount -o loop -t iso9660 ~/cd.iso /mnt/image

После этого можно обращаться к образу как к обычному каталогу:
ls /mnt/image

6.2. Команды cdrecord и dvdrecord:
запись образа на болванку
Предположим, у вас есть файл образа cd.iso, и нужно записать его на компактдиск, но вы не хотите (или не имеете возможности) использовать графические программы вроде Nero или k3b. В этом случае вам нужно использовать программу
cdrecord (пакет называется аналогично). Команда для записи образа на болванку
CD-R очень проста и выглядит так:
# cdrecord dev=0,0,0 -dao speed=16 файл_образа

Для записи DVD-R используется аналогичная команда:
# dvdrecord dev=0,0,0 -dao speed=4 файл_образа

В этой команде вам нужно изменить параметр dev — идентификатор устройства
CD/DVD. Если в вашей системе установлен только один привод CD/DVD, и он же
является пишущим, тогда, скорее всего, у него будет идентификатор 0,0,0. Но если
у вас несколько приводов CD/DVD (например, обычный и пишущий), вы должны
ввести следующую команду:
# cdrecord -scanbus

Команда выведет список приводов CD/DVD, установленных в вашей системе
(рис. 6.1). Вам нужно запомнить идентификатор нужного привода и использовать
его при записи образа диска.

Рис. 6.1. Идентификаторы приводов CD/DVD

Часть I. Командная строка

64

6.3. Команды очистки
перезаписываемых дисков
Для очистки диска DVD-RW используется команда:
# dvd+rw-format -f имя_устройства_DVD-RW

Для быстрой очистки CD-RW введите команду:
# cdrecord -v blank=fast dev=0,0,0

Если нужно произвести полную, а не быструю очистку, замените blank=fast на
blank=all.

6.4. Команда mkisofs: создание ISO-образа
Иногда нужно создать образ CD/DVD не с оригинального диска, а с каталогов
файловой системы. Другими словами — у вас есть файлы и каталоги, которые вам
нужно записать на CD/DVD. Технология CD/DVD не позволяет записывать файлы
и каталоги непосредственно на носитель — вам нужно создать каталог, поместить
в него все файлы и каталоги, которые вы хотите записать на оптический диск, затем создать по этому каталогу ISO-образ, а потом записать его на болванку.
Скопируйте все необходимые вам файлы в каталог ~/cd. Затем выполните
команду:
mkisofs -r -jcharset koi8-r -o ~/cd.iso ~/cd

Эта команда создаст по каталогу ~/cd файл образа cd.iso и поместит его в ваш домашний
каталог. Обратите внимание на кодировку локализованной версии — сейчас используется
KOI8-R. Если у вас другая кодировка, например UTF-8, вы должны указать ее:
mkisofs -r -jcharset utf8 -o ~/cd.iso ~/cd

Указание кодировки необходимо для правильного отображения русскоязычных
имен файлов и каталогов под управлением MS Windows.
После создания ISO-образа его нужно записать на носитель с помощью команды
cdrecord, как было показано ранее. После записи не забудьте удалить образ, чтобы
он не занимал места на диске.
Существует способ записи каталога на CD/DVD без создания промежуточного
ISO-образа. Для этого служит команда:
mkisofs -jcharset кодировка /каталог | cdrecord -опции

6.5. Преобразование образов дисков
Иногда нужно записать созданный в другой программе образ диска, формат которого отличается от ISO9660. Чаще всего встречаются образы дисков в форматах
IMG, BIN, CUE, NRG, CCD.
Если у файла образа "расширение" (в Linux нет понятия "расширение", поэтому
данное слово взято в кавычки) img, то это еще не означает, что формат образа —
ISO9660. Одни программы, например K3b, действительно создают образ в формате

Глава 6. Запись CD/DVD из консоли

65

ISO9660 и записывают его в файл с расширением img, а другие — могут записывать в файл с таким же расширением образы диска в собственных форматах.
Файлы .bin/.cue можно записать на диск с помощью программы cdrdao или преобразовать в ISO с помощью программы bchunk.
Nero записывает образы диска в формате NRG, который можно преобразовать в
ISO с помощью программы nrg2iso. Если вам нужно открыть NRG-образ, чтобы
просмотреть его содержимое, вы это можете сделать с помощью команды:
mount -t udf,iso9660 -o loop,ro,offset=307200 файл.nrg точка_монтирования

Образ в формате CloneCD (ccd) можно преобразовать в ISO с помощью программы ccd2iso.

6.6. Создание и монтирование файлов
с файловой системой
Иногда (например, для создания мини-дистрибутива) нужно создать файл, содержащий собственную файловую систему. Первым делом нужно создать пустой
файл, потом создать в нем файловую систему, а затем подмонтировать этот файл
к корневой файловой системе. Все это можно сделать с помощью трех команд:
# dd if=/dev/zero of=/file.fs bs=1k count=100000
# mkfs.ext2 -F /file.fs
# mount -t ext2 -o loop file.fs /mnt/disk

Первая команда создает пустой файл размером почти 100 Мбайт (100 000 Кбайт),
вторая команда создает в этом файле файловую систему типа ext2, третья — монтирует файл к каталогу /mnt/disk.

Глава 7

Команды для работы с текстом
7.1. Команда cmp: сравнение двух файлов
Команда cmp используется для сравнения двух файлов. Если файлы идентичны,
то cmp вообще ничего не выводит. А вот если файлы отличаются, то cmp выводит
номер строки и номер символа в строке, откуда начинается различие.
Команда cmp более универсальна, поскольку она может использоваться как для
сравнения текстовых, так и двоичных файлов. А вот команда diff и ее аналоги
умеют сравнивать только текстовые файлы.
Формат вызова команды следующий:
cmp [параметры] файл1 файл2

Параметры команды cmp указаны в табл. 7.1.
Таблица 7.1. Параметры команды cmp
Параметр

Описание

-c

Вывод отличающихся символов

-i n

Игнорировать первые n символов

-l

Вывод позиций всех отличий, а не только первого

-s

Не выводить информацию на экран, при этом код возврата будет следующим:
0 — файлы одинаковые;
1 — файлы отличаются;
2 — ошибка при открытии одного из файлов

7.2. Команда column:
разбивка текста на столбцы
Команда column используется для разбивки текста на несколько столбцов.
Текст может быть прочитан как из файла, так и со стандартного ввода, если файл
не указан.

Глава 7. Команды для работы с текстом

67

Формат вызова команды:
column [параметры] [файл]

Параметры команды column приведены в табл. 7.2.
Таблица 7.2. Параметры команды column
Параметр

Описание

-c n

Задает количество столбцов (число n)

-s символ

Указанный символ будет использоваться в качестве разделителя столбцов

-t

Текст будет форматироваться как таблицы. По умолчанию
разделителем полей считается пробел, но с помощью параметра -s можно задать другой разделитель

-x

Сначала будут заполняться столбцы, а потом строки

7.3. Команда comm:
еще одна команда для сравнения файлов
Команда comm сравнивает содержимое двух файлов, которые были перед этим
отсортированы командой sort. Вывод программы располагается в три столбца.
В первом выводятся строки из файла1, во втором — из файла2, а в третьем — строки, которые имеются в обоих файлах.
Формат вызова программы следующий:
comm [параметры] файл1 файл2

Параметры команды comm приведены в табл. 7.3.
Таблица 7.3. Параметры команды comm
Параметр

Описание

-1

Не выводить первый столбец

-2

Не выводить второй столбец

-3

Не выводить третий столбец

-12

Будет выведен только третий столбец

-13

Будет выведен только второй столбец

-23

Вывод только первого столбца

7.4. Команда diff: сравнение файлов
Команда используется для сравнения двух файлов. Формат вызова программы diff:
diff параметры файл1 файл2

Часть I. Командная строка

68

В выводе программы отличающиеся строки помечаются символами > и

ввести команду:
open

Лично мне больше нравится первый вариант, поскольку он позволяет сэкономить время. При подключении к серверу вы сможете ввести имя пользователя
и пароль:
[den@dhsilabs ~]$ ftp
ftp> open ftp.narod.ru
Connected to ftp.narod.ru.
220 ftp.narod.ru (Libra FTP daemon 0.17 20050906)
500 Unrecognized command AUTH
Name (ftp.narod.ru:den): den
331 Password required
Password:
230 Logged in, proceed
Remote system type is UNIX.
ftp>

Подключившись к серверу, вы можете ввести команду help, чтобы просмотреть
список доступных команд. Для получения справки по той или иной команде введите help . Наиболее популярные команды приведены в табл. 8.1.
Таблица 8.1. Некоторые команды FTP-клиента
Команда

Описание

ls

Вывод содержимого каталога

get

Загрузить файл с сервера

put

Загрузить файл на сервер

mget

Получить несколько файлов с сервера. Допускается использование масок файлов, например *.rpm

mput

Загрузить несколько файлов на сервер

cd

Изменить каталог

mkdir

Создать каталог

rmdir

Удалить пустой каталог

delete

Удалить файл

Часть I. Командная строка

88

Кроме ftp, в Linux есть и другие текстовые FTP-клиенты, например: NcFTP
(http://www.ncftp.com), lukemftp (ftp://ftp.netbsd.org/pub/NetBSD/misc/lukemftp/),
lftp (http://ftp.yars.free.net/projects/lftp/) и др. Все эти FTP-клиенты не входят
в состав дистрибутива, их нужно устанавливать самостоятельно. Но стоит ли это
делать — решать вам. Ведь все они подобны стандартному клиенту ftp и обладают
двумя-тремя дополнительными функциями, которые, возможно, вам и не понадобятся. Например, NcFTP умеет докачивать файлы, а lftp — загружать одновременно несколько файлов. В любом случае, вы можете изучить документацию по тому
или иному FTP-клиенту (ее легко найти в Интернете), а потом решить, стоит его
использовать или нет.

8.8. Команда wget: загрузка файлов
Программа wget — это лучший текстовый менеджер закачки файлов. Программа поддерживает протоколы HTTP, HTTPS и FTP. Использовать ее нужно так:
wget [параметры] URL

Параметров у wget очень и очень много, и со всеми ними вы ознакомитесь на
странице man wget. Самые полезные параметры собраны в табл. 8.2.
Таблица 8.2. Некоторые параметры wget
Параметр

Описание

--background

Перейди в фоновый режим после запуска

--quiet

Тихий режим, сообщения wget не выводятся

--input-file=file

Считать URL из файла file, файл не обязательно должен быть
в формате HTML. Если вы указали URL в файле и в командной
строке, то сначала будут загружены URL из командной строки, а
потом из файла

--force-html

Обязательно считать файл, указанный в предыдущем параметре, HTML-файлом

--tries=number

Устанавливает количество попыток загрузки URL

--no-clobber

Если при загрузке файла оборвалось соединение, то этот параметр позволит продолжить загрузку с места обрыва

--continue

Возобновление загрузки файла, например, если прервалась
связь. Этот параметр нужно использовать, если вы забыли указать параметр --no-clobber, а связь прервалась и вам нужно
докачать файл, а не начинать его загрузку заново

--wait=seconds

Задает паузу в секундах между загрузками и повторами, что позволяет снизить нагрузку на сервер

--quota=quota

Задает максимальный размер загружаемых файлов (в байтах,
килобайтах (после числа указывается k) и мегабайтах (после
числа — m)). Квота не работает при загрузке одного файла, поскольку даже если квота превышена, то текущий файл загружается до конца (если есть физически место на диске)

Глава 8. Команды для работы с сетью и Интернетом

89

Таблица 8.2 (окончание)
Параметр

Описание

--http-user=user

Задают имя пользователя и пароль при HTTPаутентификации, тип аутентификации устанавливается автоматически программой

--http-passwd=pass
--proxy-user=user

Задает имя пользователя и пароль прокси-сервера

--proxy-passwd=pass
--passive-ftp

Пассивный режим FTP, обычно используется при наличии
брандмауэра

--recursive

Включить рекурсивную загрузку, которая используется для
рекурсивной загрузки сайтов

--level=depth

Максимальная длина рекурсивной загрузки (по умолчанию
5 уровней)

Примеры использования:
wget --recursive http://dkws.org.ua
wget http://dkws.org.ua/1.zip

Первая команда создаст пятиуровневую копию сайта http://dkws.org.ua, а вторая просто загрузит файл 1.zip с http://dkws.org.ua.

8.9. Команды для диагностики сети
Причины отказа сети могут быть физическими и программными. Физические
связаны с неработающим сетевым оборудованием или повреждением среды передачи данных. Программные связаны с неправильной настройкой сетевого интерфейса. Как правило, избавиться от программных проблем помогает конфигуратор
сети — вы еще раз его запускаете и настраиваете сетевые интерфейсы, только правильно. Если сомневаетесь в ваших действиях, обратитесь за помощью к более
опытному коллеге.
Для диагностики работы сети мы будем использовать стандартные сетевые утилиты, которые входят в состав любого дистрибутива Linux. Предположим, что
у нас не работает PPPoE/DSL-соединение. Проверить, "поднят" ли сетевой интерфейс, можно с помощью команды ifconfig. На рис. 8.10 видно, что сначала
я предпринял попытку установить соединение (ввел команду sudo pon dslprovider), а затем вызвал ifconfig, чтобы убедиться, установлено ли соединение.
В случае если соединение не было бы установлено, интерфейса ppp0 в списке не
было. Интерфейс eth0 (рис. 8.10) относится к первой сетевой плате (вторая называется eth1, третья — eth2 и т. д.), а интерфейс lo — это интерфейс обратной петли,
который используется для тестирования программного обеспечения (у вас он всегда будет "поднят").
Если же интерфейс не поднят, нам нужно просмотреть файл /var/log/messages
сразу после попытки установки сообщения:
tail -n 10 /var/log/messages

Часть I. Командная строка

90

Рис. 8.10. Программа ifconfig

Данная команда просматривает "хвост" файла протокола (выводит последние
10 сообщений). В случае удачной установки соединения сообщения в файле протокола будут примерно следующими:
Feb 6 14:28:33 user-desktop pppd[5176]: Plugin rp-pppoe.so loaded.
Feb 6 14:28:33 user-desktop kernel: [17179852.932000] CSLIP: code copyright 198 9 Regents
of the University of California
Feb 6 14:28:33 user-desktop kernel: [17179852.944000] PPP generic driver versio n 2.4.2
Feb 6 14:28:33 user-desktop pppd[5183]: pppd 2.4.4b1 started by root, uid 0
Feb 6 14:28:33 user-desktop pppd[5183]: PPP session is 2838
Feb 6 14:28:33 user-desktop kernel: [17179852.984000] NET: Registered protocol family 24
Feb 6 14:28:33 user-desktop pppd[5183]: Using interface ppp0
Feb 6 14:28:33 user-desktop pppd[5183]: Connect: ppp0 eth0
Feb 6 14:28:33 user-desktop pppd[5183]: Remote message: Login ok
Feb 6 14:28:33 user-desktop pppd[5183]: PAP authentication succeeded
Feb 6 14:28:33 user-desktop pppd[5183]: peer from calling number 00:15:F2:60:28 :97
authorized
Feb 6 14:28:33 user-desktop pppd[5183]: local IP address 193.254.218.243
Feb 6 14:28:33 user-desktop pppd[5183]: remote IP address 193.254.218.129
Feb 6 14:28:33 user-desktop pppd[5183]: primary DNS address 193.254.218.1
Feb 6 14:28:33 user-desktop pppd[5183]: secondary DNS address 193.254.218.27

Глава 8. Команды для работы с сетью и Интернетом

91

Первая строчка — сообщение о том, что загружен модуль поддержки PPPoE.
Следующие два сообщения информируют нас о поддержке нашим компьютером
протоколов CSLIP и PPP. После сообщается, что демон pppd запущен, сообщается,
от чьего имени он запущен (root) и версия самого pppd. Далее сообщается имя используемого интерфейса (ppp0) и имя вспомогательного интерфейса (помните, что
протокол PPPoE подразумевает передачу кадров PPP по Ethernet) — eth0. Следующие два сообщения свидетельствуют об удачной регистрации:
Feb

6 14:28:33 user-desktop pppd[5183]: Remote message: Login ok

Feb

6 14:28:33 user-desktop pppd[5183]: PAP authentication succeeded

Затем система сообщает нам наш IP-адрес, адрес удаленного компьютера, который произвел аутентификацию, а также IP-адреса серверов DNS.
А вот пример неудачной попытки соединения:
Feb

6 09:23:48 user-desktop pppd[6667]: PPP session is 2336

Feb

6 09:23:48 user-desktop pppd[6667]: Using interface ppp1

Feb

6 09:23:48 user-desktop pppd[6667]: Connect: ppp1 eth0

Feb

6 09:23:48 user-desktop pppd[6667]: Remote message: Login incorrect

Feb

6 09:23:48 user-desktop pppd[6667]: Connection terminated.

Причина неудачи понятна: имя пользователя или пароль неправильные, о чем
красноречиво свидетельствует сообщение "Login incorrect". Для того чтобы изменить имя пользователя или пароль, запустите конфигуратор pppoeconf. Но не спешите этого делать: если в предыдущий раз соединение было установлено (а настройки соединения вы не изменяли), возможно, нужно обратиться к провайдеру —
это явный признак неправильной работы оборудования на стороне провайдера.
Вот еще один пример, характерный для PPPoE:
Feb

6 09:23:48 user-desktop pppd[6667]: PPP session is 2336

Feb

6 09:23:48 user-desktop pppd[6667]: Using interface ppp1

Feb

6 09:23:48 user-desktop pppd[6667]: Connect: ppp1 eth0

Feb

6 09:23:48 user-desktop pppd[6667]: Connection terminated.

Это явный пример неправильной работы оборудования провайдера. Возможно,
нужно перезагрузить точку доступа (access point), т. е. просто выключите и включите ее. Если это не помогает, тогда обращайтесь к провайдеру.
Наиболее простая ситуация, когда сеть вообще не работает. В этом случае очень
легко обнаружить причину неисправности. Если работает устройство, значит, повреждена среда передачи данных (сетевой кабель). В случае с модемной линией
нужно проверить, нет ли ее обрыва. В случае с витой парой обрыв маловероятен
(хотя возможен), поэтому нужно проверить, правильно ли обжат кабель (возможно,
нужно обжать витую пару заново).
Намного сложнее ситуация, когда сеть то работает, то нет. Например, вы не можете получить доступ к какому-нибудь узлу, хотя пять минут назад все работало
отлично. Если исключить неправильную работу удаленного узла, к которому вы
подключаетесь, следует поискать решение в маршруте, по которому пакеты добираются от вашего компьютера до удаленного узла. Сначала пропингуем удаленный

Часть I. Командная строка

92

узел. Для этого используется команда ping (прервать выполнение команды ping
можно с помощью нажатия комбинации клавиш +):
ping dkws.org.ua
PING dkws.org.ua (213.186.114.75) 56(84) bytes of data.
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=1 ttl=58 time=30.7 ms
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=2 ttl=58 time=24.8 ms
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=5 ttl=58 time=12.2 ms
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=6 ttl=58 time=159 ms
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=7 ttl=58 time=19.3 ms
64 bytes from wdt.org.ru (213.186.114.75): icmp_seq=9 ttl=58 time=29.0 ms
...

В этом случае все нормально. Но иногда ответы от удаленного сервера то приходят, то не приходят. Чтобы узнать, в чем причина (где именно теряются пакеты),
нужно выполнить трассировку узла:
tracepath dkws.org.ua

Рис. 8.11. Проблема с прохождением пакетов

Глава 8. Команды для работы с сетью и Интернетом

93

В некоторых дистрибутивах вместо команды tracepath используется команда
traceroute, а в Windows — tracert. На рис. 8.11 изображено выполнение команды tracepath. Сразу видно, что есть определенные проблемы с прохождением пакетов до удаленного узла.
Понятно, что по пути пакеты теряются. Для того чтобы выяснить причину, вам
нужно обратиться к администратору того маршрутизатора, который не пропускает
дальше пакеты. Причина именно в нем. В данном случае, как видно из рисунка,
пакеты доходят до маршрутизатора dc-m7i-1-ge.interfaces.dc.utel.ua, а после него
движение пакетов прекращается.
Если соединение установлено (о чем свидетельствует наличие поднятого интерфейса в выводе ifconfig), а Web-страницы не открываются, попробуйте пропинговать любой удаленный узел по IP-адресу. Если не знаете, какой узел пинговать
(т. е. не помните ни одного IP-адреса), пропингуйте узел 213.186.114.75. Если вы
получите ответ, а странички по-прежнему не открываются, когда вы вводите символьное имя, значит, у вас проблемы с DNS: сервер провайдера почему-то не передал вашему компьютеру IP-адреса DNS-серверов. Позвоните провайдеру, выясните
причину этого, а еще лучше уточните IP-адреса серверов DNS и укажите их в файле /etc/resolv.conf. Формат этого файла прост:
nameserver IP-адрес

Например:
nameserver 193.254.218.1
nameserver 193.254.218.27

Всего можно указать до четырех серверов DNS.
Если же не открывается какая-то конкретная страничка, а все остальные работают нормально, тогда понятно, что причина в самóм удаленном сервере, а не
в ваших настройках.

Глава 9

Команды системного
администратора
9.1. Программы разметки диска
В этой главе будут рассмотрены две программы для разметки диска — классическая программа fdisk и более продвинутая parted. Реально для разметки диска (если
вам придется это делать) вы будете использовать parted, поскольку она умеет изменять размеры разделов, что пригодится при переразметке диска. А вот fdisk можно
использовать разве что для разметки новых жестких дисков. Изменить размер раздела без потери данных fdisk не может. Вам нужно удалить один из разделов, а вместо
него создать несколько разделов меньшего размера — только так и не иначе.
Зато fdisk установлена по умолчанию во всех дистрибутивах и ее не нужно доустанавливать самостоятельно.

9.1.1. Программа fdisk
Введите команду (можно использовать короткие имена):
# fdisk

Например, если вы подключили винчестер как вторичный мастер, то команда
будет следующей:
# fdisk /dev/sda

Чтобы убедиться, что диск не размечен, введите команду p. Программа выведет
пустую таблицу разделов (рис. 9.1).
Самое время создать раздел. Для этого используется команда n (рис. 9.2). Кстати, для справки можете ввести команду m, которая выведет список доступных команд fdisk (рис. 9.3).

Рис. 9.1. Таблица разделов пуста

Глава 9. Команды системного администратора

95

Рис. 9.2. Создание нового раздела

Рис. 9.3. Список команд программы fdisk

После ввода команды n программа попросит вас уточнить, какого типа должен
быть раздел. Можно выбрать первичный или расширенный раздел. В нашем случае
больше подойдет первичный, поэтому вводим букву p. Затем нужно ввести номер
раздела. Поскольку это первый раздел, то вводим 1. После чего fdisk попросит
ввести номер первого цилиндра. Это первый раздел, поэтому вводим номер 1. После ввода первого цилиндра нужно ввести номер последнего цилиндра. Чтобы не
высчитывать на калькуляторе номер цилиндра, намного проще ввести размер раздела. Делается это так: +M. После числа должна идти именно буква M, иначе размер будет воспринят в байтах, а этого нам не нужно. Например, если вы хотите создать раздел размером 10 Гбайт, то введите +10240M.
Для создания второго раздела опять введите команду n. Программа вновь попросит тип раздела, номер первого цилиндра (это будет номер последнего цилиндра первого раздела плюс 1) и размер раздела. Если вы хотите создать раздел до
"конца" диска, то просто введите номер последнего цилиндра.
Теперь посмотрим на таблицу разделов. Для этого опять введите команду p
(рис. 9.4).

Часть I. Командная строка

96

Рис. 9.4. Создание второго раздела, вывод таблицы разделов

По умолчанию программа fdisk создает Linux-разделы. Если вы собираетесь
работать только в Linux, можно оставить и так, но ведь не у всех есть Linux. Если
вы снимете этот винчестер, чтобы, например, переписать у товарища большие файлы, то вряд ли сможете комфортно с ним работать. Прочитать данные (например, с
помощью Total Commander) вам удастся, а что-либо записать — уже нет. Поэтому
давайте изменим тип разделов. Для этого используется команда t. Введите эту команду. Программа запросит у вас номер раздела и тип файловой системы.
С номером раздела все ясно, а вот с кодом файловой системы сложнее. Введите L,
чтобы просмотреть доступные файловые системы (рис. 9.5).

Рис. 9.5. Коды файловых систем

Код FAT32 — b. Введите его, и вы увидите сообщение программы, что тип файловой системы изменен (рис. 9.6).
Еще раз введите команду p, чтобы убедиться, что все нормально. Для сохранения таблицы разделов введите w, а для выхода без сохранения изменений — q.

Глава 9. Команды системного администратора

97

Рис. 9.6. Тип файловой системы изменен

9.1.2. Программа parted
Утилита parted (название — сокращение от PARTition EDitor) является консольной программой, которая используется для создания, удаления, копирования,
изменения размера и размещения разделов диска.
Программа поддерживает следующие таблицы разделов:
 BSD;
 MSDOS;
 SUN;
 MAC;
 PC98;
 GPT.
Кроме того, программа поддерживает прямой доступ (raw access) к диску, что
полезно при работе с логическими томами (LVM) и RAID-массивами.
Программа parted поддерживает множество файловых систем, но не для всех
файловых систем доступны все выполняемые программой действия. В табл. 9.1
представлена информация о действиях, которые можно выполнить над той или
иной файловой системой.
Таблица 9.1. Поддерживаемые действия
Файловая
система

Обнаружение

ext3

+

ext2

+

fat32

Создание

Изменение
размера

Копирование

Проверка

+

+

+

+

+

+

+

+

+

+

+

+

fat16

+

+

+

+

+

ntfs

+

+

+

+

+

linux-swap

+

+

+

+

+

ReiserFS

+

+

+

+

+

JFS

+

XFS

+

UFS

+

Программа не умеет создавать разделы ext3 и ext4, но она может создать раздел
ext2, который можно без особых проблем преобразовать в ext3 или ext4 (см. главу 4). Разделы типов JFS, XFS и UFS только обнаруживаются программой, но она
не может выполнять над ними никаких действий.

Часть I. Командная строка

98

ПРИМЕЧАНИЕ
Для работы с NTFS-разделами обязательна установка пакета linux-ntfs.

Запустим parted:
# parted

Например:
# parted /dev/sda

ПРИМЕЧАНИЕ
Не забывайте, что программа должна быть выполнена от имени root! Получить права
root можно с помощью команды sudo, например sudo parted /dev/sda.

Рис. 9.7. Программа parted

Введите команду print для просмотра имеющихся разделов:
(parted) print
Disk geometry for /dev/sda: 0.000-9990.109 megabytes
Disk label type: msdos
Minor
Start
End
Type
Filesystem
1
0.031
512.000 primary
linux-swap
2
512.000
9990.109 primary
ext2

Flags
boot

Первая колонка — это номер раздела, вторая и третья — смещение (в мегабайтах) от "начала" диска. Следующая колонка — тип раздела, далее — тип файловой
системы. Последняя колонка — флаги, например boot — загрузочный раздел.
Введите команду help, чтобы увидеть список команд parted (рис. 9.8). Команды
parted приведены в табл. 9.2.
Таблица 9.2. Основные команды parted
Команда

Описание

check n

Проверить раздел с номером n

cp [устройство] n m

Копировать файловую систему из раздела n в раздел m, устройство — это номер устройства, где находится раздел n. Если устройство не задано, то считается, что используется текущее устройство

mklabel тип

Создает новую метку диска

mktable тип

Создает новую таблицу разделов

mkfs n тип_фс

Создает файловую систему заданного типа на разделе n

Глава 9. Команды системного администратора

99

Таблица 9.2 (окончание)
Команда

Описание

mkpart тип [фс] нач
кон

Создать раздел указанного типа, [фc] — необязательный
параметр, задающий тип файловой системы. Параметры нач
и кон задают начало и конец раздела

move n нач кон

Переместить раздел с номером n, нач и кон — конечные "координаты" раздела, его начало и конец, заданные как смещение от "начала" диска в мегабайтах

print
[devices|free|all|n]

Отображает таблицу разделов (если параметры не заданы),
список устройств (devices), свободное место (free), все найденные разделы (all) или информацию о разделе с номером n

quit

Выход из программы

rescue нач кон

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

resize n нач кон

Изменяет размер раздела n

rm n

Удаляет раздел с номером n

select устройство

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

set n флаг состояние

Изменяет состояние флага для раздела n. Доступные флаги
описаны в табл. 9.3

unit устройство

Устанавливает устройство по умолчанию

version

Выводит версию parted

Рис. 9.8. Команда help

Часть I. Командная строка

100

ПРИМЕЧАНИЕ
Помнить формат каждой команды необязательно. Если вы введете команду, но не
укажете ее параметры, то они будут запрошены.

Таблица 9.3. Флаги разделов
Флаг

Тип раздела

Описание

boot

Mac, msdos, pc98

Флаг загрузочного раздела. Нужен для некоторых
операционных систем

lba

msdos

Нужен для MS DOS, MS Windows 9x и MS Windows
ME, чтобы эти ОС использовали для раздела режим линейной адресации (LBA)

swap

Mac

Устанавливается, если раздел является разделом
подкачки Linux

root

Mac

Устанавливается, если раздел является корневым
разделомLinux

raid

msdos

Раздел используется в RAID-массиве

lvm

msdos

Раздел используется как физический том в LVM

hidden

msdos, pc98

Скрытый раздел, устанавливается, если нужно
скрыть от операционных систем семейства
Microsoft

Рис. 9.9. Программа GParted

Глава 9. Команды системного администратора

101

Как видите, программа parted намного более эффективна, чем fdisk. Любителям графического интерфейса можно порекомендовать графическую версию этой
программы — GParted (рис. 9.9).

9.2. Информация о системе и пользователях
9.2.1. Команда uptime: информация о работе системы
Команда uptime (рис. 9.10) выводит статистическую информацию о работе системы: сколько времени прошло с момента последней перезагрузки (собственно, это
и есть время "uptime"), сколько пользователей в данный момент подключено к системе и среднюю загрузку системы за последние 1, 5 и 15 минут.

Рис. 9.10. Команда uptime

9.2.2. Команда users: информация о пользователях
Команда выводит информацию о пользователях, подключенных к системе
в данный момент. На рис. 9.11 видно, что пользователь den подключился к системе
двумя способами: вошел в консоли и в графическом режиме (или по FTP, ssh,
telnet — способы подключения к системе могут быть разные).

Рис. 9.11. Команда users

9.2.3. Команды w, who, ftpwho и whoami:
информация о пользователях
Три родственные команды w, who и whoami выводят следующую информацию
(рис. 9.12):
 команда w — список пользователей, подключенных к системе; виртуальный терминал, с которого работает пользователь; время входа в систему для каждого
пользователя, статистику использования системы (IDLE — время простоя,
JCPU — использование процессора), выполняемые каждым пользователем задачи;

Часть I. Командная строка

102

 команда who — список пользователей, подключенных к системе; время и дату

входа каждого пользователя;
 команда whoami — имя пользователя, который ввел команду.

Рис. 9.12. Команды w, who и whoami

Команда ftpwho похожа на команду who, но выводит только пользователей FTPсервера, подключенных в данный момент к серверу.

9.3. Планировщик at
9.3.1. Команда at: добавление задания
Иногда нужно просто выполнить определенные команды в определенное время
(однократно), поэтому редактировать для этого таблицу crontab не совсем уместно.
Такую задачу можно решить более рационально. Убедитесь, что у вас установлен
и запущен демон atd. После этого введите команду:
at [дата]

Затем просто вводите команды, которые вы хотите выполнить в указанное время. Для завершения ввода нажмите комбинацию клавиш +. Время указывается в AM/PM-формате — например, если вам нужно выполнить команды
в 14:00, то вы должны ввести команду: at 2pm.

9.3.2. Команды atq и atrm: очередь заданий
и удаление задания
Просмотреть очередь заданий можно командой atq, а удалить какое-либо задание — командой atrm.
На рис. 9.13 изображено добавление команды в очередь atd, просмотр очереди,
удаление задачи и повторный просмотр очереди.
В целях повышения безопасности в файл /etc/at.deny можно добавить команды,
которые запрещены для выполнения планировщиком at.

Глава 9. Команды системного администратора

103

Рис. 9.13. Использование atd

9.4. Планировщик crond
В Linux есть специальный демон crond, позволяющий выполнять программы по
расписанию. Откройте конфигурационный файл демона crond — /etc/crontab (листинг 9.1).
Листинг 9.1. Пример файла /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root
02 4 * * * root
22 4 * * 0 root
42 4 1 * * root

nice
nice
nice
nice

-n
-n
-n
-n

19
19
19
19

run-parts
run-parts
run-parts
run-parts

--report
--report
--report
--report

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

Параметр SHELL задает имя программы-оболочки, параметр PATH — путь поиска
программ, MAILTO — имя пользователя, которому будет отправлен отчет о выполнении расписания, а HOME — домашний каталог crond.
Но самое главное — не эти параметры, а сама таблица расписаний, занимающая
в нашем случае последние четыре строки листинга. Согласно этой таблице, каждый
час будут выполняться программы, из каталога /etc/cron.hourly, каждый день — из
каталога /etc/cron.daily, каждую неделю — из каталога /etc/cron.weekly и раз в месяц — из каталога /etc/cron.monthly.
Предположим, вам нужно каждый день выполнять команду update_av
ftp://server.ru/bases/. В каталоге /etc/cron.daily создайте файл update_av следующего содержания:
#!/bin/bash
update_av ftp://server.ru/bases/

Часть I. Командная строка

104

Этот файл представляет собой небольшой bash-сценарий (сценарий командного
интерпретатора). Теперь сделаем его исполнимым:
# chmod +x update_av

Правда, удобно?
Но иногда нам бывает нужно создать более гибкое расписание. Например, мы
хотим, чтобы одна программа выполнялась в 7:00, а другая в 7:20. Тут простым
добавлением сценария в каталог /etc/cron.daily уже не отделаешься. Чтобы создать
такое расписание, вам придется изучить формат записей таблицы расписаний:
минуты (0−59) часы (0−23) день (1−31) месяц (1−12) день_недели (0−6,
0 — Вс) команда

Чтобы реализовать наше расписание, следует добавить в файл /etc/crontab следующие строки:
0

7

*

*

*

/usr/bin/command1 arguments

20

7

*

*

*

/usr/bin/command2 arguments

Первая команда будет запускаться каждый день в 7 часов утра, а вторая — тоже
каждый день, но в 7:20.
Зная формат файла crontab, мы можем отредактировать стандартную таблицу
расписаний (см. листинг 9.1). Обратите внимание: команды, выполняемые ежедневно, будут запускаться в 4 часа утра. Это, конечно, удобно, но они не будут выполнены, если вы выключаете сервер на ночь. Поэтому давайте установим другое
время, например 8 часов утра:
02 8 * * * root nice -n 19 run-parts --report /etc/cron.daily

Аналогичная ситуация и с еженедельным запуском. Программы будут запущены
не только в 4:22 утра, но еще и в воскресенье. Однако на выходные вы точно выключаете свой сервер (впрочем, это зависит от политики организации — в некоторых организациях на выходные все компьютеры и не выключают). Поэтому целесообразно назначить запуск на понедельник в 8 часов 22 минуты:
22 8 * * 1 root nice -n 19 run-parts --report /etc/cron.weekly

С ежемесячным запуском вроде бы все нормально — программы будут выполняться в 4:42 первого числа каждого месяца. Хотя время лучше изменить на 8:42:
42 8 1 * * root nice -n 19 run-parts --report /etc/cron.monthly

9.5. Планировщик anacron
Планировщик anacron — непосредственный родственник crond, дальнейшее
его развитие. Главное преимущество anacron заключается в том, что он, в отличие
от crond, учитывает время, когда компьютер был выключен. Планировщик crond
родом из UNIX, а эта операционная система устанавливалась только на серверах,
которые всегда включены. Предположим, что вам нужно каждый понедельник
в 7 часов утра рассылать некоторую информацию вашим сотрудникам. Вы настроили crond так, чтобы он запускал сценарий отправки сообщений каждый понедельник в 7 утра. Но вот беда — в 6 часов утра выключили электричество, а вклю-

Глава 9. Команды системного администратора

105

чили его, скажем, в 7:20. Но 7:20 — это не 7:00, следовательно, crond не выполнит задание по отправке сообщений, а ваши сотрудники не получат важную информацию.
Anacron работает не так. Если он обнаружил, что некоторые задания не выполнены по тем или иным причинам (выключение электричества, перезагрузка компьютера), он обязательно выполнит их. Поэтому ваши сотрудники получат информацию, но с небольшой задержкой. Все же лучше, чем получить важную
информацию лишь в следующий понедельник.
Но и у anacron есть свои недостатки. В частности, пользователи не могут создавать свои собственные расписания, а файл /etc/anacrontab может редактировать
только root. К тому же более старый crond является более гибким в настройке —
например, вы можете точно указать часы и минуты, а в случае с anacron можно
указать только период, когда будет выполнена команда.
Формат файла /etc/anacrontab выглядит так:
Период

Задержка

ID

Команда

Например:
1

5

cron.daily

run-parts /etc/cron.daily

7

10

cron.weekly

run-parts /etc/cron.weekly

30

75

cron.monthly

run-parts /etc/cron.monthly

9.6. Команда date: вывод и установка даты
и времени
Команда date используется для вывода текущей даты. Эта команда может применяться также для установки даты, если запущена от имени администратора.
Пример использования:
$ date
# date 1609171707

Первая команда выводит дату, а вторая — устанавливает дату (при условии, что
команда запущена от имени root) 16 сентября (1609) 2007 года (07) и время 17:17.
Как видите, установка даты осуществляется в формате MMddhhmmYY (MM — месяц, dd — число, hh — часы, mm — минуты, YY — год).
Команда date может вывести дату в указанном вами формате. В главе 3 мы подробно рассмотрели пользовательское использование команды date, а именно форматированный вывод даты и времени.

9.7. Команды free и df: информация
о системных ресурсах
Команда free выводит информацию об использовании оперативной и виртуальной памяти, а df — об использовании дискового пространства. На рис. 9.14 видно,
что в системе установлено всего 384 Мбайт ОЗУ, из них 247 Мбайт занято

Часть I. Командная строка

106

и 138 Мбайт — свободно. На жестком диске /dev/sda1 всего 2,8 Гбайт дискового
пространства, из них свободно — 1,66 Гбайт.

Рис. 9.14. Команды free и df

9.8. Команда md5sum: вычисление
контрольного кода MD5
Для проверки подлинности некоторых файлов, передаваемых через Интернет,
используется алгоритм MD5 (точнее, контрольный код, вычисленный с использованием этого алгоритма). Разработчик программы выкладывает в Интернете пакет
с этой программой и на своем сайте публикует контрольный код. Вы скачиваете
пакет и вычисляете его контрольный код. Если коды отличаются, то файл при передаче был поврежден (или это другая версия пакета, которая, возможно, была
подложена злоумышленником с целью ввода вражеского кода в вашу систему).
Использовать программу нужно так:
md5sum файл

9.9. Команда ssh: удаленный вход в систему
Раньше для организации удаленного доступа к консоли сервера использовался
протокол Telnet. В каждой сетевой операционной системе, будь то FreeBSD или
Windows 95 (которую, впрочем, сложно назвать сетевой), есть telnet-клиент. Данная программа так и называется — telnet (в Windows — telnet.exe).
После подключения с помощью telnet к удаленному компьютеру вы можете работать с ним как обычно. В окне telnet-клиента вы увидите как бы консоль удаленного компьютера: вы будете вводить команды и получать результат их выполнения —
все так, как если бы вы работали непосредственно за удаленным компьютером.
Но технологии не стоят на месте, и протокол Telnet устарел. Сейчас ним практически никто не пользуется. На его смену пришел SSH (Secure Shell). SSH, как
видно из названия, представляет собой безопасную оболочку. Главное отличие
от Telnet состоит в том, что все данные (включая пароли доступа к удаленному
компьютеру, передаваемые по SSH файлы) передаются в зашифрованном виде.
Во времена Telnet участились случаи перехвата паролей и другой важной информации, что и стало причиной создания SSH.

Глава 9. Команды системного администратора

107

SSH использует следующие алгоритмы для шифрования передаваемых данных:
BlowFish, 3DES (Data Encryption Standard), IDEA (International Data Encryption
Algorithm) и RSA (Rivest-Shamir-Adelman algorithm). Самыми надежными являются
алгоритмы IDEA и RSA. Поэтому, если вы передаете действительно конфиденциальные данные, лучше использовать один из этих алгоритмов.
В состав любого дистрибутива Linux входит ssh-сервер (программа, которая
и обеспечивает удаленный доступ к компьютеру, на котором она установлена)
и ssh-клиент (программа, позволяющая подключаться к ssh-серверу). Для установки SSH-сервера нужно установить пакет openssh (это разновидность SSH-сервера),
а для установки SSH-клиента — пакет openssh-clients.
Работать с ssh-клиентом очень просто. Для подключения к удаленному компьютеру введите команду:
ssh [опции]

В качестве адреса можно указать как IP-адрес, так и доменное имя компьютера.
Часто используемые опции программы ssh приведены в табл. 9.4.
Таблица 9.4. Опции программы ssh
Опция

Описание

-c blowfish|3des|des

Используется для выбора алгоритма шифрования при условии, что используется первая версия протокола SSH (об
этом позже). Можно указать blowfish, des или 3des

-c шифр

Задает список шифров, разделенных запятыми в порядке
предпочтения. Опция используется для второй версии
SSH. Можно указать blowfish, twofish, arcfour,
cast, des и 3des

-f

Переводит ssh в фоновый режим после аутентификации
пользователя. Рекомендуется использовать для запуска
программы X11. Например: ssh –f server xterm

-l имя_пользователя

Указывает имя пользователя, от имени которого нужно
зарегистрироваться на удаленном компьютере. Опцию использовать не обязательно, поскольку удаленный компьютер и так запросит имя пользователя и пароль

-p порт

Определяет порт ssh-сервера (по умолчанию используется
порт 22)

-q

"Тихий режим". Будут отображаться только сообщения о
фатальных ошибках. Все прочие предупреждающие сообщения в стандартный выходной поток выводиться не будут

-x

Отключает перенаправление X11

-X

Задействовать перенаправление X11. Полезна при запуске
X11-программ

-1

Использовать только первую версию протокола SSH

-2

Использовать только вторую версию протокола SSH. Вторая версия протокола более безопасна, поэтому при настройке SSH-сервера нужно использовать именно ее

108

Часть I. Командная строка

9.10. Устройства и драйверы
При установке нового устройства у вас могут возникнуть некоторые проблемы.
Вот список команд, позволяющих выяснить причину проблемы:
 uname –a — получить версию ядра, при установке настоящих Linux-драйверов
(а не Windows-драйверов через ndiswrapper) нужно, чтобы модуль (так в Linux
называются драйверы) был откомпилирован для соответствующей версии ядра;
 lspci, lsusb, lshw — помогают идентифицировать ваше устройство, выводят
соответственно список PCI-устройств, список USB-устройств и список оборудования компьютера;
 lsmod — выводит список загруженных модулей (драйверов устройств).
Следующие команды пригодятся для настройки сетевых интерфейсов, в том
числе и беспроводных:
 iwconfig — просмотреть информацию обо всех беспроводных интерфейсах;
 iwlist scan — найти беспроводные сети;
 sudo dhclient wlan0 — обновить IP-адрес и другие сетевые параметры интерфейса wlan0 (имя может быть другим), предварительно получив их от DHCPсервера;
 route — просмотр и изменение таблицы маршрутизации;
 sudo /etc/init.d/networking restart — перезапуск сети;
 dmesg | less — просмотреть сообщения ядра;
 sudo killall NetworkManager — остановить NetworkManager;
 iwevent — просмотреть события беспроводной сети;
 sudo /etc/init.d/dbus restart — перезапустить все сетевые демоны.
Рассмотрим еще несколько программ. Программа badblocks позволяет проверить
жесткий диск на наличие сбойных блоков. Проверка выполняется очень просто:
# badblocks -v

Например:
# badblocks -v /dev/hda

Параметр -v включает подробный режим работы, о каждом действии программа
будет выводить отчет. Желательно выполнять программу в однопользовательском режиме, чтобы ее работе ничто не мешало.
Иногда мы произносим слово "глючит", даже не задумываясь о его смысле. Например, "глючит" оперативка. А что же это такое — "глюк"? Это неисправность
устройства, проявляющаяся при определенных условиях или в определенных режимах его работы.
Конечно, "глюки" бывают не только аппаратными, но и программными (сбои
программ, происходящие при определенных условиях). Довольно часто программные сбои происходят именно из-за мелких неисправностей аппаратуры. Например,
причиной неожиданной ошибки при компиляции ядра может стать неисправный
badblocks

Глава 9. Команды системного администратора

109

модуль оперативной памяти. Ведь не секрет, что ОЗУ имеет модульную структуру.
Возможно, что при обычной работе с системой один из модулей (неисправный) не
задействован, поскольку его ресурсы не востребованы. Но когда система использует свои ресурсы на все 100%, происходит сбой.
Для тестирования оперативной памяти предназначена программа memtest86, которая работает по-особому. После ее установки создается специальный загрузочный образ, а для запуска программы вы должны перезапустить компьютер и выбрать этот образ из меню загрузчика. Но обо всем по порядку.
Установите пакет memtest86. Сразу после установки пакета выполните команду
memtest-setup, которая настроит загрузочный модуль.
Вот теперь начинается самое интересное. Перезагрузите систему и выберите из
меню загрузчика только что созданную программой memtest-setup запись. Запустится программа memtest86, которая сразу начнет тестировать вашу оперативную
память, и если произойдет ошибка, программа непременно сообщит вам об этом.
С помощью программы hdparm можно выполнить тонкую настройку винчестера,
что иногда позволяет существенно повысить его производительность. Раньше,
скажем, года три назад, об этой программе много говорили, поскольку разработчики дистрибутивов устанавливали отказоустойчивые параметры винчестера, при которых он работал очень медленно. За пару минут можно было "разогнать" винчестер, но это не ускорение в прямом смысле слова, а просто использование всех
возможностей. Обычно после установки дистрибутива для всех жестких дисков
задавались минимальные параметры, обеспечивающие безотказную работу. Сейчас
ситуация изменилась: после установки дистрибутива параметры жесткого диска
включаются по максимуму и необходимость в hdparm практически отпала. Сейчас
эта программа необходима в двух ситуациях:
1. Когда вы хотите просто узнать скорость работы винчестера.
2. Когда нужно понизить скорость привода CDROM. Это необходимо, когда вам
нужно прочитать диск с дефектами поверхности (например, царапинами), — на
скорости 4x вероятность чтения данных с такого диска существенно выше, чем
на 24x (но этот способ не всегда приводит к желаемому результату, от работы
с дефектными компакт-дисками вообще лучше воздержаться).
Тестирование производительности жесткого диска выполняется командой:
# hdparm -t /dev/sda

Установка скорости 4x для привода CDROM:
# hdparm –E 4 /dev/sr0

Кроме рассмотренных hdparm, fsck, badblocks и memtest86 в вашем распоряжении имеются программы, приведенные в табл. 9.5.
Таблица. 9.5. Утилиты для тестирования оборудования
Программа

Описание

hddtemp

Выводит температуру винчестера (нужно заметить, что эта программа работает далеко не со всеми жесткими дисками)

Часть I. Командная строка

110

Таблица. 9.5 (окончание)
Программа

Описание

smartmontools

Мониторинг SMART-устройств. Как правило, это жесткие диски
с возможностью самодиагностики. Такой диск сам "скажет",
сколько ему осталось, чтобы его отказ не стал для вас неприятной неожиданностью

bonnie

Тестирование производительности винчестера

cpuburn

Тестирование процессора. выполняет так называемый стресстест процессора. Суть его заключается в том, что программа загружает ваш процессор на все 100% и продолжает работу в таком режиме. При наличии неполадок в системе, например нагрева процессора из-за плохой вентиляции, это обязательно
проявится во время стресс-теста в виде сбоя

screentest

Тестирование/настройка монитора

ЧАСТЬ II
Операционная система
В части II мы рассмотрим загрузчики Linux, системы инициализации,
научимся управлять пользователями и компилировать ядро Linux.

Глава 10

Загрузчики Linux
10.1. Основные загрузчики
Основное назначение загрузчика — запуск выбранной пользователем операционной
системы. Наиболее популярным загрузчиком сегодня является GRUB, который мы
здесь подробно рассмотрим. В более старых дистрибутивах по умолчанию применялся
загрузчик LILO. Списывать со счета LILO пока нельзя, поскольку еще много систем
используют именно его, да и в современных дистрибутивах есть возможность установить старый добрый LILO. Многие администраторы по привычке ставят LILO вместо
более современного GRUB. Однако в данной книге загрузчик LILO рассмотрен не будет. Если он вам нужен, то рекомендую прочитать мою книгу "Linux. От новичка
к профессионалу. 2-е изд.":
http://bhv.ru/books/book.php?id=186944
Кроме LILO и GRUB некоторые дистрибутивы могут включать собственные загрузчики — например, в ASPLinux таковым является ASPLoader. Подобные загрузчики мы рассматривать не будем, поскольку в большинстве случаев в дистрибутивах, использующих собственные загрузчики, имеется возможность установки
GRUB или LILO.
Загрузчик GRUB (GRand Unified Bootloader) считается более гибким и современным, чем LILO. Благодаря иной схеме загрузки операционных систем GRUB
"понимает" больше файловых систем, нежели LILO, а именно: FAT/FAT32, ext2,
ext3, ReiserFS, XFS, BSDFS и др.
Время не стоит на месте. В свое время загрузчик GRUB пришел на смену LILO,
поскольку последний не поддерживал загрузки с разделов, начинающихся после
1024-го цилиндра. Об этой проблеме знает, наверное, каждый Linux-пользователь —
ведь всего несколько лет назад она была актуальной (пока все дистрибутивы не
перешли на GRUB). Точно такая же участь постигла и GRUB — на его место пришел GRUB2, умеющий загружаться с файловой системы ext4. А загрузка с ext4разделов просто необходима современному дистрибутиву.
GRUB2 — это не просто набор патчей для GRUB, а полностью новая разработка, созданная с нуля. Именно поэтому у GRUB2 совершенно другой формат конфигурационного файла.
Разработка "обычного" GRUB полностью прекращена, к нему выпускаются лишь
патчи. Да, можно скачать патч, добавляющий к GRUB загрузку с разделов ext4.

Часть II. Операционная система

114

Так, в Ubuntu 9.10, где по умолчанию впервые был установлен GRUB2, я его удалил (с сохранением конфигурационных файлов), затем установил GRUB (имеющаяся в составе версии 9.10 версия GRUB поддерживает ext4), создал вручную его
конфигурационный файл и перезагрузил систему — она загрузилась без ошибок.
Но, учитывая, что будущее все-таки за GRUB2, я вернул его обратно на заслуженное место.
ПРИМЕЧАНИЕ
В Ubuntu GRUB2 используется, начиная с версии 9.10 — не зря я упомянул ее ранее.
И в этой версии Ubuntu, и в новой — 10.04 — имеется один небольшой "глюк", связанный с установкой тайм-аута выбора операционной системы. Чуть позже мы решим эту
проблему, а пока приступим к рассмотрению конфигурационных файлов GRUB2.

ПРИМЕЧАНИЕ
На самом деле то, что называется GRUB2 — это GRUB v1.98. То есть почти вторая
версия, а когда выйдет вторая версия (в смысле 2.0), пока никто не знает. Хотя ведущие разработчики дистрибутивов уже включили GRUB2 в состав дистрибутивов, что
говорит о его надежности.

10.2. Конфигурационные файлы GRUB
и GRUB2
10.2.1. Конфигурационный файл GRUB
Конфигурационным файлом GRUB служит файл /boot/grub/grub.conf (в старых
версиях — /boot/grub/menu.lst, впрочем, menu.lst в новых версиях — это ссылка на
grub.conf). Рассмотрим пример этого файла (листинг 10.1).
Листинг 10.1. Файл /boot/grub/grub.conf
# Следующие параметры будут описаны далее:
boot=/dev/hda
default=0
timeout=10
fallback=1
splashimage=(hd0,1)/grub/mysplash.xpm.gz
# По умолчанию скрывает меню (для того чтобы увидеть меню,
# нужно нажать )
#hiddenmenu
# Главное загрузочное устройство GRUB (можно не указывать)
#groot=(hd0,1)

Глава 10. Загрузчики Linux

115

# Опции загрузчика по умолчанию (более подробно см. в man menu.lst)
# defoptions=quiet splash
# Опции ядра по умолчанию
# kopt=root=/dev/hda2 ro
# Предпочитаемые цвета
#color cyan/blue white/blue
title MDK
root (hd0,1)
kernel /vmlinuz-2.6.14-1.1263 ro root=/dev/hda2
initrd /initrd-2.6.14-1.1263.img
title WinXP
rootnoverify (hd0,0)
makeactive
chainloader+1

Параметр boot указывает загрузочное устройство, а параметр default — загрузочную метку по умолчанию. Метка начинается параметром title и продолжается
до следующего title. Нумерация меток начинается с 0. Параметр timeout задает
количество секунд, по истечении которых будет загружена операционная система
по умолчанию.
Параметр default полезно использовать с параметром fallback. Первый задает
операционную систему по умолчанию, а второй — операционную систему, которая
будет загружена в случае, если с загрузкой операционной системы по умолчанию
произошла ошибка.
Задать графическое изображение позволяет параметр splashimage. Чуть позже
мы разберемся, как самостоятельно создать такое изображение.
При работе с GRUB вам поначалу будет трудно разобраться с именами разделов. GRUB вместо привычных /dev/hd* (или /dev/sd* для SCSI-дисков) использует
свои имена. Перевести имя /dev/hd* в имя в формате GRUB просто. Во-первых,
опускается /dev/. Во-вторых, устройства отсчитываются не с буквы "a", как в Linux,
а с нуля. Разделы на дисках отсчитываются не с единицы, а тоже с нуля, причем
номер раздела указывается через запятую. Потом все имя берется в скобки. Например, раздел /dev/hda1 в GRUB будет выглядеть как (hd0,0), а раздел /dev/hdb2 как
(hd1,1). Впрочем, об именах разделов в GRUB мы еще поговорим, но чуть позже.
Параметр rootnoverify указывается для Windows (точнее, для всех операционных систем не типа Linux). Параметр chainloader указывается для операционных
систем, поддерживающих цепочечную загрузку. Если Windows на вашем компьютере установлен в неактивном разделе, с которого Windows загружаться не может,
перед параметром chainloader нужно указать параметр makeactive.

Часть II. Операционная система

116

10.2.2. Конфигурационный файл GRUB2
В листинге 10.2 приведен основной конфигурационный файл GRUB2 —
/boot/grub/grub.cfg. Этот конфигурационный файл не редактируется вручную. Для
его создания используется утилита /usr/sbin/grub-mkconfig, которая генерирует этот
конфигурационный файл на основе шаблонов, хранящихся в каталоге /etc/grub.d,
и настроек из файла /etc/default/grub.
Листинг 10.2. Конфигурационный файл grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s /boot/grub/grubenv ]; then
have_grubenv=true
load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
saved_entry=${prev_saved_entry}
save_env saved_entry
prev_saved_entry=
save_env prev_saved_entry
fi
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set 34eaa635-ef0e-4d5c-8b61-3c22c767834b
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don't
# understand terminal_output
terminal gfxterm
fi
fi
if [ ${recordfail} = 1 ]; then

Глава 10. Загрузчики Linux

117

set timeout=-1
else
set timeout=10
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
menuentry "Denix, Linux 2.6.31-14-generic" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set 34eaa635-ef0e-4d5c-8b61-3c22c767834b
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=34eaa635-ef0e-4d5c8b61-3c22c767834b ro
quiet splash
initrd /boot/initrd.img-2.6.31-14-generic
}
menuentry "Denix, Linux 2.6.31-14-generic (recovery mode)" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set 34eaa635-ef0e-4d5c-8b61-3c22c767834b
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=34eaa635-ef0e-4d5c8b61-3c22c767834b ro single
initrd /boot/initrd.img-2.6.31-14-generic
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}

Часть II. Операционная система

118
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
if [ ${timeout} != -1 ]; then
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###

# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

Вы наверняка заметили, что синтаксис grub.cfg весьма напоминает синтаксис
bash-сценариев. Параметры GRUB2 задаются в файле /etc/default/grub, а в файле
grub.cfg описываются элементы меню загрузчика.
Рассмотрим описание элемента меню:
menuentry "Denix, Linux 2.6.31-14-generic" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set 34eaa635-ef0e-4d5c-8b61-3c22c767834b
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=34eaa635-ef0e-4d5c8b61-3c22c767834b ro
quiet splash
initrd /boot/initrd.img-2.6.31-14-generic
}

В кавычках после menuentry находится описание элемента меню — можете заменить этот текст на все, что вам больше нравится. Далее следуют команды GRUB.
Например, команда insmod ext2 загружает модуль ext2. Это не модуль ядра Linux!
Это модуль GRUB2 — файл ext2.mod, находящийся в каталоге /boot/grub.

Глава 10. Загрузчики Linux

119

Команда set root устанавливает загрузочное устройство. Формат имени устройства такой же, как в случае с GRUB2.
После служебного слова linux задается ядро (файл ядра) и параметры, которые
будут переданы ядру. Служебное слово initrd указывает файл initrd.
Теперь рассмотрим файл /etc/default/grub, содержащий параметры GRUB2 (листинг 10.3). Поскольку этот файл вы будете редактировать чаще, чем grub.cfg, то
комментарии для большего удобства я перевел на русский язык.
Листинг 10.3. Файл /etc/default/grub
# Если вы измените этот файл, введите команду 'update-grub'
# для обновления вашего файла /boot/grub/grub.cfg.
# Элемент по умолчанию, нумерация начинается с 0
GRUB_DEFAULT=0
# Чтобы увидеть меню GRUB, нужно или закомментировать следующую
# опцию или установить значение больше 0, но в этом случае
# нужно изменить значение GRUB_HIDDEN_TIMEOUT_QUIET на false
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
# Таймаут (в секундах)
GRUB_TIMEOUT="10"
# Название дистрибутива — вывод команды lsb_release или просто Debian
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# Параметры ядра по умолчанию
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Раскомментируйте для отключения графического терминала
# (только для grub-pc)
#GRUB_TERMINAL=console
# Разрешение графического терминала
#GRUB_GFXMODE=640x480
# Раскомментируйте следующую опцию, если вы не хотите передавать
# параметр "root=UUID=xxx" ядру Linux
#GRUB_DISABLE_LINUX_UUID=true
# Раскомментируйте, если нужно отключить генерацию элемента меню
# режима восстановления
#GRUB_DISABLE_LINUX_RECOVERY="true"

120

Часть II. Операционная система

После изменения файла /etc/default/grub не забудьте запустить команду
для обновления вашего /boot/grub/grub.cfg.
При редактировании конфигурации GRUB2 нужно придерживаться одной стратегии из двух возможных. Первая заключается в ручном редактировании файла
grub.cfg — вы редактируете его вручную и больше не используете других программ вроде grub-mkconfig или update-grub. Вторая стратегия заключается в использовании вспомогательных программ, но тогда не нужно редактировать файл
grub.cfg вручную, иначе при последующем изменении файла grub.cfg программами
grub-mkconfig или update-grub все изменения, внесенные вручную, будут уничтожены.
По умолчанию команда grub-mkconfig генерирует конфигурационный файл на
консоль, поэтому вызывать ее нужно так:
update-grub

sudo grub-mkconfig > /boot/grub/grub.cfg

10.3. Команды установки загрузчиков
Установить GRUB/GRUB2, если вы это еще не сделали, можно следующей
командой:
/sbin/grub-install

Например:
/sbin/grub-install /dev/sda

После изменения конфигурационного файла переустанавливать загрузчик, как
в случае с устаревшим LILO, не нужно.

10.4. Установка тайм-аута
выбора операционной системы.
Редактирование параметров ядра Linux
По умолчанию GRUB2 не отображает меню выбора операционной системы.
Следовательно, вы не можете ни выбрать другую операционную систему (в том
числе и Windows), ни изменить параметры ядра Linux, ни выбрать режим восстановления или режим тестирования памяти. Одним словом, такое поведение загрузчика создает определенные неудобства.
Чуть ранее было сказано, что для установки тайм-аута загрузчика нужно отредактировать следующие параметры:
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
# Таймаут (в секундах)
GRUB_TIMEOUT="10"

Все правильно, но если бы GRUB2 в Ubuntu был без "глюка". Вообще, "глюки" — это хорошо. Чем корявее будет Canonical делать свои дистрибутивы, тем
больше будет работы у авторов книг и дистрибутивов на базе Ubuntu. Вы думаете,

Глава 10. Загрузчики Linux

121

почему я создал свой дистрибутив Denix (denix.dkws.org.ua)? Нет, не для того,
чтобы гордо ткнуть себя в грудь (мол, я тоже могу сделать свой дистрибутив!).
А для того, чтобы после каждой установки Ubuntu пользователи могли не тратить
свое личное время, часами настраивая операционную систему.
Например, чтобы побороть такое неадекватное поведение (а каким его еще назвать, если программа не реагирует на установку параметров из конфигурационного файла?) загрузчика, мне пришлось потратить минут 15–20. К своему решению
я пришел методом эксперимента, поэтому я не удивлюсь, если на каком-то форуме
в Интернете вы найдете другое решение (не исключаю, может быть, даже лучшее).
Итак, откройте ваш файл /etc/grub.d/30_os-prober:
sudo nano /etc/grub.d/30_os-prober

Найдите в нем строку:
if [ "x${GRUB_HIDDEN_TIMEOUT}" = "x0" ]

Далее все значения -1 во фрагменте кода, представленном в листинге 10.4, замените на 1. Строки, которые нуждаются в редактировании, выделены полужирным.
Изменять значение -1 в остальном коде, выходящем за рамки листинга 10.4, не
нужно!
Листинг 10.4. Фрагмент файла /etc/grub.d/30_os-prober
if [ "x${GRUB_HIDDEN_TIMEOUT}" = "x0" ] ; then
cat <
if [ \${timeout} != 1 ]; then
if keystatus; then
if keystatus --shift; then
set timeout=1
else
set timeout=0
fi
else
if sleep$verbose --interruptible 3 ; then
set timeout=0
fi
fi
fi
EOF
else
cat /boot/grub/grub.cfg
sudo update-grub
sudo reboot

Да, после перезагрузки вы увидите меню GRUB2 (рис. 10.1). Для редактирования параметров ядра (см. главу 13), которые передаются Linux, выделите загрузочную метку Linux и нажмите клавишу . Если вы защитили GRUB от редактирования параметров ядра (как это сделать, будет показано в разд. 10.10), вы увидите
требование ввести имя пользователя и пароль (рис. 10.2). Если они правильные, вы
сможете отредактировать загрузочную метку (рис. 10.3). В данном случае дополнительные параметры нужно вводить после параметра splash (строка параметров начинается после служебного слова linux). Кстати, если у вас проблемы с запуском
Linux, то, чтобы увидеть больше диагностических сообщений, параметры quiet
и splash лучше вообще удалить. Для возврата обратно в меню GRUB2, нажмите
клавишу , а для загрузки выбранной операционной системы нажмите клавиши +.

Рис. 10.1. Меню загрузчика

Глава 10. Загрузчики Linux

Рис. 10.2. Ввод имени пользователя и пароля

Рис. 10.3. Редактирование загрузочной метки

123

124

Часть II. Операционная система

10.5. Установка собственного фона
загрузчика GRUB и GRUB2
Вы хотите создать собственный фон для загрузчика GRUB? Это очень просто.
Создайте или найдите в Интернете понравившуюся вам картинку. Уменьшите ее до
размера 640×480 и конвертируйте в формат XPM. Все это можно сделать одной
командой:
# convert image.jpg -colors 14 -resize 640x480 image.xpm

Затем сожмите картинку с помощью команды gzip:
# gzip image.xpm

Скопируйте сжатую картинку в каталог /boot/grub и пропишите в конфигурационном файле /boot/grub/grub.conf:
splashimage=(hd0,1)/grub/image.xpm.gz

Теперь разберемся, как установить графический фон в GRUB2. Убедитесь, что
установлен пакет grub2-splashimages. Этот пакет содержит графические заставки
для GRUB2, которые будут установлены в каталог /usr/share/images/grub. Если вам
не нравятся стандартные картинки, то множество фонов для GRUB2 вы можете
скачать с сайта http://www.gnome-look.org/ или создать вручную, как было показано ранее. Вот только GRUB2 уже поддерживает форматы PNG и TGA, поэтому
конвертировать в формат XPM не нужно. Будем считать, что картинка у нас уже
выбрана. Осталось только установить ее как фон.
Откройте файл темы GRUB2. Он находится в каталоге /etc/grub.d. В Ubuntu
и Debian он называется /etc/grub.d/05_debian_theme. В другие дистрибутивах (учитывая, что далеко не все современные дистрибутивы перешли на GRUB2, точное
название не могу сказать) он может называться иначе.
Найдите в файле темы следующую строку:
for i in {/boot/grub,/usr/share/images/desktop-base}/
moreblue-orbit-grub.{png,tga} ; do

Замените ее на следующую строку:
for i in {/boot/grub,/usr/share/images/desktop-base,/usr/share/
images/grub}/имя_файла.{png,tga} ; do

Как видите, мы просто прописали выбранную вами картинку. Далее нужно обновить GRUB2:
sudo update-grub

10.6. Постоянные имена и GRUB
Как было отмечено в главе 4, все современные дистрибутивы перешли на так
называемые постоянные ("длинные") имена. Раньше, когда еще никто не знал
о длинных именах, запись в файле grub.conf могла выглядеть так:
kernel /boot/vmlinuz26 root=/dev/hda1 vga=0x318 ro

Глава 10. Загрузчики Linux

125

Эта запись указывает имя ядра (/boot/vmlinuz26). Все, что после него, — параметры, которые будут переданы ядру. Один из них (параметр root) — указывает
имя корневой файловой системы. Здесь оно приведено еще в старом формате. Сейчас вы такие имена в grub.conf не увидите (если, конечно, сами не пропишете). Варианты указания длинных имен выглядят так:
root=/dev/disk/by-uuid/2d781b26-0285-421a-b9d0-d4a0d3b55680
root=/dev/disk/by-id/scsi-SATA_WDC_WD1600JB-00_WD-WCANM7959048-part5
root=LABEL=/

Какой вариант будет использоваться у вас, зависит от дистрибутива. Например,
в Fedora применяют третий способ, а в openSUSE — второй.

10.7. Восстановление загрузчика GRUB/GRUB2
Что делать, если вы переустановили Windows, а она установила в MBR свой загрузчик, и теперь вы не можете загрузить Linux? Не переустанавливать же еще
и Linux из-за такой мелочи!
Для восстановления загрузчика GRUB нужно загрузиться с LiveCD (подойдет
любой LiveCD с любым дистрибутивом Linux) и ввести следующие команды:
mkdir /old
mkdir /old/dev
mount /dev/sdaN /old

ПРИМЕЧАНИЕ
Все команды нужно вводить от имени root. Для этого следует использовать команды
su или sudo.
В частности, в LiveCD Ubuntu нужно вводить все команды с использованием команды
sudo, например, так:
sudo mkdir /old
sudo mkdir /old/dev


Разберемся, что означают эти команды:
 первая из них создает каталог /old, который будет использоваться в качестве
точки монтирования;
 вторая — создает в этом каталоге подкаталог dev, который пригодится для монтирования devfs — псевдофайловой системы;
 третья — используется для монтирования корневой файловой системы дистрибутива Linux, установленного на жестком диске в разделе /dev/sdaN (где N —
номер раздела), к каталогу /old. Предположим, что на вашем компьютере дистрибутив Linux был установлен в раздел /dev/sda5. Тогда вам нужно ввести следующую команду:
mount /dev/sda5 /old

Часть II. Операционная система

126

После этого нужно подмонтировать каталог /dev к каталогу /old/dev. Это делается с помощью все той же команды mount, но с параметром --bind:
mount --bind /dev /old/dev
chroot /old

Команда chroot заменяет корневую систему нашего LiveCD на корневую систему дистрибутива, установленного на винчестере. Вам остается лишь ввести
команду:
/sbin/grub-install /dev/sda

Эта команда установит загрузчик GRUB так, как он был установлен до переустановки Windows. После установки GRUB нужно перезагрузить компьютер командой reboot.
ПРИМЕЧАНИЕ
Дополнительную информацию о восстановлении загрузчика GRUB вы можете получить на моем форуме:
http://www.dkws.org.ua/phpbb2/viewtopic.php?t=3275

10.8. Две и более ОС Linux
на одном компьютере
Рассмотрим другую ситуацию, часто возникающую на практике. Вы решили установить на свой компьютер (на котором уже была установлена Windows) операционную систему Linux. Все прошло гладко, и теперь вы с помощью GRUB можете запустить две системы — Windows и Linux. Но потом вы решили установить еще один
дистрибутив Linux, однако старый удалять пока не хотите. Поэтому вы создали еще
один Linux-раздел и установили в него новый дистрибутив, но после перезагрузки
обнаружили небольшую проблему:
 в меню GRUB отображается только последний установленный дистрибутив
и Windows, т. е. вы не можете загрузить первый дистрибутив. Так, Fedora, например, напрочь игнорирует все установленные до нее дистрибутивы, и поэтому после установки этого дистрибутива вы можете запустить только его и Windows;
 или в меню GRUB отображаются оба дистрибутива и Windows, но запустить вы
можете только последний установленный дистрибутив (и, понятно, Windows).
Такую картину я наблюдал после установки openSUSE — в моем загрузочном
меню появилась метка для загрузки ранее установленного дистрибутива Fedora,
но загрузить его не получалось.
Понятно, что восстановить загрузчик первого дистрибутива, воспользовавшись
рекомендациями из предыдущего раздела, мы не можем, поскольку после этого мы
сможем запустить только первый дистрибутив и Windows (на момент формирования файла grub.conf первого дистрибутива еще ничего не было известно о втором
дистрибутиве, который вы недавно установили).
Наши действия будут зависеть от конкретной ситуации. Для большей определенности предположим, что первый дистрибутив был установлен в раздел
/dev/sda5, а второй — в раздел /dev/sda6.

Глава 10. Загрузчики Linux

127

Если у вас проблема по первому случаю (когда ранее установленного дистрибутива вообще нет в загрузочном меню), тогда вам нужно примонтировать раздел
первого дистрибутива (у нас это /dev/sda5) к каталогу /mnt (или к любому другому):
# mount /dev/sda5 /mnt

Затем надо открыть файл /mnt/boot/grub/grub.conf (/mnt/boot/grub/menu.lst).
ВНИМАНИЕ!
Исходя из приведенного здесь пути к файлу, мы понимаем, что открываем файл
grub.conf первого дистрибутива.

Скопируйте из него метку загрузки первого дистрибутива. У меня сначала был
установлен openSUSE 11.2, а потом я установил Fedora 12, поэтому загрузочная
метка в моем случае выглядела так:
title openSUSE 11.2
root (hd0,4)
kernel /boot/vmlinuz-2.6.31-14-default root=/dev/disk/by-id/
scsi-SATA_WDC_WD1600JB-00_WD-WCANM7959048-part5 vga=0x317
resume=/dev/sda7 splash=silent showopts
initrd /boot/initrd-2.6.31-14-default

СОВЕТ
Обратите внимание: параметр root содержит постоянное (длинное) имя, поэтому его
не придется изменять. Если же в вашем варианте параметр root содержит короткое
имя вида /dev/sd*, его желательно заменить постоянным именем (см. главу 4).

Скопированную загрузочную метку нужно вставить в файл /boot/grub/grub.conf —
это файл конфигурации GRUB, используемый в настоящий момент. Файл сохраните, но пока не закрывайте и не перезагружайте компьютер. Обратите внимание: для
загрузки нашего первого дистрибутива требуются файлы vmlinuz-2.6.22.5-31default и initrd-2.6.22.5-31-default. Их нужно скопировать из каталога /mnt/boot
в каталог /boot:
cp /mnt/boot/vmlinuz* /boot
cp /mnt/boot/initrd* /boot

Теперь можно перезагрузить компьютер. Первый дистрибутив, установленный
в /dev/sda5, будет загружен.
Перейдем ко второму случаю. Он проще тем, что нам не нужно редактировать
grub.conf, поскольку за нас это уже сделала программа установки второго дистрибутива. Вам нужно только подмонтировать каталог /dev/sda5 к каталогу /mnt и скопировать файлы vmlinuz* и initrd* из каталога /mnt/boot в каталог /boot. Вот и все.
Напоследок рекомендую прочитать тему форума, непосредственно относящуюся
к рассматриваемому вопросу: http://www.dkws.org.ua/phpbb2/viewtopic.php?t=3085.

Часть II. Операционная система

128

10.9. Загрузка с ISO-образов
Предположим, вы скачали ISO-образ новой версии Ubuntu, но у вас нет "болванки", чтобы записать на нее образ и загрузиться с полученного диска. Могу вас
обрадовать: "болванка" вам для этого не понадобится — GRUB2 умеет использовать в качестве загрузочных устройств ISO-образы. Просто пропишите ISO-образ
в конфигурационном файле GRUB2 и перезагрузите компьютер. Новая загрузочная
метка появится в меню GRUB2, и, если ее выбрать, система загрузится с ISO-образа.
Итак, создайте в каталоге /boot подкаталог iso (название, сами понимаете, может
быть любым), загрузите в него ISO-образ дистрибутива. Теперь вам осталось лишь
отредактировать конфигурационный файл /boot/grub/grub.cfg, добавив в него вот
такую загрузочную запись (выделенный полужирным шрифтом текст нужно записать в одну строку):
menuentry "Ubuntu LiveCD" {
loopback loop /boot/iso/ubuntu.iso
linux(loop)/casper/vmlinuz boot=casper isoscan/filename=/boot/iso/ubuntu.iso noeject noprompt -initrd (loop)/casper/initrd.lz
}

Перезагружаемся и выбираем пункт меню Ubuntu LiveCD.

10.10. Установка пароля загрузчика GRUB2
Как уже отмечалось, начиная с версии 9.10 в Ubuntu используется загрузчик
GRUB2 вместо обычного GRUB. По сравнению с GRUB, новый загрузчик одновременно и проще в обращении, и сложнее в настройке. Настраивать GRUB2 придется реже, но к его сложной настройке надо будет привыкать, — практически все
современные дистрибутивы перешли на GRUB2.
В GRUB можно было задать общий пароль для всех загрузочных меток, а также
установить пароль только на некоторые загрузочные метки. В GRUB2 можно сделать то же самое, но, кроме самого пароля, понадобится указать еще и имя пользователя, что усложняет злоумышленнику взлом системы, поскольку ему нужно будет знать не только пароль, но и имя пользователя. Защита отдельных загрузочных
меток, как правило, используется редко, чаще устанавливается пароль на все метки
сразу, что и будет продемонстрировано в этой главе.
Сначала установим простой (незашифрованный) пароль, а затем зашифруем его,
чтобы никто не смог его прочитать, загрузившись с LiveCD. Прежде всего откройте
файл /etc/grub.d/00_header:
sudo nano /etc/grub.d/00_header

В конец файла добавьте строки:
cat /root/somefile

работать не будет, вместо нее нужно использовать команду:
sudo bash -c "ls /etc > /root/somefile"

Длинновато, правда?
 имеются и неудобства, связанные с технологией NSS. К счастью, она использу-

ется не очень часто, поэтому основной недостаток sudo будет связан только
с перенаправлением ввода/вывода.

Традиционная учетная запись root в Ubuntu
Вы все-таки хотите использовать обычную учетную запись root? Для этого достаточно задать пароль для пользователя root. Делается это командой:
sudo passwd root

Сначала программа запросит ваш пользовательский пароль, затем новый пароль
root и его подтверждение:
Enter your existing password:
Enter password for root:
Confirm password for root:

146

Часть II. Операционная система

После этого вы сможете входить в систему под учетной записью root.
Для отключения учетной записи root используется команда:
sudo passwd -l root

Помните, что после закрытия учетной записи root у вас могут быть проблемы
с входом в систему в режиме восстановления, поскольку пароль root уже установлен (т. е. он не пустой, как по умолчанию), но в то же время учетная запись закрыта. Поэтому если вы уже включили учетную запись root, то будьте внимательны
и осторожны. А вообще лучше ее не включать, а пользоваться командой sudo –i.

Традиционная учетная запись root в Mandriva
В Ubuntu учетная запись root отключена честно. В Linux Mandriva 2010 отключена лишь возможность графического входа в систему под именем root. Другими
словами, вы можете переключиться в консоль, нажав клавиши ++,
и войти в систему под именем root.
Сейчас мы разберемся, как же войти под именем root в графическом режиме.
За регистрацию пользователей в системе в графическом режиме отвечает KDM (KDE
Display Manager). Он-то и не пускает пользователя root в систему.
Для изменения поведения KDM следует открыть его конфигурационный файл.
Это нужно сделать с привилегиями root:
su
kwrite /etc/kde/kdm/kdmrc (для Mandriva 2008)
kwrite /etc/alternatives/kdm4-config (для Mandriva 2009/2010)

В этом файле найдите строку:
AllowRootLogin=false

Значение директивы AllowRootLogin измените на true:
AllowRootLogin=true

После этого можно будет войти в систему под именем root. Кстати, при входе
в систему вы получите предупреждение, а фон графического стола станет красным,
извещая вас об опасности такого решения.

Вход в качестве root в Fedora
Как и в Mandriva, в Fedora 9 и 10 вход пользователя root ограничен менеджером
рабочего стола. Введите команду:
su -c 'gedit /etc/pam.d/gdm'

Вы запустите с правами root текстовый редактор gedit для редактирования
файла /etc/pam.d/gdm. Найдите в этом файле следующую строку
auth required pam_succeed_if.so user != root quiet

Закомментируйте ее (поставьте знак # перед ней) или вообще удалите эту строку.
В Fedora 11 и 12 дополнительно нужно открыть файл /etc/pam.d/gdm-password
и найти следующую строку:
pam_succeed_if.so user != root quiet

Глава 12. Команды управления пользователями

147

Эту строку тоже нужно или закомментировать или удалить.
Если вы используете вход в систему по отпечатку пальца, тогда откройте файл
gdm-fingerprint и закомментируйте в нем следующую строку:
pam_succeed_if.so user != root quiet

После этого сохраните файлы и завершите сеанс пользователя. После перезагрузки GDM вы сможете войти в систему как root.
Просмотреть видеоурок, демонстрирующий разрешение входа root в графическом режиме, можно по адресу:
http://dkws.org.ua/video-lessons/login_as_root_in_fedora_12.avi

12.3. Создание, удаление и модификация
пользователей стандартными средствами
12.3.1. Команды adduser и passwd
Для добавления нового пользователя выполните следующие команды (от имени
root):
# adduser
# passwd

Первая команда (adduser) добавляет пользователя, а вторая (passwd) изменяет
его пароль. Ясно, что и в первом, и во втором случае вы должны указать одно и то
же имя пользователя.
ПРИМЕЧАНИЕ
В некоторых дистрибутивах вместо команды adduser используется команда useradd,
а команды adduser вообще не существует.

В некоторых дистрибутивах, например в Ubuntu и Debian, сценарий adduser не
только добавляет пользователя, но позволяет указать дополнительную информацию о пользователе и сразу же задать пароль пользователя (рис. 12.4).
ПРИМЕЧАНИЕ
В некоторых дистрибутивах (например, в openSUSE) вместо команды adduser используется команда useradd. Программы adduser и useradd обычно находятся в
каталоге /usr/sbin.

Обратите внимание: если пароль слишком прост для подбора, программа passwd
выдаст соответствующее предупреждение — BAD PASSWORD и сообщит, чем же наш
пароль плох (в нашем случае в основе пароля лежит словарное слово, что делает
пароль легким для подбора).
ПРИМЕЧАНИЕ
Команду passwd может использовать не только администратор, но и сам пользователь для изменения собственного пароля.

Часть II. Операционная система

148

Рис. 12.4. Добавление нового пользователя в Ubuntu

12.3.2. Команда usermod
Для модифицирования учетной записи пользователя можно применять команду
usermod. Формат вызова команды следующий:
usermod [параметры] LOGIN

Параметры команды usermod приведены в табл. 12.1.
Таблица 12.1. Параметры команды usermod
Параметр

Описание

-a, --append

Добавляет пользователя в дополнительную группу. Используется только с параметром -G

-c, --commentКОММЕНТАРИЙ

Изменяет комментарий пользователя. Комментарий удобнее изменять с помощью команды chfn

-d, --homeКАТАЛОГ

Изменяет домашний каталог пользователя

-e, --expiredateДАТА

Устанавливает дату отключения учетной записи.
Дата устанавливается в формате ГГГГ-ММ-ДД

-f, --inactiveДНИ

Устанавливает число дней после даты отключения учетной записи, на протяжении которых можно
изменить пароль. Если число дней равно 0, то
учетная запись блокируется сразу после устаревания пароля

-g, --gidГРУППА

Задает идентификатор (число, GID) начальной
группы пользователя

Глава 12. Команды управления пользователями

149

Таблица 12.1 (окончание)
Параметр

Описание

-G, --groupsГ1[,Г2,...[,ГN]]]

Задает список дополнительных групп, в которые
будет входить пользователь. Список групп задается через запятую без дополнительных пробелов.
Если пользователь уже является членом группы,
которой нет в списке, он будет удален из этой
группы. Поведение программы можно изменить,
добавив параметр -a, в этом случае пользователь
просто будет добавлен в дополнительные группы,
а если он уже являлся членом других групп, которых нет в списке, то он не будет удален из них

-l, --loginНОВОЕ_ИМЯ

Изменяет имя пользователя

-L, --lock

Заблокировать пароль пользователя.
Не используйте этот параметр вместе с параметрами -p или -U. Параметр -L блокирует только
вход по паролю, но есть и другие способы аутентификации, поэтому если вам нужно полностью
заблокировать учетную запись, используйте параметр -e

-o, --non-unique

При использовании с параметром -u позволяет
задавать не уникальный идентификатор пользователя

-p, --passwordПАРОЛЬ

Задает новый пароль пользователя. Нужно указать не сам пароль, а его хэш. Поэтому для смены
пароля проще использовать команду passwd

-s, --shellОБОЛОЧКА

Задает новую оболочку пользователя

-u, --uidUID

Задает идентификатор пользователя. Идентификатор должен быть уникальным, если не задан
параметр -o. Идентификаторы 0–999 зарезервированы для системных учетных записей

-U, --unlock

Разблокировать пароль пользователя

12.3.3. Команда userdel
Для удаления пользователя используется команда userdel:
# userdel

12.3.4. Подробно о создании пользователей
Давайте разберемся, что же происходит при создании новой учетной записи
пользователя.
Во-первых, создается запись в файле /etc/passwd. Формат записи следующий:
имя_пользователя:пароль:UID:GID:полное_имя:домашний_каталог:оболочка

Часть II. Операционная система

150

Рассмотрим фрагмент этого файла (две строки):
root:x:0:0:root:/root:/bin/bash
den:x:500:500:Denis:/home/den:/bin/bash

 первое поле — это логин пользователя, который он вводит для регистрации

в системе. Пароль в современных системах в этом файле не указывается, а второе поле осталось просто для совместимости со старыми системами. Пароли
хранятся в файле /etc/shadow, о котором мы поговорим чуть позже;
 третье и четвертое поле — это UID (User ID) и GID (Group ID) — идентификаторы пользователя и группы соответственно. Идентификатор пользователя root
всегда равен 0, как и идентификатор группы root. Список групп вы найдете
в файле /etc/groups;
 пятое поле — это настоящее имя пользователя. Может быть не заполнено, а может содержать фамилию, имя и отчество пользователя — все зависит от педантичности администратора системы, т. е. от вас. Если вы работаете за компьютером в гордом одиночестве, то, думаю, свою фамилию вы не забудете. А вот если
ваш компьютер — сервер сети, тогда просто необходимо указать Ф. И. О. каждого пользователя, а то когда придет время обратиться к пользователю по имени, вы его знать не будете (попробуйте запомнить 500 фамилий и имен!);
 шестое поле содержит имя домашнего каталога. Обычно это каталог
/home/;
 последнее поле — это имя командного интерпретатора, который будет обрабатывать введенные вами команды, когда вы зарегистрируетесь в консоли.
В целях безопасности пароли были перенесены в файл /etc/shadow (доступен для
чтения/записи только пользователю root), где они и хранятся в закодированном виде (используется алгоритм MD5 или — в некоторых системах — Blowfish). Узнать,
с помощью какого алгоритма зашифрован пароль, очень просто: посмотрите на
шифр — если он короткий и не начинается с символа $, то применен алгоритм DES
(самый слабый и ненадежный — как правило, используется в старых дистрибутивах). Если же шифр начинается с символов $1$, то это MD5, а если в начале шифра
имеются символы $2a$, то это Blowfish.
Во-вторых, при создании пользователя создается каталог /home/, в который копируется содержимое каталога /etc/skel. Каталог /etc/skel содержит "джентльменский набор" — файлы конфигурации по умолчанию, которые
должны быть в любом пользовательском каталоге. Название каталога skel (от
skeleton) полностью оправдывает себя — он действительно содержит "скелет" домашнего каталога пользователя.
ПРИМЕЧАНИЕ
Файл /etc/passwd можно редактировать с помощью обычного текстового редактора.
То есть вы можете очень легко, не прибегая к помощи ни графического конфигуратора, ни команды usermod, изменить параметры учетной записи любого пользователя,
например задать для него другую оболочку или прописать его настоящую фамилию.
Однако нужно быть осторожным при изменении домашнего каталога пользователя!
Если вы это сделали, то, чтобы у пользователя не возникло проблем с правами доступа для нового каталога, нужно выполнить команду:
chown –R

Глава 12. Команды управления пользователями

151

12.4. Группы пользователей
Иногда пользователей объединяют в группы. Группы позволяют более эффективно управлять правами пользователей. Например, у нас есть три пользователя:
igor, pavel, alex, которые должны совместно работать над проектом. Их достаточно
объединить в одну группу — тогда пользователи будут иметь доступ к домашним
каталогам друг друга (по умолчанию один пользователь не имеет доступ к домашнему каталогу другого пользователя, поскольку пользователи находятся в разных
группах).
Создать группу, а также поместить пользователя в группу, позволяют графические конфигураторы. Вы можете использовать их — они очень удобные, но если
вы хотите стать настоящим линуксоидом, то должны знать, что доступные в системе группы указываются в файле /etc/group. Добавить новую группу в систему можно с помощью команды groupadd, но, как правило, проще добавить в текстовом
редакторе еще одну запись в файл /etc/group, а изменить группу пользователя еще
проще — для этого достаточно отредактировать файл /etc/passwd.

12.5. Команды квотирования
Квотирование — это механизм ограничения дискового пространства пользователей. Linux — многопользовательская система, поэтому без ограничения дискового пространства вам не обойтись. Когда вы используете компьютер в гордом одиночестве, то все дисковое пространство доступно вам и только вам. А вот когда
пользователей несколько, нужно ограничить доступное пространство, чтобы один
из пользователей не "узурпировал" все место на диске. Как именно вы будете ограничивать дисковое пространство, решать только вам. Можно поделить дисковое
пространство поровну между пользователями, можно одним пользователям отдать
больше места, а другим — меньше.
На домашнем компьютере квотирование вряд ли понадобится, а на сервере, как
правило, для каталога /home отводится отдельный раздел жесткого диска. Поэтому
будем считать, что у нас есть отдельный раздел, который монтируется к каталогу
/home.
Перед настройкой квот нужно установить пакет quota. Больше ничего устанавливать не нужно.
Чтобы пользователи не потеряли свои данные, перезагрузитесь в однопользовательский режим (параметр ядра single). Вот теперь можно приступать к редактированию квот. Первым делом разрешим устанавливать квоты на разделе, который
содержит файлы пользователей. Откройте /etc/fstab:
# nano /etc/fstab

Далее добавьте параметр usrquota к списку параметров раздела:
/dev/sda5

/home

ext4

defaults,usrquota

0

2

Далее перемонтируем /home, т. к. мы только что изменили его параметры:
# mount -o remount /home

Часть II. Операционная система

152

Механизм квотирования требует создания файлов aquota.user и aquota.group, но
поскольку мы не будем устанавливать квоты для групп, а только для пользователей, то создадим только файл aquota.user:
# touch /home/aquota.user
# chmod 600 /home/aquota.user

После этого введите команду:
# quotacheck -vagum

Поскольку мы создали файл aquota.user вручную, то вы увидите сообщение об
ошибке, но это только в первый раз — далее все будет нормально:
quotacheck: WARNING —
Quotafile
truncated. Can't save quota settings...

/home/aquota.user

was

probably

quotacheck: Scanning /dev/sda5 [/home] quotacheck: Old group file not
found. Usage will not be substracted.
done
quotacheck: Checked 3275 directories and 54301 files

Теперь отредактируем квоты для пользователя user:
# edquota -u user

Будет запущен текстовый редактор по умолчанию, и вы увидите следующий
текст:
Disk quotas for user user (uid 1001):
Filesystem

blocks

/dev/sda5

16

soft

hard

inodes

soft

hard

0

0

5

0

0

ПРИМЕЧАНИЕ
По умолчанию используется редактор vi, который, мягко говоря, не очень удобный.
Для изменения редактора по умолчанию установите переменную окружения EDITOR.
Например, EDITOR=nano.

Разберемся, что есть что:
 blocks — место в блоках, используемое пользователем (1 блок = 1 Кбайт);
 soft — максимальное дисковое пространство (в блоках по 1 Кбайт), которое

может занимать пользователь. Если вы включите период отсрочки (grace period),
то пользователь получит только лишь сообщение о превышении квоты;
 hard — жесткое ограничение, эту квоту пользователь превысить не может, даже
если включен период отсрочки. Предположим, что вы хотите "отдать" пользователю
500 Мбайт. В качестве жесткой квоты можно установить значение 500 Мбайт (или
500 000 блоков), а в качестве "мягкой" квоты установить значение 495 Мбайт
(495 000 блоков). Когда пользователь превысит 495 Мбайт, он получит сообщение о превышении квоты, а вот когда будет превышена жесткая квота, то пользователь больше не сможет сохранять файлы в своем домашнем каталоге;
 inodes — число используемых пользователем файлов.

Глава 12. Команды управления пользователями

153

Отредактируйте квоты так:
Disk quotas for user user (uid 1001):
Filesystem

blocks

soft

hard

inodes

soft

hard

/dev/sda5

16

495000

500000

5

0

0

Теперь сохраните файл, выйдите из редактора и введите команду:
# edquota -t

Сейчас мы установим период отсрочки:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem
/dev/sda8

Block grace period
7days

Inode grace period
7days

Вы должны вместо 7days вписать свой период отсрочки, при этом используйте
названия единиц измерения времени на английском:
 seconds — секунды;
 minutes — минуты;
 hours — часы;
 days — дни;
 weeks — недели;
 months — месяцы.
Например:
 24hours — 24 часа;
 2days — 2 дня;
 1weeks — 1 неделя.
Для просмотра квот используется команда repquota, например:
# repquota /home

Глава 13

Ядро
13.1. Команда dmesg: вывод сообщений ядра
При загрузке Linux выводятся сообщения ядра: информационные (об имеющемся
оборудовании, о поддерживаемых протоколах и технологиях и т. д.) и диагностические
(например, об ошибках). Современные компьютеры настолько быстры, что вы просто
не успеете прочитать эти сообщения. Не беда: все сообщения всегда можно прочитать
после загрузки системы с помощью команды:
# dmesg | less

Сначала сообщается версия ядра и версия компилятора gcc, с помощью которого было откомпилировано ядро. Как видите, у нас имеется дистрибутив Fedora 12
(предпоследняя версия Fedora, но для анализа вывода ядра вам последняя и не
нужна) и версия ядра 2.6.31.1-56.fc12:
Linux version 2.6.31.1-56.fc12.i686.PAE (mockbuild@x86-4.fedora.phx.
redhat.com) (gcc version 4.4.1 20090925 (Red Hat 4.4.1-17) (GCC) ) #1 SMP
Tue Sep 29 16:16:16 EDT 2009

После этого выводится список поддерживаемых процессоров:
KERNEL supported cpus:
Intel GenuineIntel
AMD AuthenticAMD
NSC Geode by NSC
Cyrix CyrixInstead
Centaur CentaurHauls
Transmeta GenuineTMx86
Transmeta TransmetaCPU

Затем выводится карта физической (не виртуальной) памяти:
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 — 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 — 00000000000a0000 (reserved)
BIOS-e820: 00000000000e4000 — 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 — 0000000077fd0000 (usable)
BIOS-e820: 0000000077fd0000 — 0000000077fde000 (ACPI data)
BIOS-e820: 0000000077fde000 — 0000000078000000 (ACPI NVS)
BIOS-e820: 00000000fff00000 — 0000000100000000 (reserved)

Глава 13. Ядро

155

Всего памяти 1023 + 896 = 1919 Мбайт (остальное "скушала" встроенная видеокарта):
1023MB HIGHMEM available.
896MB LOWMEM available.

Далее будет сказано, что найдена SMP MP-таблица (SMP, Symmetrical MultiProcessing; MP, MultiProcessing):
found SMP MP-table at 000ff780

Это означает, что у нас или двухпроцессорный компьютер, или уже у нашего
компьютера двухъядерный процессор.
Современные процессоры поддерживают функцию NX-защиты (NX — сокращение от No eXecute). Это защита областей памяти, которая используется для предотвращения распространения вирусов, троянских коней и других вредоносных
программ. Довольно часто вредоносные программы нарочно вызывают переполнение буфера, после чего записывают свой код в область данных и передают ему
управление. Функция NX-защиты как раз предотвращает развитие данного сценария на аппаратном уровне. Подробно о NX-защите вы можете прочитать по адресу
http://ru.wikipedia.org/wiki/NX-бит. А пока можете наблюдать за тем, как ядро
включит NX-защиту (если она поддерживается вашим процессором):
Using x86 segment limits to approximate NX protection

Затем опять выводится информация о распределении памяти, что нам особо не
интересно:
Zone PFN ranges:
DMA
Normal
HighMem

0 ->

4096

4096 ->

229376

229376 ->

491472

Movable zone start PFN for each node
early_node_map[1] active PFN ranges
0:

0 ->

491472

On node 0 totalpages: 491472
DMA zone: 32 pages used for memmap
DMA zone: 0 pages reserved
DMA zone: 4064 pages, LIFO batch:0
Normal zone: 1760 pages used for memmap
Normal zone: 223520 pages, LIFO batch:31
HighMem zone: 2047 pages used for memmap
HighMem zone: 260049 pages, LIFO batch:31
Movable zone: 0 pages used for memmap
DMI present.
Using APIC driver default

Следом — параметры ACPI (Advanced Configuration and Power Interface):
ACPI: RSDP 000F98B0, 0014 (r0 ACPIAM)

Часть II. Операционная система

156

ACPI: RSDT 77FD0000, 0038 (r1 061107 RSDT1114 20070611 MSFT 97)
ACPI: FACP 77FD0200, 0084 (r2 061107 FACP1114 20070611 MSFT 97)
ACPI: DSDT 77FD0430, 4271 (r1

1ADNC 1ADNCB33 B33 INTL 20051117)

ACPI: FACS 77FDE000, 0040
ACPI: APIC 77FD0390, 005C (r1 061107 APIC1114 20070611 MSFT 97)
ACPI: MCFG 77FD03F0, 003C (r1 061107 OEMMCFG

20070611 MSFT 97)

ACPI: OEMB 77FDE040, 0071 (r1 061107 OEMB1114 20070611 MSFT 97)
ACPI: HPET 77FD46B0, 0038 (r1 061107 OEMHPET

20070611 MSFT 97)

ATI board detected. Disabling timer routing over 8254.
ACPI: PM-Timer IO Port: 0x808
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)

Обратите внимание: параметры контроллера прерываний (APIC, Advanced
Programmable Interrupt Controller) выводятся для каждого процессора (или ядра процессора — Linux расценивает каждое ядро как отдельный процессор):
Processor #0 15:11 APIC version 16
ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
Processor #1 15:11 APIC version 16
ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])

Здесь мы вывод немного сократим, потому что в нем не содержится ничего
важного (зачем попусту тратить бумагу и ваше время), и перейдем сразу к параметрам ядра, которые были переданы загрузчиком:
Kernel command line: ro root=LABEL=/ rhgb quiet

Параметр ro говорит ядру о необходимости смонтировать корневую файловую
систему в режиме "только чтение" (в процессе загрузки она будет перемонтирована
в режиме "чтение/запись", rw). Корневая файловая система задается меткой LABEL.
Помните, мы говорили о способах адресации разделов? Чтобы идентифицировать
раздел, можно указать его короткое имя, вроде /dev/sda, длинное имя или метку.
Fedora использует как раз последний вариант.
Современные дистрибутивы производят загрузку в графическом режиме. Если
ранее сначала выводились диагностические сообщения ядра, затем сообщения системы инициализации, то сейчас вы едва успеете заметить сообщения ядра, как появится красивый графический индикатор, информирующий вас, сколько времени
осталось до полной загрузки системы. Если вы предпочитаете видеть диагностические сообщения, а не графический индикатор загрузки, то уберите параметр rhgb.
Это можно сделать в настройках загрузчика Linux (см. главу 10).
Параметр quiet вообще выключает сообщения, выводимые ядром — т. е., если
ядру передан данный параметр, сообщений ядра при загрузке системы вы вообще
не увидите. Зато их можно потом получить командой dmesg или просто просмотреть файл /var/log/dmesg.

Глава 13. Ядро

157

Далее ядро выполнит маппинг APIC, настроит математический сопроцессор
(Floating Point Unit) и перейдет к инициализации первого процессора:
mapped APIC to ffffb000 (fee00000)
mapped IOAPIC to ffffa000 (fec00000)
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Initializing CPU#0
CPU 0 irqstacks, hard=c07a8000 soft=c0788000
PID hash table entries: 4096 (order: 12, 16384 bytes)

При инициализации процессора выводится его частота:
Detected 2194.946 MHz processor.

Понятно, что частота второго процессора будет такой же. Затем ядро инициализирует консоль:
Console: colour VGA+ 80x25
console [tty0] enabled

Далее вы увидите подробную информацию об использовании памяти:
Memory: 1940968k/1965888k available (2183k kernel
reserved, 1117k data, 280k init, 1048384k highmem)

code,

23600k

Итак, у нас "всего" 1 965 888 Кбайт, из которых доступно 1 940 968 Кбайт, а в скобках приведен отчет о том, куда ядро израсходовало память — сколько килобайт
зарезервировано для кода ядра, данных и т. д.
После этого вы увидите информацию о выделении виртуальной памяти ядра:
virtual kernel memory layout:
fixmap

: 0xffc53000 — 0xfffff000

(3760 kB)

pkmap

: 0xff800000 — 0xffc00000

(4096 kB)

vmalloc : 0xf8800000 — 0xff7fe000

( 111 MB)

lowmem

( 896 MB)

: 0xc0000000 — 0xf8000000

.init : 0xc073f000 — 0xc0785000

( 280 kB)

.data : 0xc0621f7d — 0xc0739544

(1117 kB)

.text : 0xc0400000 — 0xc0621f7d

(2183 kB)

Пропустим пару бесполезных строк и перейдем к BogoMIPS:
Calibrating
(lpj=2250269)

delay

using

timer

specific

routine..

4500.53

BogoMIPS

Ядро вычисляет производительность процессора в так называемых BogoMIPS.
MIPS — это аббревиатура от Millions of Instructions Per Second. Bogo — происходит от bogus (фальшивый, поддельный). Префикс Bogo ставит под сомнение актуальность вычисленной ядром величины, поэтому Линус Торвальдс (BogoMIPS —
это его изобретение) и назвал ее фальшивой. В Интернете можно найти довольно
точное определение BogoMIPS: "сколько миллионов раз в секунду процессор

Часть II. Операционная система

158

может ничего не делать". О производительности процессора по BogoMIPS можно
судить лишь косвенно. Понятно, что чем производительнее процессор, тем больше
будет сделано "пустых" операций, но одно дело, когда процессор просто ничего не
делает, и совсем другое, когда он работает под "нагрузкой", т. е. выполняет арифметические и мультимедийные инструкции. Например, Duron 1,6 ГГц показывал результат в 3193,85 BogoMIPS, а Athlon X2 4200 — "всего" 4500, несмотря на бόльшую
частоту и два ядра. На практике же Athlon X2 намного быстрее, чем Duron 1,6 ГГц.
Сразу после вычислений бесполезных BogoMIPS инициализируется система
контроля доступа SELinux. SELinux может быть или выключена, или работать
в одном из двух режимов — принудительном (permissive) или режиме предупреждений. В данном случае SELinux инициализируется и переходит в принудительный
режим:
Security Framework v1.0.0 initialized
SELinux:

Initializing.

SELinux:

Starting in permissive mode

selinux_register_security:

Registering secondary module capability

После SELinux инициализируются модули безопасности Linux (LSM, Linux
Security Modules):
Capability LSM initialized as secondary

Опять пропустим несколько строк и перейдем к информации о кэше процессора:
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 512K (64 bytes/line)
CPU 0(2) -> Core 0

У нас 64 Кбайт кэша первого уровня (точнее 2 по 64 Кбайт) и 512 Кбайт кэшпамяти второго уровня.
Еще через несколько строк вы увидите полное наименование процессора:
CPU0: AMD Athlon(tm) 64 X2 Dual Core Processor 4200+ stepping 02

Далее ядро Linux перейдет к инициализации второго процессора или второго
ядра процессора (в зависимости от того, какая у вас машина — многопроцессорная
или многоядерная). Фактически заново будет выведена уже известная нам информация — будет вычислен BogoMIPS, выведена информация о кэш-памяти, наименование процессора. Не перестаю удивляться значениям BogoMIPS. Несколькими
строками ранее было вычислено значение 4500 BogoMIPS, а затем ядро сообщает,
что второй процессор, точнее второе ядро процессора, выполняет "всего" 4389,59
BogoMIPS, а общее значение BogoMIPS для двух ядер — 8890. Конечно, эти цифры
ничего не означают, но все же интересно. Получается, что если верить BogoMIPS,
второе ядро менее производительно, чем первое:
Initializing CPU#1
Calibrating delay using timer specific routine.. 4389.59 BogoMIPS
(lpj=2194797)

Глава 13. Ядро

159

CPU: After generic identify, caps: 178bfbff ebd3fbff 00000000 00000000
00002001 00000000 0000001f 00000000
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 512K (64 bytes/line)
CPU 1(2) -> Core 1
CPU: After all inits, caps: 178bf3ff
00002001 00000000 0000001f 00000000

ebd3fbff

00000000

00000410

Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#1.
CPU1: AMD Athlon(tm) 64 X2 Dual Core Processor 4200+ stepping 02
Total of 2 processors activated (8890.13 BogoMIPS).

Потом будет выведено общее количество процессоров (или ядер одного процессора), а также размер внутренних структур ядра:
Brought up 2 CPUs
sizeof(vma)=84 bytes
sizeof(page)=32 bytes
sizeof(inode)=336 bytes
sizeof(dentry)=132 bytes
sizeof(ext3inode)=488 bytes
sizeof(buffer_head)=56 bytes
sizeof(skbuff)=180 bytes
sizeof(task_struct)=1552 bytes

А также дата и время загрузки:
Time:

9:14:10

Date: 02/12/08

Затем вы увидите строки, относящиеся к инициализации шины PCI, распределению PCI-ресурсов. Они нам не интересны, поэтому их подробно рассматривать не
станем.
Далее перед вашим взором предстанет строка, появление которой означает поддержку технологии PnP (Plug and Play) операционной системой Linux. Ничего удивительного в этом нет — было бы удивительно, если бы Linux не поддерживала
PnP:
Linux Plug and Play Support v0.97 (c) Adam Belay

Следующий этап — подготовка к загрузке поддержки USB (загружаются основные драйверы USB):
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb

Затем ядро выводит параметры таймеров, диапазоны ввода/вывода PnP, параметры моста PCI. Если вы не профессионал в аппаратных средствах компьютера,
вся эта информация не представляет для вас никакого интереса.

160

Часть II. Операционная система

После этого вы увидите строки, свидетельствующие о регистрации протокола
TCP/IP:
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
TCP established hash table entries: 131072 (order: 8, 1572864 bytes)
TCP bind hash table entries: 65536 (order: 7, 524288 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered

Затем ядро проверяет RAM-диск и освобождает память, используемую для initrd:
checking if image is initramfs... it is
Freeing initrd memory: 2911k freed

APM (Advanced Power Management) не очень надежно работает на SMPмашинах (в том числе и на многоядерных машинах, которые тоже являются SMPмашинами), поэтому ядро отключило APM:
apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16ac)
apm: disabled — APM is not SMP safe.

Опять пропустим несколько строк и перейдем сразу к режимам планировщика
ввода/вывода. Ядро регистрирует режимы noop, anticipatory, deadline и cfq. Последний режим используется по умолчанию. О выборе планировщика вы можете
прочитать в моей статье:
http://www.dkws.org.ua/index.php?page=show&file=a/system/tuning
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)

Далее мы лишь с краткими комментариями остановимся на самых значимых сообщениях ядра (поскольку полный вывод ядра можно рассматривать очень долго).
Инициализация PnP карт расширений ISA — такие устройства не найдены (интересно, у кого-то до сих пор используется ISA?):
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found

Загрузка драйвера RTC (часов реального времени):
Real Time Clock Driver v1.12ac

Инициализация последовательных портов:
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Инициализация драйвера RAMDISK (диска в памяти, который используется в качестве
корневой файловой системы, пока ядро не подмонтирует раздел жесткого диска):
RAMDISK driver initialized: 16 RAM disks of 16384K size 4096 blocksize

Глава 13. Ядро

161

Контроллер PS/2 (к нему подключаются клавиатура и мышь) занял прерывания
1 и 12:
PNP: PS/2 Controller [PNP0303:PS2K,PNP0f03:PS2M] at 0x60,0x64 irq 1,12
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX port at 0x60,0x64 irq 12

Загрузка драйвера USB HID (Human Interface Device):
cpuidle: using governor menu
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
drivers/hid/usbhid/hid-core.c: v2.6:USB HID core driver

Регистрирование сетевых протоколов:
Initializing XFRM netlink socket
NET: Registered protocol family 1
NET: Registered protocol family 17

Активация функции PowerNow! — энергосберегающей технологии AMD:
powernow-k8: Found 1 AMD Athlon(tm) 64 X2 Dual Core Processor 4200+
processors (2 cpu cores) (version 2.00.00)
powernow-k8: MP systems not supported by PSB BIOS structure
powernow-k8: MP systems not supported by PSB BIOS structure

Освобождение неиспользуемой памяти ядра:
Freeing unused kernel memory: 280k freed
Write protecting the kernel read-only data: 849k

Регистрация USB-контроллера, версия USB 2.0:
ehci_hcd 0000:00:13.5: EHCI Host Controller
ehci_hcd 0000:00:13.5: new USB bus registered, assigned bus number 1
ehci_hcd 0000:00:13.5: debug port 1
ehci_hcd 0000:00:13.5: irq 16, io mem 0xfe7ff000
ehci_hcd 0000:00:13.5: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb1: configuration #1 chosen from 1 choice

Найден USB-хаб на 10 портов:
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 10 ports detected


Найден USB-хаб, 2 порта:
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 2 ports detected

Далее ядро будет выводить информацию о каждом найденном USB-хабе, что не
очень интересно.

Часть II. Операционная система

162

Инициализация подсистемы SATA и загрузка библиотеки libata версии 2.21
(именно эта библиотека "превратила" все имена /dev/hd* в /dev/sd*):
SCSI subsystem initialized
libata version 2.21 loaded.

Прерывания 14 и 15 используются первым и вторым жестким диском (IDE).
На данной материнской плате всего один IDE-контроллер, к которому можно
подключить два IDE-устройства:
ata1: PATA max UDMA/100 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x0001ff00 irq 14
ata2: PATA max UDMA/100 cmd 0x00010170 ctl 0x00010376 bmdma 0x0001ff08 irq 15

Как видите, IDE-контроллер слабенький, потому что поддерживает максимум
UDMA/100 (более мощные поддерживают UDMA/133).
Первое IDE-устройство — это жесткий диск Western Digital емкостью
160 Гбайт:
ata1.00: ATA-7: WDC WD1600JB-00REA0, 20.00K20, max UDMA/100
ata1.00: 312581808 sectors, multi 16: LBA48

Второе IDE-устройство — привод DVD-RW производства LG:
ata1.01: ATAPI: HL-DT-ST DVDRAM GSA-4167B, DL11, max UDMA/33

Первичный мастер (primary master) настроен на использование UDMA/100 (максимум, что можно выжать из контроллера), а первичный подчиненный (primary
slave) настроен на UDMA/33:
ata1.00: configured for UDMA/100
ata1.01: configured for UDMA/33

Подмонтирована корневая файловая система типа ext3 с последовательным (ordered) режимом работы журнала:
EXT3-fs: mounted filesystem with ordered data mode.
SELinux:

Disabled at runtime.

SELinux:

Unregistering netfilter hooks

Загружен драйвер сетевой платы Gigabit Ethernet производства Realtek (RTL):
r8169 Gigabit Ethernet driver 2.2LK-NAPI loaded
ACPI: PCI Interrupt 0000:02:00.0[A] -> GSI 19 (level, low) -> IRQ 16
PCI: Setting latency timer of device 0000:02:00.0 to 64
eth0: RTL8168b/8111b at 0xf8862000, 00:19:db:c7:e1:b5, XID 38000000 IRQ 16

Добавлен своп-раздел на /dev/sda7, размер раздела 530 104 Кбайт:
Adding 530104k swap on /dev/sda7.

Priority:-1 extents:1 across:530104k

После завершающего сообщения ядра запускается программа инициализации
системы — в случае с Fedora программа /sbin/init, в других дистрибутивах может
использоваться другая программа.

Глава 13. Ядро

163

13.2. Параметры ядра
Параметры ядра позволяют управлять поведением ядра. Как уже говорилось, мы
можем передать параметры ядра непосредственно при загрузке, используя меню
загрузчика, или же прописать параметры ядра в файлах конфигурации загрузчика.
Первый случай подходит для "одноразового" использования того или иного параметра, а второй — если параметр нужен для корректной работы системы. Поэтому,
чтобы не указывать его каждый раз при загрузке Linux, намного проще прописать
его в файле конфигурации загрузчика.
Если вы используете GRUB/GRUB2, то передать параметры ядра можно так:
сначала надо выбрать образ (метку), а затем нажать клавишу (рис. 13.1). Появится строка, в которой вы можете отредактировать параметры ядра, указанные
в файле конфигурации загрузчика (рис. 13.2).
В случае с LILO (правда, сомневаюсь, что вы уже где-то встретите этот загрузчик) нужно нажать клавишу , после чего вы перейдете в текстовый режим,
где увидите список меток и приглашение boot, например:
Linux
Linux-failsafe
boot:

Чтобы передать ядру Linux параметры, вы должны ввести их в следующем формате:
метка параметры

Рис. 13.1. Выбор метки (GRUB2)

Часть II. Операционная система

164

Рис. 13.2. Редактирование параметров ядра (GRUB2)

Например: Linux noapic.
О том, как сохранить параметры ядра в файле конфигурации загрузчика, было
сказано в главе 10.
Параметров ядра очень много, поэтому в табл. 13.1 собраны самые полезные.
Таблица 13.1. Некоторые параметры ядра Linux
Параметр

Описание

root=устройство

Позволяет указать корневую файловую систему.
Например, root=/dev/hda5

ro

Монтирует корневую файловую систему в режиме "только чтение". Используется по умолчанию. После проверки файловой системы программой fsck корневая файловая система перемонтируется в режим rw

rw

Монтирует корневую файловую систему в режиме "чтение/запись".
При использовании этого параметра нельзя запускать программы
типа fsck. Перед запуском fsck нужно перемонтировать корневую
файловую систему в режиме ro

mem=

Определяет объем памяти, установленной в компьютере. Иногда
ядро неправильно определяет объем оперативной памяти. Вы можете помочь ему в этом, указав параметр mem. Только указывать
его нужно правильно, например:
mem=768M
После числа обязательно должна следовать буква М, иначе ядро
"подумает", что объем оперативной памяти 768 байт

Глава 13. Ядро

165

Таблица 13.1 (окончание)
Параметр

Описание

init=

Позволяет задать программу инициализации. По умолчанию используется программа /sbin/init, но вы можете задать другую программу

reboot=

Позволяет задать тип перезагрузки компьютера. Возможные значения: cold и warm, т. е. "холодная" или "горячая" перезагрузка

single

Однопользовательский режим для администрирования системы,
например, в случае отказа

nodmraid

Отключает программные RAID-массивы, организованные на уровне
BIOS

noapic

Полезен, если вы при загрузке увидите сообщение:
kernel panic — not syncing: IO-APIC + timer doesn't
work!
Подробнее об этом параметре вы можете прочитать по адресу:
http://www.dkws.org.ua/phpbb2//viewtopic.php?topic=
2973&forum=5

nopcmcia

Отключает PCMCIA-карты (для ноутбуков). Полезен, если вы подозреваете, что у вас проблемы с PCMCIA-картой

nodma

Отключается DMA (Direct Memory Access, прямой доступ к памяти)
для всех IDE-устройств

noapm

Отключает APM (Advanced Power Management) — расширенное
управление питанием

nousb

Отключает поддержку USB

noscsi

Отключает поддержку SCSI

pci=noacpi

Не использовать ACPI для управления PCI-прерываниями

apci=off

Полностью отключает ACPI (Advanced Configuration and Power Interface). Полезен на некоторых ноутбуках, когда не удается установить
(а потом загрузить) Linux

edd=off

Отключает EDD (Enhanced Disk Drive). Если при загрузке Linux вы
видите сообщение Probing EDD и загрузка на этом останавливается, тогда вам поможет параметр ядра edd=off

ПРИМЕЧАНИЕ
С дополнительными параметрами ядра вы можете ознакомиться по адресу:
http://dkws.org.ua/phpbb2/viewtopic.php?t=3031.

13.3. Компиляция ядра
Linux, в отличие от многих других операционных систем, позволяет обычному
пользователю проникнуть в святая святых — в собственное ядро. Любой желающий
может загрузить исходные коды ядра и откомпилировать ядро операционной системы.

166

Часть II. Операционная система

Вообще, перекомпиляция ядра — весьма специфическая операция. Раньше ее
нужно было делать довольно часто — практически каждый Linux-пользователь со
стажем хотя бы раз в жизни перекомпилировал ядро. Зачем? Например, чтобы
включить дополнительные функции. Или, наоборот, выключить поддержку некоторых устройств и некоторые ненужные функции — так ядро окажется компактнее
и система будет работать быстрее.
Сейчас я даже не знаю, зачем может понадобиться перекомпиляция ядра. Это
настолько редкая операция в наше время, что даже исходные коды ядра перестали поставляться на дистрибутивных дисках. Исключение составляет дистрибутив
Mandriva 2010 — один из немногих, на дистрибутивном диске которого до сих
пор есть исходники ядра. Вот на его примере мы и будем рассматривать компиляцию ядра — ну не хочется мне "тянуть" исходные коды (более 53 Мбайт)
с www.kernel.org.

13.3.1. Установка исходных кодов ядра
Запустите программу drakrpm и в группе Разработка | Ядро найдите и выберите
пакет kernel-source (рис. 13.3). Программа drakrpm предложит вам установить дополнительные пакеты — соглашайтесь (рис. 13.4).

Рис. 13.3. Установка пакета kernel-source

Глава 13. Ядро

167

Рис. 13.4. Установка дополнительных пакетов

13.3.2. Команда make menuconfig: настройка ядра
После установки исходников перейдите в каталог /usr/src/linux:
# cd /usr/src/linux

Теперь введите одну из двух команд:
# make menuconfig
# make xconfig

Эти команды предназначены для вызова конфигуратора ядра — с его помощью
вы можете включить/выключить функции ядра. Мне больше нравится конфигуратор menuconfig (рис. 13.5) — его можно запускать как в консоли, так и в терминале
(если вы предпочитаете графический режим). А xconfig можно запускать только
в графическом режиме.
СОВЕТ
Графический конфигуратор xconfig основан на библиотеке Qt, поэтому он будет работать, если у вас установлена графическая среда KDE. Если вы используете GNOME,
то вам нужно запустить конфигуратор gconfig, который основан на библиотеке GTK.
А еще проще: используйте menuconfig — он будет работать в любом случае.

Ядро не компилируют без определенной цели. Скорее всего, вы знаете, какую
именно опцию ядра вам нужно включить или, наоборот, выключить. Но если вы

Часть II. Операционная система

168

хотите откомпилировать ядро эксперимента ради, в качестве путеводителя послужит
табл. 13.2, в которой описаны основные разделы опций ядра.

Рис. 13.5. Конфигуратор make menuconfig

Таблица 13.2. Разделы опций ядра
Раздел

Описание

General setup

Общие параметры, например поддержка своп-памяти, межпроцессного взаимодействия System V, Sysctl. Если не знаете, для чего нужна
та или иная опция, выделите ее и нажмите клавишу . А уж если
не знаете английский, то до его изучения лучше опции не выключать!

Enable loadable
module support

Поддержка загружаемых модулей. Драйверы устройств в Linux разработаны в виде модулей ядра. Здесь вы можете указать, нужна ли вам
поддержка модулей. Обычно отключать поддержку модулей на обычных машинах не рекомендуется. Если же вы хотите построить мало
обслуживаемый сервер, работающий по принципу "построил и забыл", отключение поддержки загружаемых модулей позволит даже
повысить безопасность сервера, поскольку злоумышленник не сможет добавить свой код в ядро путем загрузки модуля. Однако в этом
случае ядро будет очень громоздким, потому что вам придется все
нужные вам функции, которые были реализованы в виде модулей,
компилировать в ядро

Enable the block
layer

В этом разделе вы можете включить поддержку больших блочных
устройств размером более 2 Тбайт

Глава 13. Ядро

169

Таблица 13.2 (окончание)
Раздел

Описание

Processor type and features

Здесь вы можете выбрать тип вашего процессора и включить/
выключить различные функции процессора

Power management and
ACPI options

Опции управления питанием (ACPI, APM)

Bus options

Здесь вы можете включить/выключить поддержку различных
системных шин, а также определить их функции

Executable file formats /
Emulations

Параметры поддержки форматов исполнимых файлов

Networking support

Сетевые опции ядра

Device drivers

Драйверы устройств. Здесь вы можете определить, какие устройства должна поддерживать ваша система, а какие — нет

Firmware drivers

Драйверы микропрограммного обеспечения (поддержка различных
BIOS)

File systems

Здесь вы можете определить, какие файловые системы должна
поддерживать ваша система, а какие — нет

Kernel Hacking

Различные параметры, относящиеся непосредственно к ядру

Security options

Параметры безопасности

Cryptographic API

Параметры криптографии (поддержка различных алгоритмов
шифрования данных)

Virtualization

Параметры виртуализации

Library routines

Поддержка различных библиотечных функций (но если заглянуть в этот раздел, то вы увидите, что все эти функции связаны
с вычислением контрольной суммы CRC)

rd

Unofficial 3 party kernel
additions

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

Опции ядра могут быть либо включены, либо выключены. Если опция выключена, то ее код исключается из ядра (при компиляции ядра он не будет учитываться). Если же опция включена, то ее код будет включен в состав ядра. Но есть еще
третье состояние опции — M. Это означает, что опция будет включена в ядро как
модуль. После сборкиядра и модулей все опции, скомпилированные в режиме M,
будут "лежать" на диске, пока не понадобятся ядру. А как только это произойдет,
будет загружен нужный модуль. Вообще о модулях мы уже говорили, поэтому не
будем повторяться.
При выходе из конфигуратора ядра он спросит вас, хотите ли вы сохранить изменения конфигурации ядра (рис. 13.6)? Конечно, хотим!

Часть II. Операционная система

170

Рис. 13.6. Сохранить изменения?

13.3.3. Команды компиляции ядра
После настройки ядра конфигуратор сообщит, что для построения ядра нужно
ввести команду make (рис. 13.7), а для вывода справки — make help.
Спешить с вводом make не будем — ее ввести мы успеем всегда. Лучше введите make help для ознакомления с параметрами команды make. Если вы внимательно прочитаете вывод команды make help, то узнаете, что команда make (без
параметров) аналогична команде make all, которая соберет следующие цели
(отмеченные *):
 vmlinuz — собирает обычное, "большое" ядро;
 modules — собирает модули ядра;
 bzImage — собирает сжатое ядро, которое помещается в каталог arch/i386/boot.
Теперь понятно, что мы можем просто ввести команду make — она проделает
как раз то, что нам нужно: # make (рис. 13.8).
ПРИМЕЧАНИЕ
Компиляция ядра (рис. 13.8) — довольно утомительный процесс. Нет, вам ничего делать не нужно, но именно это и утомляет, поэтому можете смело отойти от компьютера и выпить чашечку чая или кофе — не волнуйтесь, вы успеете перекусить к моменту
завершения сборки ядра. На среднем компьютере время выполнения этой команды
составляет 1−2 часа (этого хватит, чтобы и в магазин сходить, а не только кофе выпить). Один раз я рискнул запустить эту команду в эмуляторе (в виртуальной машине
VMware) — на выполнение операции понадобилось 5 часов.

Глава 13. Ядро

171

Рис. 13.7. Введите команду make

Рис. 13.8. Компиляция ядра

Часть II. Операционная система

172

Но это еще не все. Мы только откомпилировали модули и ядро, но пока не устанавливали их. Для установки модулей введите команду:
# make modules_install

К счастью, данная операция занимает намного меньше времени.
После установки модулей следует установить ядро. Это можно сделать с помощью команды:
# make install

В процессе установки (рис. 13.9) будет добавлена соответствующая метка
в файл конфигурации загрузчика. После этого следует ввести команду reboot для
перезагрузки.

Рис. 13.9. Установка модулей и ядра (make install)

При перезагрузке нужно выбрать метку custom_версия_ядра, например Linux
с ядром custom_2.6.31.5-1mnbcustom (рис. 13.10). Как только система загрузится,
убедитесь, что все нормально работает.
В процессе компиляции ядра создается много ненужных после его завершения
файлов (у меня такого "мусора" насобиралось на 3 Гбайт), а команда make clean

Глава 13. Ядро

173

позволяет весь этот "мусор" удалить. Так что в заключение произведем "генеральную уборку" — откройте терминал и от имени root введите команды:
# cd /usr/src/linux
# make clean

Поздравляю! Вы успешно справились с перекомпиляцией ядра.

Рис. 13.10. Выбор нового ядра при загрузке

ЧАСТЬ III
Программирование в Linux
Часть III посвящена командам для программиста. В главе 14 мы рассмотрим все команды, относящиеся к программированию в Linux на
языке C. Конечно, сам язык C мы рассматривать не будем — этому посвящены другие книги. Но зато мы рассмотрим программирование на
языках командных оболочек bash (глава 15) и tcsh (глава 16), а также
язык обработки текста gawk (глава 17).

Глава 14

Программирование на языке C.
Утилиты для программиста
14.1. Команда gcc: компилятор
Для компиляции программ на языке C используется компилятор gcc, который
установлен по умолчанию в большинстве дистрибутивов. Давайте проверим, установлен ли gcc в вашей системе. Введите команду:
gcc --version

Если в ответ вы получите сообщение, что команда не найдена, значит, нужно
установить gcc. Установке программ в Linux посвящена вся часть IV. В ней вы
обязательно найдете инструкции по установке программ в вашем дистрибутиве.
Попробуем откомпилировать простейшую программу. Создайте файл hello.c
(листинг 14.1).
Листинг 14.1. Файл hello.c
#include
int main(int argc, char** argv) {
printf("Hello, world!\n");
return 0;
}

Теперь введите команду:
gcc -o hello hello.c

Параметр -o задает имя исполнимого файла, который должен создать компилятор
(по умолчанию, если имя не задано, будет создан файл a.out). После компиляции программы в нашем случае будет создан файл hello, который можно запустить так:
./hello

Вы увидите знакомое всем программистам приветствие:
Hello, world!

178

Часть III. Программирование в Linux

У компилятора gcc очень много параметров, их можно разбить на следующие
группы:
 общие параметры;
 параметры языка;
 параметры препроцессора;
 параметры компоновщика;
 параметры каталогов;
 параметры отладки;
 параметры оптимизации.
К общим параметрам относятся параметры -x, -c, -v и -o. С параметром -o мы
уже знакомы — он задает имя результирующего файла. Параметр -v полезен начинающим программистам, которые хотят больше знать о процессе компиляции или
же компиляции сложных проектов, чтобы получить больше информации о самом
процессе.
Параметр -x задает тип языка программы, например:
gcc -x c -o hello hello.c

В качестве типа языка программы можно указать:
 c — самый обычный язык C;
 objective_c — язык Objective C, не нужно путать с C++;
 c++ — это значение нужно указать, если программа написана на C++;
 assembler — для программ, написанных на языке Ассемблера.
Вообще, указывать тип языка необязательно, поскольку в большинстве случаев
компилятор сам определит его.
Параметр -c полезен, если вы хотите только откомпилировать вашу программу,
но не вызывать компоновщик. В результате будет создан объектный файл с "расширением" .o. Процесс компиляции состоит из двух основных этапов: трансляции,
когда создается объектный файл, и компоновки, когда создается исполняемый
файл. Зачем вам нужен объектный файл, вы должны знать сами. Новичкам, которые только-только начинают программировать на C, рекомендую ознакомиться
с процессом компиляции более подробно:
http://ru.wikipedia.org/wiki/Компилятор
Из всех параметров языка мне пригодился только параметр ANSI, который отключает все функции GNU C, несовместимые со стандартом ANSI C. Данный параметр пригодится при компиляции некоторых программ, написанных со строгим
соблюдением стандарта ANSI:
http://ru.wikipedia.org/wiki/ANSI_C
А вот среди параметра препроцессора нашлось сразу три полезных параметра:
 -include — позволяет откомпилировать указанный файл раньше, чем
все остальные, иногда это полезно;

Глава 14. Программирование на языке C. Утилиты для программиста

179

 -nostdinc — запрещает использовать системный каталог с заголовками. При

этом компилятор будет искать заголовки в каталогах, указанных с помощью параметра -I;
 -nostdinc++ — то же самое, но для заголовков языка C++.
Самым важным параметром компоновщика является параметр -l, позволяющий
указать явно библиотеку, которая будет использоваться при сборке вашей программы. Например:
gcc -lmy_lib hello.c

Кроме этого вы также можете использовать параметры -nostdlib и -static.
Первый запрещает использовать все стандартные библиотеки, при этом будут использоваться библиотеки из каталогов, которые заданы параметром -L. Второй параметр задает статическую линковку, учтите, что размер результирующего файла
существенно увеличится.
К параметрам каталогов относятся уже знакомые нам параметры -I и -L. Первый задает каталог с файлами заголовков, а второй — каталог с библиотеками.
К параметрам отладки относится параметр -g, добавляющий отладочную информацию для отладчика gdb. Вы можете отлаживать свои программы, только если
добавили отладочную информацию с помощью параметра -g.
Компилятор gcc может оптимизировать ваши программы, в результате они будут либо быстрее запускаться, либо размер исполнимого файла станет меньше. Поэкспериментируйте с параметрами -O1, -O2, -O3 — это различные уровни оптимизации.

14.2. Команда make: сборка проекта
Серьезные проекты состоят не из одного C-файла, а, как минимум, из нескольких. Чтобы не вводить команды компиляции несколько раз, программисты используют специальные файлы с именем Makefile.
В файле Makefile содержится список файлов, которые нужно откомпилировать
и опции компилятора для каждого файла. Для нашей простой программы создайте
Makefile с содержимым из листинга 14.2.
Листинг 14.2. Файл Makefile
hello: hello.c


gcc -o hello hello.c

Первая строка — это описание файла morning.c. Вторая строка — команда для
компиляции этого файла. Обратите внимание, что перед командой gcc должен
быть символ табуляции. Именно символ табуляции, а не 8 пробелов!
Формат Makefile следующий:
цель1: список_файлов
последовательность команд

Часть III. Программирование в Linux

180
цельN: список_файлов
последовательность команд

В Makefile вы можете использовать макроопределения, например:
CC=gcc
PATH=/usr/include /usr/my/include
FLAGS=-O3 -Wall -I${PATH}

$(CC) $(FLAGS) -c hello.c

К макроопределению можно обратиться с помощью конструкции $(имя).
После создания Makefile (он должен находиться в одном каталоге с файлом hello.c) для компиляции нашего проекта уже не нужно вводить команду с параметрами компилятора, достаточно просто ввести команду:
make

Параметры команды make представлены в табл. 14.1.
Таблица 14.1. Параметры команды make
Параметр

Описание

-C каталог

Перейти в указанный каталог перед началом сборки программы

-d

Вывести отладочную информацию

-f файл

Использовать указанный файл вместо Makefile

-i

Игнорировать ошибки компилятора

-l каталог

В указанном каталоге будет произведен поиск файлов, указанных
в Makefile

-k

Продолжить работу после ошибки, если это возможно

-o файл

Пропустить указанный файл

-s

Тихий режим. Не выводить команды перед их выполнением

-w

Показывать текущий каталог до и после выполнения каждой команды

14.3. Команды из пакета binutils
В пакете binutils вы найдете несколько полезных утилит (табл. 14.2). Подробно
мы их описывать не будем, вы сами сможете прочитать справку по этим командам,
если они вас заинтересуют.
Таблица 14.2. Команды из пакета binutils
Параметр

Описание

ld

Компоновщик (создает из объектного файла исполняемый)

nm

Выводит названия идентификаторов из двоичных файлов

Глава 14. Программирование на языке C. Утилиты для программиста

181

Таблица 14.2 (окончание)
Параметр

Описание

objcopy

Копирует и транслирует двоичные файлы

objdump

Выводит информацию из двоичных файлов

size

Выводит размер секций двоичного файла

strings

Выводит печатаемые строки из двоичных файлов

Лично мне пригодилась утилита strings, она подходит для поиска строк как
в двоичных файлах, так и на разделах жесткого диска в случае повреждения таблицы разделов. Например:
strings /dev/sdaX | grep 'искомая строка'

14.4. Другие полезные команды
Как программисту, вам могут понадобиться следующие команды:
 strip — удаляет таблицу символов из объектного файла, что позволяет сократить размер этого файла, правда, отладить этот файл уже не получится;
 gprof — профайлер для ваших программ. Профайлер — это программа, позволяющая оптимизировать выполнение вашей программы, для каждого вызова
функции профайлер выводит время ее выполнения, что позволяет проанализировать, где происходит задержка выполнения, и оптимизировать код программы
при необходимости.

14.5. Команда gdb: отладка программ
Ошибки в программах можно разделить на две большие группы: синтаксические и логические. Первые исправляются еще при компиляции, а вторые — это
ошибки алгоритма, вычислить такие ошибки бывает нелегко. Ведь с точки зрения
синтаксиса все правильно, но программа делает не то, что вам хочется. Как раз для
таких случаев и предназначены отладчики. В Linux используется отладчик gdb.
Формат вызова отладчика такой:
gdb

[-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir]
[prog[core|procID]]

Описание команд gdb приведено в табл. 14.3.
Чтобы отладчик gdb мог отлаживать программу, нужно добавить служебную
информацию к исполнимому файлу. Как правило, это делается при компиляции
программы (параметр -g):
gcc -g -o hello hello.c

После этого вызываем отладчик так:
gdb hello

Часть III. Программирование в Linux

182

Таблица 14.3. Параметры gdb
Параметр

Описание

-help

Показать краткое описание всех параметров gdb

-nx

Запрет обработки команд файла инициализации .dgbinit

-q

Не показывать приветствие и информацию об авторских правах

-batch

Командный режим. Если отладчик возвращает 0, то были выполнены все команды, которые указаны в файле, заданном параметром -x. Если же были ошибки, отладчик возвращает ненулевое значение

-f

Используется при отладке программ с помощью интерфейса редактора Emacs

-b bps

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

-tty=терминал

Использовать указанный терминал в качестве стандартного вывода отладчика и отлаживаемой программы

-s файл

Читает таблицу символов из указанного файла

-write

Разрешить запись в исполняемые файлы

-e программа

Использовать указанную программу как фильтр дампа

-se

Считать таблицу символов из указанного файла, этот файл будет
использоваться в качестве исполняемого

-core=файл

Указать файл дампа

-x файл

Выполнить указанные в файле команды, используется вместе с
параметром -batch

-d каталог

Добавить указанный каталог к списку каталогов исходного текста

[progcore|procID]

Отлаживаемый объект: программа (prog), файл дампа (core),
идентификатор процесса (procID) при отладке уже запущенной
программы

-p PID

Подключиться к уже запущенному процессу

Если же программа запустилась и завершилась с ошибкой, будет создан файл
дампа (core), его тоже можно "скормить" отладчику:
gdb hello core

Можно даже подключиться к уже запущенному процессу, для этого нужно знать
PID этого процесса (его можно узнать с помощью команд ps и top):
gdb 1234

Процесс отладки программы осуществляется путем ввода команд отладчика.
Самые важные команды отладчика представлены в табл. 14.4.

Глава 14. Программирование на языке C. Утилиты для программиста

183

Таблица 14.4. Команды gdb
Команда

Описание

break [файл:]функция

Установить точку останова (breakpoint)

run [параметры]

Запускает программу и передает ей указанные параметры

bt

Обратная трассировка программы

print выражение

Вывести значение выражения. В выражении можно использовать переменные из вашей программы

C

Продолжить выполнение программы после остановки

next

Выполнить следующую строку программы. Если следующая
строка — вызов функции, то она будет выполнена за один
шаг

step

Выполнить следующую строку программы. Если следующая
строка — вызов функции, то будут выполнены пошагово все
операции функции. Команду next можно использовать, если вы точно уверены, что все ваши функции корректно работают. А вот step используется для более глубокой отладки программы

help [имя]

Выводит общую справку или справку по указанной команде

quit

Выход

Несколько слов о самом процессе отладки. Сначала нужно запустить gdb и загрузить в него программу. Затем нужно установить точку останова, например:
break main

Далее запускаем программу:
run

Выполнение программы дойдет до функции main() и остановится. Затем с помощью команд next и step вы запускаете пошаговое выполнение программы,
а с помощью команды print просматриваете значение ее переменных.

Глава 15

Командный интерпретатор bash
15.1. Настройка bash
bash — это самая популярная командная оболочка (командный интерпретатор)
Linux. Основное предназначение bash — выполнение команд, введенных пользователем. Пользователь вводит команду, bash ищет программу, соответствующую команде, в каталогах, указанных в переменной окружения PATH. Если такая программа найдена, то bash запускает ее и передает ей введенные пользователем
параметры. В противном случае выводится сообщение о невозможности выполнения команды.
Файл /etc/profile содержит глобальные настройки bash, он влияет на всю систему — на каждую запущенную оболочку. Обычно /etc/profile не нуждается в изменении, а при необходимости изменить параметры bash редактируют один из файлов:
 ~/.bash_profile — обрабатывается при каждом входе в систему;
 ~/.bashrc — обрабатывается при каждом запуске дочерней оболочки;
 ~/.bash_logout — обрабатывается при выходе из системы.
Файл ~/.bash_profile часто не существует, а если и существует, то в нем есть всего одна строка:
source ~/.bashrc

Данная строка означает, что нужно прочитать файл .bashrc. Поэтому будем считать основным конфигурационным файлом файл .bashrc. Но помните, что он влияет
на оболочку текущего пользователя (такой файл находится в домашнем каталоге
каждого пользователя, не забываем: "~" означает домашний каталог). Если же
вдруг понадобится задать параметры, которые повлияют на всех пользователей, то
нужно редактировать файл /etc/profile.
В файле .bash_history (тоже находится в домашнем каталоге) хранится история
команд, введенных пользователем. Так что вы можете просмотреть свои же команды, которые вы накануне вводили.
Какие настройки могут быть в .bashrc? Как правило, в этом файле задаются
псевдонимы команд, определяется внешний вид приглашения командной строки,
задаются значения переменных окружения.

Глава 15. Командный интерпретатор bash

185

Псевдонимы команд задаются с помощью команды alias, вот несколько примеров:
alias h='fc -l'
alias ll='ls -laFo'
alias l='ls -l'
alias g='egrep -i'

Псевдонимы работают просто: при вводе команды l на самом деле будет выполнена команда ls -l.
Теперь рассмотрим пример изменения приглашения командной строки. Глобальная переменная PS1 отвечает за внешний вид командной строки. По умолчанию командная строка имеет формат:
пользователь@компьютер:рабочий_каталог

Значение PS1 при этом будет:
PS1=’\u@\h:\w$’

В табл. 15.1 приведены допустимые модификаторы командной строки.
Таблица 15.1. Модификаторы командной строки
Модификатор

Описание

\a

ASCII-символ звонка (код 07). Не рекомендуется его использовать —
очень скоро начнет раздражать

\d

Дата в формате "день недели, месяц, число"

\h

Имя компьютера до первой точки

\H

Полное имя компьютера

\j

Количество задач, запущенных в оболочке в данное время

\l

Название терминала

\n

Символ новой строки

\r

Возврат каретки

\s

Название оболочки

\t

Время в 24-часовом формате (ЧЧ: MM: СС)

\T

Время в 12-часовом формате (ЧЧ: ММ: СС)

\@

Время в 12-часовом формате (AM/PM)

\u

Имя пользователя

\v

Версия bash (сокращенный вариант)

\V

Версия bash (полная версия: номер релиза, номер патча)

\w

Текущий каталог (полный путь)

\W

Текущий каталог (только название каталога, без пути)

\!

Номер команды в истории

\#

Системный номер команды

Часть III. Программирование в Linux

186

Таблица 15.1 (окончание)
Модификатор

Описание

\$

Если UID пользователя равен 0, будет выведен символ #, иначе —
символ $

\\

Обратный слэш

$ ( )

Подстановка внешней команды

Вот пример альтернативного приглашения командной строки:
PS1=’[\u@\h] $(date +%m/%d/%y) \$’

Вид приглашения будет такой:
[denis@host] 12/06/10 $

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

15.2. Автоматизация задач с помощью bash
Представим, что нам нужно выполнить резервное копирование всех важных
файлов, для чего создать архивы каталогов /etc, /home и /usr. Понятно, что понадобятся три команды вида:
tar -cvjf имя_архива.tar.bz2 каталог

Затем нам нужно записать все эти три файла на DVD с помощью любой программы для прожига DVD.
Если выполнять данную операцию раз в месяц (или хотя бы раз в неделю), то
ничего страшного. Но представьте, что вам нужно делать это каждый день или даже несколько раз в день? Думаю, такая рутинная работа вам быстро надоест.
А ведь можно написать сценарий, который сам будет создавать резервные копии
и записывать их на DVD! Все, что вам нужно, — это вставить чистый DVD перед
запуском сценария.
Можно пойти и иным путем. Написать сценарий, который будет делать резервные копии системных каталогов и записывать их на другой раздел жесткого диска.
Ведь не секрет, что резервные копии делаются не только на случай сбоя системы,
но и для защиты от некорректного изменения данных пользователем. Помню, удалил важную тему форума и попросил своего хостинг-провайдера сделать откат.
Я был приятно удивлен, когда мне предоставили на выбор три резервные копии —
осталось лишь выбрать наиболее подходящую. Не думаете же вы, что администраторы провайдера только и занимались тем, что три раза в день копировали домашние каталоги пользователей? Поэтому, автоматизация — штука полезная, и любому
администратору нужно знать, как автоматизировать свою рутинную работу.

Глава 15. Командный интерпретатор bash

187

15.3. Привет, мир!
По традиции напишем первый сценарий, выводящий всем известную фразу:
"Привет, мир!" (Hello world!). Для редактирования сценариев вы можете использовать любимый текстовый редактор, например nano или ee (листинг 15.1).
Листинг 15.1. Первый сценарий
#!/bin/bash
echo "Привет, мир!"

Первая строка нашего сценария — это указание, что он должен быть обработан
программой /bin/bash. Обратите внимание: если между # и ! окажется пробел, то
данная директива не сработает, поскольку будет воспринята как обычный комментарий. Комментарии начинаются, как вы уже догадались, с решетки:
# Комментарий

Вторая строка — это оператор echo, выводящий нашу строку. Сохраните сценарий под именем hello и введите команду:
$ chmod +x hello

Для запуска сценария введите команду:
./hello

На экране вы увидите строку:
Привет, мир!

Чтобы вводить для запуска сценария просто hello (без ./), сценарий нужно
скопировать в каталог /usr/bin (точнее, в любой каталог из переменной окружения PATH):
# cp ./hello /usr/bin

15.4. Использование переменных
в собственных сценариях
В любом серьезном сценарии вы не обойдетесь без использования переменных.
Переменные можно объявлять в любом месте сценария, но до места их первого
применения. Рекомендуется объявлять переменные в самом начале сценария, чтобы потом не искать, где вы объявили ту или иную переменную.
Для объявления переменной используется следующая конструкция:
переменная=значение

Пример объявления переменной:
ADDRESS=www.dkws.org.ua
echo $ADDRESS

188

Часть III. Программирование в Linux

Обратите внимание на следующие моменты:
 при объявлении переменной знак доллара не ставится, но он обязателен при ис-

пользовании переменной;
 при объявлении переменной не должно быть пробелов до и после знака =.
Значение для переменной указывать вручную не обязательно — его можно прочитать с клавиатуры:
read ADDRESS

или со стандартного вывода программы:
ADDRESS='hostname'

Чтение значения переменной с клавиатуры осуществляется с помощью инструкции read. При этом указывать символ доллара не нужно. Вторая команда устанавливает в качестве значения переменной ADDRESS вывод команды hostname.
В Linux часто используются переменные окружения. Это специальные переменные, содержащие служебные данные. Вот примеры некоторых часто используемых
переменных окружения:
 BASH — полный путь до исполняемого файла командной оболочки bssh;
 BASH_VERSION — версия bash;
 HOME — домашний каталог пользователя, который запустил сценарий;
 HOSTNAME — имя компьютера;
 RANDOM — случайное число в диапазоне от 0 до 32 767;
 OSTYPE — тип операционной системы;
 PWD — текущий каталог;
 PS1 — строка приглашения;
 UID — ID пользователя, который запустил сценарий;
 USER — имя пользователя.
Для установки собственной переменной окружения используется команда export:
# присваиваем переменной значение
$ADDRESS=ww.dkws.org.ua
# экспортируем переменную — делаем ее переменной окружения
# после этого переменная ADDRESS будет доступна в других сценариях
export $ADDRESS

15.5. Передача параметров сценарию
Очень часто сценариям нужно передавать различные параметры, например режим работы или имя файла/каталога. Для передачи параметров используются следующие специальные переменные:
 $0 — содержит имя сценария;
 $n — содержит значение параметра (n — номер параметра);
 $# — позволяет узнать количество параметров, которые были переданы.

Глава 15. Командный интерпретатор bash

189

Рассмотрим небольшой пример обработки параметров сценария. Я понимаю,
что конструкцию case-esac мы еще не рассматривали, но общий принцип должен
быть понятен (листинг 15.2).
Листинг 15.2. Пример обработки параметров сценария
# Сценарий должен вызываться так:
# имя_сценария параметр
# Анализируем первый параметр
case "$1" in
start)
# Действия при получении параметра start
echo "Запускаем сетевой сервис"
;;
stop)
# Действия при получении параметра stop
echo "Останавливаем сетевой сервис"
;;
*)
# Действия в остальных случаях
# Выводим подсказку о том, как нужно использовать сценарий, и
# завершаем работу сценария
echo "Usage: $0 {start|stop }"
exit 1
;;
esac

Думаю, приведенных комментариев достаточно, поэтому подробно рассматривать работу сценария из листинга 15.2 не будем.

15.6. Массивы и bash
Интерпретатор bash позволяет использовать массивы. Массивы объявляются
подобно переменным. Вот пример объявления массива:
ARRAY[0]=1
ARRAY[1]=2
echo $ARRAY[0]

15.7. Циклы
Как и в любом языке программирования, в bash можно использовать циклы.
Мы рассмотрим циклы for и while, хотя вообще в bash доступны также циклы
until и select, но они применяются довольно редко.

Часть III. Программирование в Linux

190

Синтаксис цикла for выглядит так:
for переменная in список
do
команды
done

В цикле при каждой итерации переменной будет присвоен очередной элемент
списка, над которым будут выполнены указанные команды. Чтобы было понятнее,
рассмотрим небольшой пример:
for n in 1 2 3;
do
echo $n;
done

Обратите внимание: список значений и список команд должны заканчиваться
точкой с запятой.
Как и следовало ожидать, наш сценарий выведет на экран следующее:
1
2
3

Синтаксис цикла while выглядит немного иначе:
while условие
do
команды
done

Цикл while выполняется до тех пор, пока истинно заданное условие. Подробно
об условиях мы поговорим в следующем разделе, а сейчас напишем аналог предыдущего цикла, т. е. нам нужно вывести 1, 2 и 3, но с помощью while, а не for:
n=1
while [ $n -lt 4 ]
do
echo "$n "
n=$(( $n+1 ));
done

15.8. Условные операторы
В bash доступно два условных оператора, if и case. Синтаксис оператора if
следующий:
if условие_1 then
команды_1
elif условие_2 then
команды_2
...

Глава 15. Командный интерпретатор bash

191

elif условие_N then
команды_N
else
команды_N+1
fi

Оператор if в bash работает аналогично оператору if в других языках программирования. Если истинно первое условие, то выполняется первый список команд, иначе — проверяется второе условие и т. д. Количество блоков elif, понятно, не ограничено.
Самая ответственная задача — это правильно составить условие. Условия записываются в квадратных скобках. Вот пример записи условий:
# Переменная N = 10
[ N==10 ]
# Переменная N не равна 10
[ N!=10 ]

Операции сравнения указываются не с помощью привычных знаков > или ) для обычного
пользователя

%?

Код завершения последней команды

Таблица 16.3. Формат времени
Модификатор

Описание

%U

Время, проведенное командой в пользовательском режиме (в процессорных секундах)

%S

Время, проведенное командой в режиме ядра (в процессорных секундах)

%W

Сколько раз процесс команды был выгружен на диск

%X

Средний размер сегмента кода программы, в килобайтах

%D

Средний объем памяти, используемый командой, в килобайтах

%K

Общий размер памяти, занятый командой (считается как %X+%D), в килобайтах

%M

Максимальный объем памяти, занятый командой, в килобайтах

%F

Количество ошибок страниц памяти

%I

Количество операций ввода

%O

Количество операций вывода

Перед тем как приступить к рассмотрению управляющих структур, рассмотрим
применение скобок в tcsh. Предположим есть переменная:
$ set aa=abra

Потом нам нужно вывести ее в составе строки, для этого мы будем использовать
фигурные скобки:
$ echo ${aa}cadabra
abracadabra

Глава 16. Сценарии на tcsh

203

16.3.4. Управляющие структуры
Условный оператор if
Синтаксис оператора if очень прост:
if (выражение) команда

Команда будет выполнена, если выражение истинно. Выражения формируются
так же, как в языке C. В листинге 16.1 представлен небольшой сценарий, проверяющий количество аргументов, переданных ему.
Листинг 16.1. Первый сценарий на tcsh
#!/bin/tcsh
if ( $#argv == 0 ) echo "Аргументы не заданы"

Также можно использовать следующее выражение:
-n имя_файла

В данном случае возможные варианты n представлены в табл. 16.4.
Таблица 16.4. Значения n
n

Описание

b

Файл является блочным устройством (обмен данными с устройством осуществляется блоками данных)

c

Файл является символьным устройством (обмен данными с устройством
осуществляется посимвольно)

d

Файл является каталогом

e

Файл существует

g

Для файла установлен бит SGID (см. главу 4)

k

Для файла установлен "липкий" бит

l

Файл является символической ссылкой

o

Файл принадлежит текущему пользователю

p

Файл является именованным потоком (FIFO)

r

У пользователя есть право чтения файла

s

Файл не пустой (ненулевой размер)

S

Файл является сокетом

t

Дескриптор файла открыт и подключен к экрану

u

Для файла установлен SUID (см. главу 4)

w

У пользователя есть право записи файла

Часть III. Программирование в Linux

204

Таблица 16.4 (окончание)
n

Описание

x

У пользователя есть право выполнения файла

X

Файл является встроенной командой или его исполнимый файл найден
при поиске в каталогах, указанных в $path

z

Файл пуст (нулевой размер)

Рассмотрим пример использования данного условия:
if -e $1 echo "Файл существует"

Условный оператор if..then..else
Условный оператор if..then..else похож на if, только добавляется блок else
(иначе), который выполняет команды в случае ложности условия. Сокращенная
версия оператора выглядит так:
if (выражение) then
команды, которые будут выполнены в случае истинности выражения
endif

Полная версия оператора выглядит так:
if (выражение) then
команды, которые будут выполнены в случае истинности выражения
else
команды, которые будут выполнены в противном случае (когда выражение = false)
endif

Существует еще одна форма этого оператора, точнее, это отдельный оператор
if..then..elif:
if (выражение1) then
команды (если выражение1 = true)
else if (выражение2) then
команды (если выражение2 = true)
. . .
else
команды (если ни одно из выражений не равно true)
endif

Глава 16. Сценарии на tcsh

205

Рассмотрим небольшой пример использования условного оператора (листинг 16.2).
Листинг 16.2. Пример использования условного оператора
#!/bin/tcsh
# Получаем число из командной строки
set num = $argv[1]
set flag
#
if ($num < 0) then
@ flag = 1
else if (0