**Системы инициализации 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

results matching ""

    No results matching ""