Глава 9. Системное администрирование Linux
Файл passwd
Удаление учетных записей
Управление группами Регистрация суперпользователя
Файл сообщений
Сообщения об ошибках
Варианты загрузки Создание загрузочного диска
Пакеты аварийного восстановления
Если вы забыли пароль
LILO
Планирование событий Команда nice
Команда at
Команда batch
Команда cron
Многозадачность
Дополнительно о фоновом и обычном режимах
Область подкачки и быстродействие Свободная память
Использование области подкачки
Подключение устройств
Сообщение дня
Итоги

 
 
 
 
 
 
 
 
 
 
  Глава 9. Системное
администрирование
Linux



 
 

На автономном компьютере с системой Linux вы одновременно являетесь и пользователем, и системным администратором. Конечно, во время установки Linux (см. главу 2) и настройки учетной записи пользователя вы играли роль системного администратора. Поздравляем!

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

Системное администрирование Linux ничем принципиально не отличается от администрирования других UNIX-систем. Все действия, описанные в этой главе, справедливы для всего мира UNIX, а опыт администрирования других UNIX-систем поможет разобраться с Linux.

Системное администрирование ≈ это целый мир. В своем кратком введении мы лишь едва соприкоснемся с азами системного администрирования UNIX. Как мы узнали на собственном опыте, системное администрирование лучше всего изучать на практике. Вероятно, вам не удастся нарушить работоспособность Linux, разве что вы начнете перекомпилировать ядра, возиться с загрузочными записями и т. д. Действия, описанные в этой главе, не будут иметь необратимых последствий.

Файл passwd Информация о пользователях Linux хранится в файле /etc/passwd (не путать с командой passwd!). В этом файле хранятся многие сведения о конфигурации системы, о чем свидетельствует следующий фрагмент: halt:x:7:0:halt:/sbin:/shin/halt
ореrator:х:11:0:ореrator:/root:/bin/bash
root:x:0:0::/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
bin:x:1:1:bin:/bin:
ftp:x:404:1::/home/ftp:/bin/bash
daemon:x:2:2:daemon: sbin:
adm:x:3:4:adm:/var:adm:
lp:x:4:7:Ip:/var/spool/lpd:
mail:x:8:12:mail:/var/spool/mail:
postmaster:x:14:12:postmaster:/var/spool/mail:/bin/bash
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
man:x:13:15:man:/usr/man:
games:x:12:100:games:/usr/games:
nobody:x:65534:100:nobody:/dev/null:
kevinr:x:1000:100:Kevin Reichard,,,:/home/kevinr:/bin/bash
Большинство параметров определяет путь, связанный с конкретной командой (например, путь для man-страниц). Если вам захочется изменить стандартные значения, отредактируйте этот файл (например, если вы используете uucp для подключения к другим системам, а другие системы связываются с вашей, в файле passwd можно изменить путь uucp по умолчанию).

Однако нас больше всего интересует последняя строка файла, в которой описывается конфигурация пользователя kevinr:

kevinr:x:1000:100:Kevin Reichard,,,:/home/kevinr:/bin/bash На примере компонентов этой строки мы посмотрим, как информация о пользователях хранится в Linux:
Не все поля должны обязательно заполняться, однако для пустых полей необходимо зарезервировать место в виде двоеточия (:).

Как видно из приведенного примера, строка привилегированного пользователя root несколько отличается от строки обычного пользователя; вместо идентификаторов пользователя и группы указываются нули.

Файл passwd используется для проверки текущей конфигурации пользователей, а не для ввода данных о новых пользователях. В нем можно вносить изменения, которые будут отражаться на уровне всей системы; например, для смены идентификатора пользователя достаточно отредактировать соответствующее число в строке пользователя. Однако подобное редактирование может вызвать проблемы. Поскольку принадлежность файлов и членство в группах определяются системой по идентификатору пользователя, а не его имени, после подобных изменений все файлы, ранее принадлежавшие пользователю, остаются без владельца, и его придется назначать вручную командой chown. Если смена идентификатора не является абсолютно необходимой, лучше этого не делать.

Команда adduser, с который вы познакомились в главе 2, добавляет в систему новых пользователей. Привилегированный пользователь может в любой момент выполнить эту команду:

gilbert:/# adduser
Удаление учетных записей Оборотная сторона создания учетных записей ≈ это, конечно, удаление. Тем, кто работает в небольшой системе, не придется беспокоиться об удалении записей (кроме ситуаций, когда обиженный работник может навредить).

Однако удаление учетной записи ≈ задача многогранная, потому что из Linux необходимо удалить все ссылки на данного пользователя. Для этого необходимо:

Кроме того, необходимо удалить почтовый файл пользователя, находящийся в каталоге /usr/spool/mail (имя файла совпадает с именем пользователя). Основная часть этой работы может выполняться автоматический командой userdel. Например, для удаления учетной записи kevinr введите следующую команду: userdel -r kevinr Учетную запись можно временно заблокировать, вместо того чтобы удалять ее навсегда. Для этого достаточно ввести звездочку (*) во втором поле файла /etc/passwd. Следующая строка временно блокирует учетную запись kevinr: kevinr:*:1000:100:Kevin Reichard,,,:/home/kevinr:/bin/bash Управление группами В мире UNIX группы традиционно использовались для предоставления совместного доступа к некоторым файлам. Каждый, кто работал в сети, понимает: ограничение доступа к файлам для определенного круга пользователей повышает безопасность и упрощает выполнение организационных задач.

В Linux также поддерживается концепция групп: владельцами каждого файла является пользователь и группа. С помощью командной строки ls -l (буква 1) можно получить полную информацию о режиме доступа к файлу:

gilbert:~$ Is -I
-rwxrw-r--1 kevinr users 87619 Apr 23 23:39 addresses.dat
Таким образом мы узнаем, что владельцами файла addresses.dat являются отдельный пользователь kevinr и группа users; kevinr имеет права чтения, записи и исполнения файла, а группа users ≈права чтения и записи. Все остальные пользователи могут только читать файл.

Содержимое типичного файла /etc/group выглядит так:

