**Системы инициализации Linux
**
Разберемся вначале, как происходит загрузка Linux. Вначале загрузчик BIOS (в качестве наиболее распространенного, в отличии от UEFI) находит загрузочное устройство, например, жесткий диск, а затем считывает первый (нулевой) сектор и передает ему управление. В первом секторе находится главная загрузочная запись (MBR - Master Boot Record), состоящая из первичного загрузчика, таблицы разделов диска (partition table) и флага загрузки. Происходит вызов первичного загрузчика, например загрузчик LILO, который состоит из двух частей: первая находится в MBR, а вторая на диске в виде файла /boot/boot.b. Задача первой части - запуск вторичного загрузчика (второй части), который производит дальнейшую загрузку системы, причем, расположение второй части записано явно (указаны цилиндр, головка, сектор жесткого диска). Вторая часть уже содержит сведения о файловых системах, а карта размещения файлов записана в файле /boot/map. Данный файл используется для поиска ядра и образа виртуального диска (например, при попытке установить Linux). В ходе загрузки ядра ему необходимо прочитать модули поддержки устройств и файловой системы с виртуального диска, если корневая ФС еще не создана. Виртуальный диск загружается в память, ядро монтирует его, как обычную ФС, и загружает с него все необходимые модули. После этого виртуальный диск размонтируется (в случае стандартной загрузки, а не установки) вместо него монтируется корневая файловая система. Для работы с виртуальным диском используют технологию initrd (INITial RAM Disk). Файл образа виртуального диска находится в каталоге /boot и называется initrd-<версия ядра>.
В процессе запуска ядра монтируется корневая ФС и запускается программа init (также существуют и другие системы инициализации, например upstart в Ubuntu), выполняющая дальнейшую инициализацию системы. Данная программа читает конфиг /etc/inittab и запускает процессы по инструкциям из данного файла. Уровень запуска определяет, какие действия будут выполнены программой init.
id:<число>:initdefault: # уровень запуска по умолчанию
0 - останов системы
1 - однопользовательский режим (можно перейти передав ядру параметр single)
2 - многопользовательский режим без поддержки сети
3 - многопользовательский режим с поддержкой сети
4 - не используется
5 - многопользовательский графичесий режим с загрузкой X11 и поддержкой сети
6 - перезагрузка системы
Перейти на тот или иной уровень после загрузки системы можно при помощи команды:
/sbin/init <уровень_запуска> # от имени администратора (root)
Определив уровень запуска, init поочередно запускает сценарии из каталога etc/rc.d/rcX.d, где X - номер уровня запуска. В данных файлах расположены ссылки следующего формата:
S<номер><имя>
<номер> # определяет порядок запуска сценария
<имя> # задает имя сценария (сценарии находятся в /etc/rc.d/init.d
S # ссылки запуска (передается параметр start)
K # ссылки останова сервиса (от kill, передается параметр stop)
# например, при обнаружении в /etc/rc.d/rc3.d файла S10network выполнится команда
/etc/rc.d/init.d/netwok start
# запуск сценариев из init.d (команда service)
service <имя_сервиса> <start|stop|...>
<имя_сервиса> # имя файла в каталоге /etc/rc.d/init.d
При загрузке ядра выводятся сообщения ядра: информационные (об оборудовании, протоколах и прочем) и диагностические (например, об ошибках).
dmesg | less # прочитать сообщения ядра
# Передать параметры ядра загрузчику GRUB обычно можно при нажатии e в меню выбора операционной системы или режима загрузки
метка параметры # параметры ядра (можно передать boot во время загрузки)
root=устройство # Позволяет указать корневую файловую систему. Например, root=/dev/hda5
ro # Монтирует корневую файловую систему в режиме "только чтение".
# Используется по умолчанию. После проверки файловой системы программой fsck корневая файловая система перемонтируется в режим rw
rw # Монтирует корневую файловую систему в режиме "чтение/запись".
# При использовании этого параметра нельзя запускать программы типа fsck. Перед запуском fsck нужно перемонтировать корневую файловую систему в режиме ro
mem= # Определяет объем памяти, установленной в компьютере.
# Иногда ядро неправильно определяет объем оперативной памяти. Вы можете помочь ему в этом, указав параметр mem. Только указывать его нужно правильно, например: mem=768M. После числа обязательно должна следовать буква М, иначе ядро "подумает", что объем оперативной памяти 768 байт
init= # Позволяет задать программу инициализации.
# По умолчанию используется программа /sbin/init, но вы можете задать другую программу
reboot= # Позволяет задать тип перезагрузки компьютера.
# Возможные значения: cold и warm, т. е. "холодная" или "горячая" перезагрузка
single # Однопользовательский режим для администрирования системы, например, в случае отказа
nodmraid # Отключает программные RAID-массивы, организованные на уровне BIOS
noapic # Полезен, если вы при загрузке увидите сообщение:
# kernel panic — not syncing: IO-APIC + timer doesn't work!
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
**Разметка диска (fdisk/parted)
**
Для разметки диска в основном используют программу fdisk (более простая) и parted (более продвинутая, с возможностью переразметки).
fdisk <имя_устройства> # разметка диска (например, /dev/sda)
p # показать разметку
m # справка
q # выйти
n # создать раздел (p - первичный, либо расширенный, номер раздела и т.д.)
# ввести размер в виде +<размер>M (например, +10240M = 10Гбайт)
t # изменить тип раздела (файловую систему)
L # посмотреть доступные ФС
b # выбрать ФС FAT32
w # сохранение таблицы разделов
Утилита parted (PARTition EDitor) является консольной программой, которая используется для создания, удаления, копирования, изменения размера и размещения разделов диска. Также поддерживает прямой доступ диску, что удобно при работе с логическими томами (LVM) и RAID-массивами. Для работы с NTFS обязательна установка пакета linux-ntfs.
parted <имя устройства> # запуск утилиты parted, например, /dev/sda
print # просмотр разделов
help # справка
check n # проверить раздел с номером n
cp [устройство] n m # копировать файловую систему из раздела n в раздел m,
# устройство — это номер устройства, где находится раздел n.
# Если устройство не задано, то считается, что используется текущее
# устройство
mklabel тип # создает новую метку диска
mktable тип # создает новую таблицу разделов
mkfs n тип_фс # создает файловую систему заданного типа на разделе n
mkpart тип [фс] нач кон # создать раздел указанного типа,
# [фc] — необязательный параметр, задающий тип файловой системы.
# Параметры нач и кон задают начало и конец раздела
move n нач кон # переместить раздел с номером n,
# нач и кон — конечные "координаты" раздела, его начало и конец,
# заданные как смещение от "начала" диска в мегабайтах
print [devices|free|all|n] # отображает таблицу разделов
# (если параметры не заданы), список устройств (devices),
# свободное место (free), все найденные разделы (all) или
# информацию о разделе с номером n
quit # выход из программы
rescue нач кон # восстанавливает потерянный раздел в промежутке, заданном
# параметрами нач и кон
resize n нач кон # изменяет размер раздела n
rm n # удаляет раздел с номером n
select устройство # выбирает устройство для редактирования,
# вам нет необходимости выходить из программы для изменения устройства
unit устройство # устанавливает устройство по умолчанию
version # выводит версию parted
set n флаг состояние # изменяет состояние флага для раздела n
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
Также существует графическая версия gparted.
**Информация о системе и пользователях
**
uptime # статистическая информация о работе системы (время с момента перезагрузки)
users # вывод информации о пользователях, подключенный в данный момент
w # список пользователей и выполняемых ими задач
who # список пользователей, время и дата входа
whoami # имя пользователя, который ввел команду
ftpwho # список пользователей, подключенных по ftp
date # вывод и установка даты и времени (например, date <время>)
free # информация об использовании оперативной и виртуальной памяти
df # информация об использовании дискового пространства
md5sum file # вычисление контрольных сумм
Работа с планировщиками
Для выполнения определенной команды в нужное время (однократно) можно использовать программу at, если запущен демон atd.
at <время> [дата]
# далее ввести команды и нажать Ctrl+D
# время необходимо указать в am/pm формате, например, at 2pm
atq # просмотр очереди заданий
atrm n # удалить задание
# файл /etc/at.deny добавляют запрещенные для планировщика команды
В Linux существует специальный демон crond, позволяющий выполнять программы по расписанию, конфигурационный файл /etc/crontab:
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 создают сценарий:
#! /bin/bash
update_av ftp://server.ru/bases
Затем необходимо сделать его исполнимым
chmod +x update_av
Для более гибкого расписания необходимо редактировать непосредственно файл /etc/crontab и добавлять строки в соответствии с форматом:
минуты (0−59) часы (0−23) день (1−31) месяц (1−12) день_недели (0−6, 0 — Вс) команда
# например
0 7 * * * /usr/bin/command1 arguments
20 7 * * * /usr/bin/command2 arguments
# запуск каждый день в 7-00 и в 7-20, замена * на 1 определит раз в неделю или в месяц
По умолчанию команды запускаются в 04-00 утра, но они не будут запущены в случае выключения сервера, поэтому можно изменить данное время.
Планировщик anacron в отличии от crond учитывает время, когда компьютер был выключен, например, если он обнаружил, что задания не выполнены при определенных условиях, то он их выполнит в другое время, но пользователи не могут создавать свои собственные расписания, а файл /etc/anacrontab может отредактировать только администратор (root). Также в случае с anacron возможно указать только период, когда будет выполнена команда (день/неделя/месяц).
Удаленный вход в систему (ssh)
Удаленное подключение к компьютеру используется при помощи протокола telnet, либо более современного SSH (Secure Shell). Все данные по протоколу SSH передаются в зашифрованном виде (используют различные алгоритмы шифрования, но более всего распространены IDEA и RSA). В состав любого дистрибутива Linux входит ssh-сервер в виде пакета openssh, а для установки SSH-клиента необходим пакет openssh-clients.
ssh [опции] <адрес_удаленного_компьютера> # подключение по ssh
<адрес_удаленного_компьютера> # IP или доменное имя компьютера
[опции]
-c blowfish|3des|des # алгоритм шифрования
-c шифр # список шифров, разделенных запятыми для ssh2
# blowfish, twofish, arcfour, cast, des, 3des
-f # переводит ssh в фоновый режим после аутентификации
# например, ssh -f server xterm
-l имя_пользователя # указывает на пользователя, от имени которого нужно
# зарегистрироваться на удаленном компьютере
-p порт # определяет порт ssh-сервер (по умолчанию порт 22)
-q # тихий режим (без вывода сообщений)
-x # отключает перенаправление X11
-X # задействовать перенаправление X11
-1 # использовать ssh1
-2 # использовать ssh2