root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin.daemon
sys::3: roor,bin,adm
adm::4:root,adm,daemon
tty:: 5:
disk::6:root,adm
Ip::7:Ip
mem::8
kmem::9:
wheel::10:root
floppy::11: root
mail::12:mail
news::13:news
uucp::14:uucp
man::15:man
users::100:kevinr,pat,erc
execs::101:kevinr,pat
nogroup::-1:
Как видите, основная часть содержимого файла /etc/group относится не столько к группам пользователей, сколько к приложениям и правам владения. Строки, относящиеся к группам пользователей, отличить нетрудно ≈ они имеют номера 100 и выше (правило Linux). В приведенном примере для групп пользователей зарезервированы две следующие строки: users::100:kevinr,pat,erc
execs::101:kevinr,pat
На самом деле эти сведения неполны ≈ двойное двоеточие свидетельствует о пропущенном поле. Обычно строки файла /etc/group имеют следующий формат: имя_группы:пароль:идентификатор_группы:пользователи Поле оставлено пустым, потому что в большинстве систем не создаются пароли для групп. Оставляет ли это зияющую брешь в системе безопасности? Вопрос спорный; честно говоря, создание паролей для группы оборачивается лишь ненужными хлопотами. Как правило, эти пароли не используются, а в исключительных случаях следует подумать о приобретении совершенных средств системного администрирования UNIX.
Регистрация суперпользователя Если вы хотите выполнять функции привилегированного пользователя root (например, для добавления и удаления пользователей), необязательно выходить из системы и регистрироваться заново под именем root. Вместо этого можно зарегистрироваться под именем su (сокращение от superuser, то есть ⌠суперпользователь■ ): gilbert:~$ su
gilbert:/home/kevinr#
Обратите внимание: ранее основной каталог обозначался тильдой (~), но после регистрации суперпользователя он принял другой вид ≈ /home/kevinr.

В пользу регистрации суперпользователя существует еще один веский довод (кроме возможности регистрации других суперпользователей при наличии нескольких администраторов в сети): если кто-то зарегистрировался под именем root, система лишь замечает, что в ней появился пользователь root. Но если для получения привилегий root была использована команда su, в файле /var/log/ messages появляется следующая запись:

Арг 27 22:06:30 gilbert su: kevinr on /dev/tty1 Чтобы завершить работу с системой в режиме суперпользователя, введите команду exit или bye: gilbert:/home/kevinr# exit
exit
gilbert:~$
Файл сообщений Файл /var/log/messages может оказать существенную помощь при диагностике проблем в системе Linux, поскольку в нем регистрируется вся деятельность системы и системная конфигурация в момент загрузки Linux. В следующем фрагменте приведены сообщения, записанные в /var/log/messages при загрузке Linux: Kernel logging (proc) started.
Console: colour EGA+ 80х25, 1 virtual console (max 63)
Serial driver version 4.00 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
lp_init: Ip0 exists, using polling driver
ftape: allocated 3 buffers aligned at: 00230000
SBPCD version 2.6 Eberhard Moenkenberg <emoenke@gwdg.de>
SBPCD: Looking for a SoundBlaster/Matsushita CD-ROM drive
SBPCD:
SBPCD: ==========WARNING==========
SBPCD: Auto-Probing can cause a hang (f. e. touching an etnernet
card).
SBPCD: If that happens, you have to reboot and use the
SBPCD: LILO (kernel) command-line feature like:
SBPCD:
SBPCD: LILO boot: linux sbpcd=0x230,SoundBlaster
SBPCD: or like:
SBPCD: LILO boot: linux sbpcd=0x300,LaserMate
SBPCD: or like:
SBPCD: LILO boot: linux sbpcd=0x330,SPEA
SBPCD:
SBPCD: with your REAL address.
SBPCD: ========= END of WARNING ==========
SBPCD:
SBPCD: Trying to detect a SoundBlaster CD-ROM drive at ox230.
SBPCD: - Drive 0: CR-563-x (0.80)
SBPCD: 1 SoundBlaster CD-ROM drive(s) at 0х230,
SBPCD: init done.
Calibrating delay loop.. ok - 25.04 BogoMips
scsi: 0 hosts
Memory: 14562k/16384k available (976k kernel code, 384k reserved,
372k data)
This processor honours the WP bit even when in supervisor mode.
Good.
Floppy drive(s): fd0 is 1.44M
FDC 0 is a 8272A
Swansea University Computer Society NET3.017
Swansea University Computer Society TCP/IP for NET3.017
IP Protocols: ICMP, UDP, TCP
PPP: version 0.2.7 (4 channels) NEW_TTY_DRIVERS OPTIMIZE_FLAGS
TCP compression code copyright 1989 Regents of the University of
California
PPP line discipline registered.
SLIP: version 0.7.5-NET3.014-NEWTTY (4 channels)
CSLIP: code copyright 1989 Regents of the University of California
eth0: 3c505 not found
eth0: D-link DE-600 pocket adapter: not at I/O 0х378.
D-Link DE-620 pocket adapter not identified in the printer port
Checking 386/387 coupling... Ok, fpu using exception 16 error reporting.
Checking 'hit' instruction... Ok.
Linux version 1,1.59 (root@fuzzy) (gcc version 2.5.8) #5 Sat Oct 29
15:50:31 CDT 1994
Partition check:
hda: WDC AC2340H. 325MB W/128KB Cache, CHS=1010/12/55,
MaxMult=16
hda: hda1 hda2
VFS: Mounted root (ext2 filesystem) readonly.
Max size:332509 Log zone size:2048
First datazone: 152 Root inode number 155648
ISO9660 Extensions: RRIP_1991A
gilbert login: ROOT LOGIN ON tty
Смысл большинства сообщений вполне очевиден, но мы прокомментируем некоторые строки в порядке их появления. Первая строка говорит о том, что система начала процесс инициализации. В следующей строке указано разрешение, в котором работает Linux: Console: colour EGA+ 80х25, 1 virtual console (max 63) Разрешение относится только к работе в текстовом режиме, не к Х Window System. Далее перечисляются устройства PC с последовательным интерфейсом и соответствующие им IRQ: tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
Как упоминалось в главе 2, tty00 ≈ эквивалент СОМ1, первого последовательного порта. В строке также сообщается о том, что последовательный пор использует чип UART 16450, предназначенный для быстрого обмена данными.

В строках, начинающихся с SBPCD, происходит настройка звуковой карты SoundBlaster Pro/CD-ROM. Система автоматически опрашивает устройство, чтобы убедиться в его нормальной работе. В следующей строке выводится объем оперативной памяти:

Memory: 14652k/16384k available (976k kernel code, 384k reserved,
372k data)
В данном примере Linux видит все 16 мегабайт памяти, установленной на компьютере. Далее указывается флоппи-дисковод, который Linux опознает как 3,5-дюймовый дисковод высокой плотности, которому соответствует файл устройства /dev/fd0: Floppy drive(s): fd0 is 1.44M Следующая строка сообщает о том, что поиск адаптера Ethernet закончился неудачей ≈ ничего удивительного, потому что на этом компьютере такого устройства нет: eth0: 3c505 not found Однако ниже говорится о том, что компьютер поддерживает протоколы удаленной регистрации SLIP и РРР, а следовательно, может зарегистрироваться на Интернет-хосте: Swansea University Computer Society NET3.017
Swansea University Computer Society TCP/IP for NET3.017
IP Protocols: ICMP, UDP, TCP
PPP: version 0.2.7 (4 channels) NEW_TTY_DRIVERS OPTIMIZE_FLAGS
TCP compression code copyright 1989 Regents of the University of
California
PPP line discipline registered.
SLIP: version 0.7.5-NET3.014-NEWTTY (4 channels)
CSLIP: code copyright 1989 Regents of the University of California
Следующая строка сообщает, что дисковод CD-ROM поддерживает расширения ISO9660: ISO9660 Extensions: RRIP_1991A Наконец, в последней строке зафиксирована регистрация привилегированного пользователя root в системе: gilbert login: ROOT LOGIN ON tty1
Сообщения об ошибках В предыдущем разделе был приведен лишь небольшой фрагмент файла /var/log/messages. Даже после непродолжительного использования Linux этот файл становится очень большим. В частности, в нем содержатся сведения о том, кто и когда регистрировался в системе, даже если попытка регистрации была неудачной: Маr 31 14:48:51 gilbert login: 1 LOGIN FAILURE ON tty1, root Для просмотра сообщений, относящихся к последней загрузке, воспользуйтесь командой dmesg. Выходные данные занимают немало места, поэтому мы рекомендуем перенаправить вывод в less: dmesg | less Варианты загрузки В главе 2 мы описали процесс установки Linux. При этом основное внимание уделялось загрузке системы с помощью loadlin. Но не стоит думать, что loadlin ≈ единственный способ запустить Linux. В этом разделе мы рассмотрим другие варианты, начиная с создания загрузочного диска и заканчивая LILO. Создание загрузочного диска При установке Linux с CD-ROM вам было предложено создать загрузочный гибкий диск. Возможно, вы отказались и подумали: ⌠Обойдемся без загрузочных дисков!■

А потом возникает проблема с загрузкой Linux. Например, из-за маленькой ошибки при компиляции ядра Linux выдает массу панических сообщений об ошибках и не загружается. А может, вы попытались перейти на новое ядро и обнаружили, что система перестала загружаться. Тогда вы начинаете сокрушаться и проклинать себя за то, что когда-то поленились создать загрузочный диск.

Загрузочный гибкий диск содержит корневой раздел, позволяющий разгрузить ядро Linux. На PC загрузка осуществляется с нулевого сектора нулевого цилиндра загрузочного диска, и на многих компьютерах загрузочная информация сначала ищется на диске А:. Если информация не найдена (как правило, дело обстоит именно так), PC просматривает нулевой сектор нулевого цилиндра жесткого диска (проверьте настройки BIOS ≈ например, в расширенной настройке популярных AMD BIOS предусмотрена возможность изменения загрузочного диска).

Загрузка системы Linux с жесткого диска означает лишь то, что в начале этого диска находится ядро или LILO, что гарантирует загрузку Linux. Соответствующие данные хранятся в файле vmlinuz; в процессе загрузки этот сжатый файл распаковывается и запускается. Такой же файл существует на жестком диске. Файлы отличаются только носителями, а не содержимым ядра. При загрузке с гибкого диска загружается ядро, которое затем обращается к жесткому диску за остальными файлами операционной системы. Такая возможность оказывается полезной при тестировании нового ядра.

Некоторые пользователи предпочитают загружать систему с гибких дисков, потому что в этом случае загрузочный сектор жесткого диска может использоваться другой операционной системой. Никто не запрещает вам загрузить Linux с гибкого диска и зарезервировать загрузочные данные жесткого диска для DOS или Windows.

Программа Slackware setup содержит все средства, необходимые для создания загрузочных гибких дисков. Команда Slackware makebootdisk позволяет создать загрузочный диск без необходимости повторного прохождения всех меню программы setup. При запуске команды достаточно указать имя нужного файла ядра:

makebootdisk zImage Makebootdisk выводит простое меню, позволяющее создать один или несколько загрузочных дисков Linux. Это могут быть загрузочные диски LILO (содержащие маленький корневой раздел и обладающие более широкими возможностями) или простые загрузочные диски (содержащие только файл ядра, записанный прямо на диск).
Пакеты аварийного восстановления В мире Linux существуют пакеты аварийного восстановления, которые позволяют создавать диски, специально предназначенные для ситуаций, когда загрузка с гибкого диска становится неизбежной. Конечно, средства аварийного восстановления присутствуют и в Slackware Linux. Во-первых, это корневой диск rescue.gz, который может использоваться с любым загрузочным диском Slackware и обеспечивает небольшую систему Linux с редактором и утилитами восстановления диска. Ниже перечислены эти пакеты, которые можно найти в Интернете по адресу sunsite.unc.edu/pub/Linux/system/recovery/. Bootkit Утилита Bootkit, написанная Скоттом Баркеттом, использует меню для создания загрузочных дисков (как для загрузки, так и для восстановления содержимого разрушенной системы). Находится в файле Bootkit-1.01.tar.gz. Catrescue Утилита Catresque, написанная Олегом Кибиревым, создает диски аварийного восстановления и предоставляет полезную информацию для восстановления системы после сбоя. Находится в файле Catresquel0lE.tgz. Picoboot Утилита загружает систему Linux и запускает редактор pico. Находится в файле picoboot-0.95.tar.gz. Rescue Shell Scripts Пакет Rescue Shell Scripts, написанный Томасом Хейлингом, содержит сценарии оболочки для создания загрузочных и загрузочных/корневых дисков. Находится в файле resque_disk-2.0.2.2.tar.gz. Если вы забыли пароль Такое случается с каждым ≈ особенно при работе на компьютерах, где не приходится ежедневно регистрироваться. Пользователь может забыть свой пароль, но системный администратор располагает средствами для изменения пароля и создания новых учетных записей.

С другой стороны, системному администратору приходится быть непогрешимым. Если вы забудете свой пароль, никто не спасет вас из беды. Забытый пароль ≈ еще одна веская причина для создания загрузочного гибкого диска. В этом случае вам достаточно загрузить компьютер с гибкого диска, подключить раздел /root (при необходимости), удалить существующий зашифрованный пароль из файла /etc/shadow (текст между первыми двоеточиями) и перезагрузить систему с жесткого диска. После этого можно создать новый пароль.

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

LILO В первом издании этой книги мы советовали устанавливать Linux с помощью LILO (LInux LOader, то есть ⌠загрузчик Linux■). В этом издании мы уже не рекомендуем этого делать. Причина проста: выяснилось, что новым пользователям намного удобнее пользоваться loadlin. LILO ≈ программа суровая, не прощающая слабостей. Если допустить ошибку при настройке LILO, скорее всего, загрузочная запись компьютера будет испорчена (еще одна причина для создания загрузочного гибкого диска!). Кроме того, в наши дни, когда на PC мирно сосуществует несколько операционных систем, многие пользователи хотят иметь возможность выхода в Linux из другой операционной системы. В таких условиях оптимальным вариантом оказывается loadlin.

Тем не менее некоторые пользователи предпочитают выполнять загрузку с помощью LILO. Мы всегда стараемся предоставить выбор своим пользователям ≈ особенно опытным пользователям. Поэтому мы сейчас познакомимся с LILO.

Что такое LILO? Программа LILO управляет главной загрузочной записью (Master Boot Record, MBR) загрузочного диска. При включении компьютера BIOS ищет в MBR инструкции, касающиеся дальнейшей загрузки.

Устанавливая LILO, вы приказываете MBR вызывать программу LILO при загрузке. LILO можно запрограммировать на загрузку Linux после определенной паузы или на загрузку других операционных систем (например, DOS или OS/2).

В действительности LILO ≈ программа несложная, а описанный ниже процесс конфигурации делает ее еще проще. LILO работает с файлом конфигурации, автоматически сгенерированным программой setup. На эту программу можно перейти в любой момент. Например, вы можете на первых порах использовать loadlin, а затем перейти на LILO на новой стадии освоения Linux. Прежде всего необходимо запустить процесс командой setup и выбрать операционную систему, которая будет указана в файле конфигурации LILO. Поскольку основной загружаемой системой будет Linux, именно эта система указывается в первую очередь. Затем в качестве дополнительных вариантов загрузки перечисляются другие операционные системы (например, MS-DOS или OS/2). На первом месте в файле конфигурации будет стоять система Linux. После завершения настройки файл принимает следующий вид:

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot=/dev/hda
#compact # faster, but won't work on all systems.
delay = 50
vga = normal # force sane state
ramdisk = 0 # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /vmlinuz
root = /dev/hda2
label = Linux
read-only # Non-UMSDOS filesystems should be mounted read-only for
checking
# Linux bootable partition config ends
# DOS bootable partition config begins
other = /dev/hda1
label = DOS
table = /dev/hda
# DOS bootable partition config ends
Сведения о конфигурации LILO хранится в файле /etc/lilo.conf.

Кроме того, вам будет предложено выбрать паузу перед загрузкой Linux. Одна из удобных возможностей LILO заключается в том, что вы можете выбрать промежуток времени (5 секунд или 30 секунд) между загрузкой LILO и началом загрузки операционной системы. В файле /etc/lilo.conf этот промежуток представлен числом 50 (для 5 секунд) или 300 (для 30 секунд). Во время паузы можно выбрать другую операционную систему в том случае, если вместо Linux требуется загрузить DOS или OS/2. При нажатии левой клавиши Shift после загрузки LILO на экране появляется приглашение:

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

Если вы используете программу Boot Manager системы OS/2, можно создать с ее помощью первичный загрузчик, а затем загрузить Linux с помощью LILO.

Удаление LILO Существует несколько способов удалить LILO. Версия LILO на прилагаемом CD-ROM удаляется из загрузочного сектора следующей командой: gilbert:~$ lilo -u Другой вариант ≈ выполнение следующей команды при работе в DOS: C:\>FDISK /MBR Эта команда передает управление загрузочной записью системе DOS. Планирование событий В Linux существует несколько средств системного администрирования, которые позволяют выполнять определенные события в назначенное время, ≈ например, создание резервной копии системы часто выполняется по ночам. Средства планирования описаны в нескольких следующих разделах. Команда nice Иногда вы запускаете программу, не особенно беспокоясь о том, когда она завершится, ≈ например, если программа запускается перед обеденным перерывом. Если время выполнения несущественно (особенно в больших, многопользовательских системах, чьих вычислительных мощностей хватает на многих пользователей), можно использовать команду nice в сочетании с другими командами. Команда nice названа так потому, что ваша программа ⌠хорошо себя ведет■ в системе. Она указывается в начале командной строки: gilbert:~$ nice команда имя_файла Например, если вы запускаете невероятно сложную сортировку с участием множества файлов, лучше сделать это командой nice перед двухчасовым обеденным перерывом. Команда at Конечно, иногда обед затягивается на три, а то и на четыре часа. Если вы не уверены, что вовремя вернетесь на работу и сможете запустить важную программу, воспользуйтесь командой at.

А если говорить серьезно, команда at обычно используется для снижения нагрузки системы. Она позволяет запустить ночью программу, которая поглощает много системных ресурсов; отправить почту, пока действует льготный тариф; организовать периодическое резервное копирование большого жесткого диска.

Воспользоваться at несложно. Параметр команды at определяет время выполнения:

gilbert:~$ at 11am Команда at предоставляет большую свободу в формате времени запуска. В частности, время может указываться в 12-часовом (как в нашем примере) или в 24-часовом формате.

После нажатия клавиши Enter (или Return) вы переходите на следующую строку без приглашения. Таким способом Linux запрашивает дополнительные данные (впрочем, бывают и исключения). Здесь вводятся команды, выполняемые at. После ввода очередной команды нажимайте Enter (или Return). Ввод завершается клавишами Ctrl+D.

Идентификатор задания ≈ чрезвычайно ценная информация. Чтобы просмотреть список заданий, ожидающих выполнения, выполните команду at с параметром -l:

gilbert:~$ at -l Для многократно выполняемых процедур вместо at лучше воспользоваться командой сrоn, рассмотренной ниже.
Команда batch Команда batch объединяет несколько команд в один пакет, который выполняется в фоновом режиме, не требуя вашего вмешательства. Сначала введите команду batch: gilbert:~$ batch Завершите команду клавишей Enter (или Return). Команда batch, как и at, переходит на новую строку и ждет ввода дополнительных данных. Введите команды, нажимая после каждой клавишу Enter (или Return). Ввод команд завершается клавишами Ctrl+D.

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

В этой книге мы обсуждали выполнение программ в фоновом режиме с использованием символа ⌠амперсанд■ (&). Между фоновыми задачами и batch существуют некоторые принципиальные отличия:

Команда cron Все самое интересное достается системным администраторам ≈ во всяком случае, так было раньше, о чем свидетельствует команда cron. Когда-то команда cron считалась средством системного администрирования и позволяла системным администраторам планировать периодическое выполнение некоторых задач.

Почему нужно использовать cron? Потому что эта команда позволяет планировать автоматическое выполнение повторяющихся операций. Например, можно ежедневно или еженедельно архивировать данные на ленте. Или отправить себе самому почтовое сообщение с напоминанием о важных событиях, не имеющих отношения к компьютерам. Или отправлять электронную почту в другие UNIX-системы поздно ночью, когда действует льготный междугородный тариф.

Нечто похожее делает и команда at. Тогда для чего нужна команда cron? Для выполнения повторяющихся задач. Команда at выполняет одну конкретную задачу в указанное время. Поскольку пользоваться ей намного легче, мы рекомендуем использовать ее для одноразовых задач и приберечь cron для повторяющихся действий.

Cron состоит из двух частей: собственно команды cron и файла crontab.

Создание файла crontab В файле crontab перечисляются задачи для регулярного выполнения. Ваш личный файл crontab находится в каталоге /usr/lib/crontab. Он не создается автоматически в процессе установки Linux. Вы должны сами создать этот файл, хотя делается это косвенно. Вопросы создания и структуры файла crontab могут вызвать затруднения.

Для создания файла crontab можно воспользоваться текстовым редактором (например, elvis или emacs). Тем не менее файл нельзя сохранить прямо в каталоге /usr/lib/crontab. Он сохраняется в другом каталоге, а затем переносится командой cron. Мы опишем типичный процесс создания и перенесения файла crontab.

Строки файла crontab состоят из шести полей, разделенных запятыми. Первые пять полей точно определяют момент выполнения команды, а в шестом поле указывается сама команда.

Предположим, команда должна запускаться каждое утро в 8:30. В этом случае строка файла crontab будет выглядеть так:

30 8 * * * command Смысл всех пяти полей описан в табл. 9.1.
Таблица 9.1. Поля в строках файла crontab
 
Поле
Значение
1 Количество минут
2 Час (в 24-часовом формате)
3 Число
4 Месяц
5 День недели

  При создании файла crontab необходимо помнить следующее: После создания файла crontab (который следует сохранить под любым именем, кроме crontab; назовем его ourfile) он переносится командой crontab: gilbert:~$ crontab ourfile Сron берет файл ourfile, копирует его и сохраняет копию под именем /usr/lib/ crontab/ourname, где ourname ≈ ваше имя пользователя. Если вам потребуется внести изменения в конфигурацию cron, отредактируйте исходный файл (он никуда не исчез ≈ сrоn лишь создает копию) и переустановите его командой crontab с параметром -r: gilbert: ~$ crontab -r Для предотвращения случайных повреждений вам разрешается доступ только к вашему собственному файлу crontab. Примеры содержимого crontab Команда crontab -l выводит содержимое файла crontab для вашего имени пользователя. Например: gilbert: ~$ crontab -l
15 3 * * * /bin/bash /u/erc/my_backup
В этом примере ночь в 3:15 сrоn будет запускать оболочку bash и выполнять сценарий my_backup, находящийся в каталоге /u/erc. Вероятно, этот сценарий архивирует на ленте содержимое некоторых каталогов, а в 3:15 ночи он вызывается из-за того, что в это время компьютер практически не занят.

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

15 3 * * 1 /bin/bash /u/erc/my_backup Время выполнения сценария осталось прежним (3 часа 15 минут).

Чтобы выполнять архивацию 1-го и 15-го числа каждого месяца, воспользуйтесь следующей строкой:

15 3 1,15 * * /bin/bash /u/erc/my_backup На этом наше знакомство с планированием задач в Linux подходит к концу.
Многозадачность Фоновое выполнение команд было кратко рассмотрено в главе 8. Настало время вернуться к этой теме.

Термин ⌠многозадачность■ на компьютерном жаргоне означает, что операционная система может одновременно делать несколько дел. Формулировка звучит просто, но на практике дело обстоит сложнее. Пользователи персональных компьютеров в течение нескольких лет мечтали иметь многозадачную операционную систему (хотя при этом они почему-то игнорировали OS/2, в которой многозадачность организована практически так же, как и в Linux).

В документации по Linux редко встречается термин ⌠многозадачность■ (хотя используется всем компьютерным миром). Linux чаще называется не многозадачной, а многопроцессной (multiprocessing) операционной системой ≈ то же самое, только по-другому выраженное. При выполнении команды Linux (например, ls или cat) вы запускаете процесс. Во время загрузки операционной системы Linux запускается целая серия процессов, хотя на первый взгляд этого и не видно (а в графических средах вроде Х Window System запускается очень, очень много процессов). В больших многопользовательских системах количество одновременно работающих процессов может достигать нескольких тысяч.

Процессы соревнуются друг с другом за ресурсы системы. Запуск программ в фоновом режиме позволяет организовать эффективное распределение ресурсов. Это помогает предотвратить замедление работы, особенно в больших многопользовательских системах с нехваткой ресурсов. Если работающие процессы не помещаются в оперативной памяти компьютера, Linux использует часть жесткого диска для временной выгрузки содержимого памяти ≈ эта операция называется подкачкой (swapping). Разделы подкачки уже упоминались в главе 2. Позднее вы научитесь создавать файл подкачки после установки Linux. Однако жесткие диски работают намного медленнее памяти, поэтому подкачка не всегда желательна. Впрочем, на PC этот выход может оказаться единственным.

Эффективное распределение ресурсов является важной задачей как для системы Linux, так и для пользователя. Распределение ресурсов в Linux (как и многое другое) выполняется иерархически: одни процессы подчиняются другим (по аналогии с тем, как подкаталоги входят в каталоги), при этом один процесс находится в верху пирамиды. При запуске одного процесса другим используется системная функция fork, которая создает новый процесс.

При загрузке системы Linux первый процесс (процесс 1) запускает программу init, которая в свою очередь запускает остальные процессы. Программа init является ⌠предком■ всех процессов, или, в терминологии Linux, родителем (parent) всех ресурсов, которые, в свою очередь, выполняют функции родителей для остальных процессов, называемых дочерними (child processes). Init в конечном счете является предком всех процессов, работающих в системе.

При описании оболочек и их значения для работы программ мы говорили о том, что оболочка выполняет функции родителя и управляет дочерними процессами. Оболочка ждет, пока вы запустите дочерний процесс, и снова отображает приглашение лишь после завершения или уничтожения (командой kill) дочернего процесса. Возможны и другие варианты, из которых самым распространенным является запуск в фоновом режиме. Если дочерний процесс погибает, но родительский процесс об этом ничего не знает, дочерний процесс превращается в зомби (zombie). Какая жуткая метафора!

Операционная система наблюдает за родительскими и дочерними процессами и следит за тем, чтобы они не конфликтовали друг с другом. Для этого она выделяет каждому процессу квант процессорного времени и заботится о том, чтобы каждый процесс получил драгоценные ресурсы процессора. Кроме того, операционная система через программу init управляет теми дочерними процессами, которые были покинуты своими родителями. Такие брошенные процессы называются сиротами (orphans).

Возможно, мы несколько шутливо отнеслись к высокому уровню абстракции, присущему операционной системе Linux, и экзотическим терминам (процессы ⌠родительские■ и ⌠дочерние■, ⌠сироты■ и ⌠зомби■). В действительности все это очень полезно ≈ пользователям и программистам становится проще представить себе совершенно нематериальные понятия.

Чтобы узнать, какие процессы работают на вашем компьютере, воспользуйтесь командой ps:

gilbert:~# ps
PID TTY STAT TIME COMMAND
49 v02 S 0:00 /sbin/getty tty2 38400 console
50 v03 S 0:00 /sbin/getty tty3 38400 console
51 v04 S 0:00 /sbin/getty tty4 38400 console
52 v05 S 0:00 /sbin/getty tty5 38400 console
53 v06 S 0:00 /sbin/getty tty6 38400 console
73 v01 S 0:01 bash
57 v01 S 0:00 sh /usr/x11/bin/startx
258 v01 S 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc -
260 v01 S 0:00 twm
262 v01 S 0:00 /usr/bin/x11/oclock -geom 100х100+0+6
263 v01 S 0:00 /usr/bin/x11/xterm -ls -geom 80х24+3+372
264 v01 S 0:00 /usr/bin/X11/xterm -Is -geom 80х24+264+13
265 pp1 S 0:01 -bash
266 pp0 S 0:00 -bash
293 pp1 R 0:00 ps
48 v01 S 0:00 -bash
Поскольку команда была выполнена на автономном компьютере с Х Window, список работающих процессов оказался не очень длинным. В большой многопользовательской системе он может занять несколько страниц. Четвертое поле, в котором указывается время работы процесса, может представлять интерес в том случае, если в нем присутствуют неожиданно высокие числа. Большинство команд Linux, даже очень сложных, выполняется быстро.

Выше приведена команда ps в простейшем виде. Если информации, которая выводится описанным способом, окажется недостаточно, воспользуйтесь командой ps в длинном формате:

gilbert: ~# ps -l или в иерархическом формате: gilbert: ~# ps -f В последнем варианте команда сообщает, какие процессы являются родительскими, а какие ≈ дочерними: gilbert:~# ps -f
PID TTY STAT TIME COMMAND
49 v02 S 0 00 /sbin/getty tty2 38400 console
50 v03 8 0 00 /sbin/getty tty3 38400 console
51 v04 S 0 00 /sbin/getty tty4 38400 console
52 v05 S 0 00 /sbin/getty tty5 38400 console
53 v06 S 0 00 /sbin/getty tty6 38400 console
48 v01 S 0 00 -bash
73 v01 S 0 01 \_ bash
257 v01 S 0 00 \_ sh /usr/X11/bin/startx
258 v01 S 0 00 \_ xinit /usr/X11R6/lib/X11/xinit/xinitrc -
260 v01 S 0 00 \_ twm
Для нас основной интерес представляет первый столбец, в котором перечислены идентификаторы работающих процессов. При запуске нового процесса ядро присваивает ему определенный идентификатор (процесс init имеет идентификатор 1).

Идентификатор играет важную роль, поскольку он используется для различных манипуляций с процессом. Например, иногда приходится уничтожать процессы из-за того, что они расходуют слишком много драгоценных ресурсов системы или работают не так, как предполагалось. Если процесс работает в обычном режиме, остановите его клавишей Delete или Break (если эти клавиши не работают, попробуйте Ctrl+C или Ctrl+D). Если процесс работает в фоновом режиме или был запущен другим пользователем с другого терминала, для его уничтожения применяется команда kill:

gilbert:~# kill PID где PID ≈ идентификатор процесса (Process IDentifier), полученный командой ps. Процесс получает сигнал, который приказывает ему прекратить существование. Большинство процессов не знает, что делать с этим сигналом, поэтому с горя они совершают самоубийство. Не все процессы реагируют на обычную команду kill; например, оболочки игнорируют команду kill без параметров. Чтобы уничтожить оболочку или другой особенно упрямый процесс, введите команду kill с параметром -9: gilbert:~# kill -9 PID Тем самым вы отправляете процессу сигнал безусловного уничтожения. Для уничтожения нескольких процессов можно воспользоваться следующей командой: gilbert: ~# kill 0 Команда уничтожает все процессы в текущей группе, к которой относятся все процессы, созданные общим предком (обычно оболочкой, выполняющей регистрацию пользователя).
Дополнительно о фоновом и обычном режимах В операционной системе Linux выполняется большое количество процессов, им должны назначаться приоритеты. Вычислительные ресурсы все же не бесконечны, а некоторые задачи просто важнее других ≈ каждому хочется решать свои задачи на личном Cray, но приходится обходиться обычными многопользовательскими системами. Если ваша задача работает, не запрашивая дополнительных данных, запустите ее в фоновом режиме. Это означает, что процесс временно исчезает из поля зрения и возникает снова лишь после завершения команды. Пока программа работает в фоновом режиме, можно заниматься другими делами и запускать другие задачи.

Как говорилось выше, для запуска процесса в фоновом режиме достаточно закончить командную строку символом ⌠амперсанд■ (&):

$ команда параметры & Программы, интенсивно расходующие ресурсы процессора (например, sort), следует запускать в фоновом режиме. После того как команда sort приступит к обработке больших файлов, вам не придется взаимодействовать с ней; ваше дело ≈ запустить команду и не мешать. Команда sort не требует дополнительных данных и в процессе сортировки не выводит данные на экран. То же самое относится и к компиляции программ ≈ программист в ней не участвует, поскольку он уже успел достаточно навредить при написании исходного текста.

Возникает искушение ≈ потребовать, чтобы все программы запускались только в фоновом режиме. Однако делать этого не стоит. Фоновый режим ограничивается узким кругом команд. Например, любая команда, которая требует постоянного взаимодействия с пользователем (например, текстовый редактор или программа электронной почты), не должна запускаться в фоновом режиме.

Область подкачки и быстродействие При установке Linux вам предлагалось создать область подкачки, которая расширяет оперативную память за счет места на жестком диске. Понятие ⌠подкачки■ хорошо знакомо каждому, кто работал с UNIX на любой аппаратной платформе, ≈ особенно когда при переключении между приложениями начинается интенсивный обмен с жестким диском.

Linux использует механизм замещения страниц (paging) для пересылки содержимого памяти (в данном случае страниц размером 4096 байт) между оперативной памятью и жестким диском. Если учесть, насколько интенсивно используется память в любой PC-версии UNIX (чему в немалой степени способствует Х Window System), просто удивительно, каким образом обеспечивается такое быстродействие Linux. Конечно, дело не обходится без некоторых трюков. Например, если страница памяти была получена из файла, доступного только для чтения, эта страница просто отбрасывается и читается заново при следующем обращении. Кроме того, Linux позволяет приложениям совместно использовать содержимое страниц; если одновременно загрузить два разных экземпляра приложения, оба экземпляра в действительности осуществляют чтение из одной страницы памяти.

В процессе установки Linux вам предоставляется возможность создать отдельный раздел для области подкачки. Перед тем как обсуждать этот вариант, мы рассмотрим управление памятью в Linux ≈ это поможет вам решить, действительно ли для подкачки нужно выделить больше места.

Свободная память Команда Linux free выводит информацию о свободной и занятой памяти в вашей системе: gilbert: ~$ free
total used free share buffers cached
Mem 63252 8124 55128 6484 980 3852
-/+ buffers: 3292 59960
Swap: 0 0 0
Общий объем памяти изменяется в блоках; объем блока равен 1024 байтам. Сравните с рис. 9.1, где команда free была выполнена при работе Х Window.
Рис. 9.1. Выполнение команды free в Х
После загрузки Х Window числа несколько изменяются ≈ внезапно свободная память сокращается до 6 мегабайт, тогда как свыше 8 мегабайт занято, а более 6 мегабайт совместно используется процессами.

Числа в столбце buffers относятся к памяти, зарезервированной системой для стандартных дисковых операций. Вместо того чтобы за каждой мелочью обращаться к диску, Linux резервирует для этой цели часть памяти (при нехватке памяти эта область освобождается для других целей).

В данном примере при установке Linux область подкачки не создавалась, отсюда и нули в строке Swap.

Использование области подкачки Если на вашем PC установлено 16 Мбайт памяти, как в предыдущем примере, вероятно, область подкачки вам не понадобится ≈ разве что при интенсивном расходовании памяти вашими задачами (например, при программировании). Вероятно, в таких случаях выделить место для подкачки все же стоит. Но если вы не создали специальный раздел при установке Linux, вам не повезло ≈ придется использовать fdisk, изменять структуру разделов на жестком диске и переустанавливать Linux.

Если владелец компьютера из предыдущего примера захочет выделить место для подкачки, но обойтись без переустановки Linux, остается единственный выход ≈ создать файл подкачки. Создание файла подкачки в действительности имеет много общего с созданием раздела подкачки (см. главу 2), хотя выполняется чуть сложнее.

Прежде всего для файла подкачки необходимо зарезервировать место на жестком диске, а для этого следует воспользоваться командой dd. Но предварительно вы должны определить, сколько места вы хотите зарезервировать и какое имя будет присвоено файлу подкачки (не ломайте голову и назовите его swap). Так, следующая команда создает 10-мегабайтный файл подкачки:

gilbert:~# dd if=/dev/zero of=/swap bs=1024 count=10240 Команда dd записывает данные из специального файла устройства /dev/zero (не беспокойтесь ≈ в данном случае вам ничего не нужно знать об этом файле, кроме факта его существования) в новый файл с именем /swap. Мы выбрали размер блока равным 1024 и всего выделили 10 240 байт, что составляет 10 мегабайт памяти

Файл подкачки создан. Теперь необходимо отформатировать его командой mkswap (вспомните ≈ эта команда упоминалась при описании установки Linux). В данном случае файл /swap форматируется для объема 10 240 байт:

gilbert:~# mkswap -с /swap 10240 Команда sync обеспечивает синхронизацию нового файла подкачки с остальной частью системы: gilbert:~# sync Но это еще не все! Остается сообщить Linux о наличии файла подкачки. Для этого следует ввести команду swapon и указать имя файла подкачки: gilbert:~# swapon /swap После выполнения всех описанных действий можно снова выполнить команду free (рис. 9.2) и убедиться в том, что область подкачки стала доступной.

Чтобы созданная область подкачки постоянно включалась в Linux при загрузке системы, необходимо добавить в файл /etc/fstab новую строку. Этот файл управляет подключением файловых систем в процессе загрузки Linux. Процесс выглядит весьма запутанно, но в действительности происходит следующее. Файл /etc/rc.d/rc.S содержит следующую строку:

swapon -a
Рис. 9.2.Команда free после создания области подкачки
Это означает, что в файле /etc/fstabпроизводится поиск областей подкачки. Если ни одна область не будет найдена, загрузка продолжается как обычно. Если в файле /etc/fstab обнаруживается файл или раздел подкачки, он автоматически подключается при загрузке Linux. Чтобы файл или раздел подключался при каждой загрузке Linux, в файл /etc/fstab должна быть включена строка следующего вида: устройство каталог тип параметры
/swap none swap sw
Для отключения раздела подкачки используется команда swapoff: gilbert:~# swapoff /swap Файл подкачки следует удалять только после предварительного выполнения команды swapoff.

Если вы не собираетесь снова использовать файл подкачки, его можно удалить из системы командой rm. Кроме того, вы должны отредактировать файл /etc/ fstab и удалить из него ссылку на файл подкачки. Если Linux ищет файл подкачки и не находит его, вы получите несколько сообщений об ошибках и рискуете нарушить целостность памяти.

Подключение устройств В терминологии UNIX ⌠подключение■ (mount) устройства означает, что файловая система узнает о наличии устройства, которым она может пользоваться. Таким устройством может быть жесткий диск, дисковод CD-ROM или что-нибудь еще. При запуске Linux система автоматически подключает все устройства вашего компьютера, ссылки на эти устройства хранятся в файле /etc/fstab. Для подключения различных компонентов PC сценарий запуска Linux (обычно находящийся в каталоге /etc/rc.d) берет сведения из файла /etc/fstab.

Теоретически в системе Linux ничего подключать не нужно, если все оборудование было правильно установлено. Возможно, при внесении изменений в систему вам потребуется подключить новый жесткий диск или дисковод CD-ROM или же подключить стример лишь в тот момент, когда он вам понадобился.

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

gilbert:~# mount устройство каталог В Linux для идентификации устройств используются последовательности имен (/dev/scd0 для первого SCSI-дисковода CD-ROM в системе, /dev/scdl ≈ для второго и т. д.). Каталог просто определяет каталог файловой системы, через который вы сможете обращаться к файлам данного устройства. Например, для подключения SCSI-дисковода CD-ROM к каталогу /cdrom используется следующая командная строка: gilbert:~# mount /dev/scd0 /cdrom -t iso9660 Команда mount обычно выполняет надежную автоматическую проверку типа файловой системы (по крайней мере, для CD-ROM), поэтому тип в командной строке указывать не обязательно.

Дисководы CD-ROM с интерфейсом IDE обычно соответствуют устройствам /dev/hdb, /dev/hdc или /dev/hdd. Подключение дисковода CD-ROM с интерфейсом IDE почти не отличается от подключения SCSI-дисковода:

gilbert:~# mount /dev/hdb /cdrom -t iso9660 Для отключения ранее подключенных файловых систем применяется команда umount: gilbert: ~# umount /cdrom
Сообщение дня Администраторы, работавшие на других UNIX-системах, часто отправляют ежедневное сообщение всем пользователям своей системы. Такая возможность предусмотрена и в Linux.

Когда пользователь регистрируется в системе, на экране автоматически отображается содержимое файла /etc/motd. Следовательно, чтобы отправить сообщение дня, необходимо создать файл /etc/motd. Для этого можно воспользоваться текстовым редактором (например, elvis или emacs) и сохранить текст в файле с именем /etc/motd.

Один из системных сценариев запуска (/etc/rc.d/rc.S) создает новые сообщения /etc/motd и /etc/issue на основании имени работающего ядра. Если вы хотите использовать собственные файлы сообщений, закомментируйте в этом сценарии строки, создающие файлы /etc/motd и /etc/issue, или ваши сообщения будут стерты при перезагрузке.

Итоги В этой главе рассматриваются основные задачи системного администрирования в Linux. Среди них немало повседневных операций ≈ таких, как добавление и удаление пользователей, управление группами, создание загрузочных гибких дисков, планирование запуска команд и т. д. Однако системное администрирование UNIX отнюдь не ограничивается описанными задачами, и если вы серьезно относитесь к этой теме, мы рекомендуем приобрести хорошую книгу по системному администрированию UNIX и применить описанные в ней общие концепции к Linux.