Linux life from bios to shutdown


 

Макаров Тихон

первые шаги в linux

Так, решил я оглянуться на начинающих. Расскажу, что такое linux. Linux является uniх-подобной системой для персональных компьютеров и рабочих станций. Базируется она на файловых системах ext2 и ext3. Она является многопользовательской ОС с графической системой X Window System. Linux совместима с наиболее распространенными unix и windows системами. Главная особенность линукс заключается в том, что все ее исходники распространяются как freeware & AsIs, что позволяет сознательным пользователям ПК экономить тысячи долларов, отказываясь от windows.

В данной статье я предполагаю рассказать о представления linux о следующих действиях:

а) Включаем питание
б) Открываем какую-нибудь программу
в) Рассматриваем файлы
г) Выключаем компьютер

Итак, начнем мы с загрузки Linux.

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

Когда пользователь включает питание, bios определяет с какого диска ему грузиться (Boot sequence), после чего на выполнение запускается загрузочный код. Это первые 512 байт с диска. Их называют Master Boot Record. В данном месте находится программа, определяющая, где находится вторичный загрузчик. После того, как программа с MBR нашла раздел диска, с которого ей необходимо грузиться, она считывает MBR данного раздела данного диска и запускает программу, находящуюся уже во второй MBR.

В linux наиболее распространенными загрузчиками являются Lilo (Linux loader) и Grub (Grand Unified Boot Loader). Различия между ними не очень велики. Lilo является уже "старичком", в то время, как grub - "малышом".

Конфигурирование Lilo происходит с помощью одноименной команды. Данные по загрузке хранятся в /etc/lilo.conf:

boot=/dev/hda // показывает, что эту запись мы заносим в MBR.
root=/dev/hda1 // образ ядра лежит здесь
install=/boot/boot.b
map=/boot/map
timeout=10 // время ожидания до продолжения загрузки при условии, что пользователь не вмешается
image=/vmlinuz // образ ядра
label=Linux_Rulez // чтобы загрузить linux в текстовом режиме в ответ на
//приветствие LILO: мы должны набрать эту строчку
read-only append=mem="512M" // показывает, что памяти у нас 512 мегабайт, т. к. не каждый чипсет
// может определить столько памяти, желательно подстраховаться
password=Makarov // пароль, он будет незашифрован, так что на lilo.conf лучше поставить права (читай о них дальше) 700, будучи root'om.

В данном листинге мы помещаем загрузчик lilo в mbr диска dev/hda, монтируем корневой каталог dev/hda1, устанавливаем загрузочное ядро /vmlinuz с именем linux и флагом read-only, указывающим на то, что ядро монтирует каталог с правом только на чтение. Кстати, надо сказать, что разделение дисков по типу dev/hda1 несколько непривычно пользователям дисков. hda1 означает первый раздел главного жесткого диска. hda2 - второй. И т.д.

Если Вы отредактировали файл lilo.conf, после чего у Вас перестала запускаться система, то попробуйте указать lilo без параметров. Тогда эта программа загрузки создастся и запишется в mbr заново.

Команда lilo -t может проверить ошибки в lilo.conf без запуска linux. При запуске пользователь видит надпись:

LILO:

При запуске linux можно указать еще несколько параметров типа:

root=/dev/hdXX (изменяет адрес корневого каталога)
init=/sbin/init (путь к init)
init=/bin/bash (запускает только командный интерпретатор при запуске системы)
single (вход в однопользовательском режиме)

Grub читает данные из /boot/grub/grub.conf. Разобраться в нем легко, зная устройство файла конфигурации lilo. Нужно только заметить, что диски в нем представляются в немного другом виде: (hd0, 1). hd0 - первый жесткий диск, а 1 - 2-ой раздел данного диска.

После того как загрузчик запускает linux, начинаются следующие этапы:

1) инициализация ядра

Файлы ядра лежат в /vmlinuz. Загрузка ядра linux происходит в два этапа: запуск программы запуска ядра и запуск ядра этой программой. В данный момент вы видите примерно следующие строки:

Mounting proc filesystem [OK] Setting clock (utc): Sun Feb 31 00.00.01 MST 2005 [OK] ...

При выводе сообщения

Welcome to Red Hat Linux Press 'I' to enter onteractive startup

можно нажать I и перейти в режим подтверждения на выполнение загрузочных действий. Можно так же отредактировать файлы в директории etc/sysconfig/ (в Red Hat) для изменения загрузки.

2) поиск новых устройств

3) запуск демонов

Когда ядро завершает процесс инициализации, оно запускает несколько пользовательских процессов. В linux это демон init и обработчики памяти и сигналов ядра.

Демон init отвечает за дальнейшую загрузку linux. Он запускается в одном из 7 уровней:

1 - однопользовательский режим (предназначен для восстановления систем)
2-4 - многопользовательские
5 - многопользовательский + графическая оболочка (программа xdm, например).
6 - reboot
0 - система прекратила свою работу (выключена, или, как принято говорить, "зомби").

В процессе работы в linux командой telinit X можно сменить режим работы на Х. За процесс init отвечает файл etc/inittab.

4) запуск сценариев запуска

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

etc/rc.d/rc.sysinit
etc/rc.d/rc -runlevel
etc/rc.local

В etc/init.d лежат копии сценариев. Каждый сценарий отвечает за запуск какой-то одной службы или демона коммандами start, stop и restart.

5) переход в режим работы

Теперь пользователь видит приветствующее его окно с просьбой ввести пароль. (Естесственно, в linux есть у пользователей свои права. У каждого пользователя есть свой id. Вся информация о нем хранится в файлах etc/passwd, etc/shadow и etc/group.)

Опишем все процессы и этапы входу пользователя в систему:

а) демон getty отображает содержимое etc/issue
б) пользователь вводит login
в) getty запускает программу login, передавая ей на вход значение, которое ввел пользователь.
г) login выводит сообщение о запросе пароля, считывает его, криптует и сравнивает результат с тем, что лежит в файле etc/shadow
д) Если все прошло успешно, login запускает интерпретатор команд (он отвечает за все команды, выполняющиеся в системе)
е) Ком. интер. запускает сценарии входа в систему, находящиеся в .bash_profile и .bashrc (если ком. интер. - bash)
ж) все, пользователь в системе

Процессы

Все, Linux готов к работе. Можно оглянуться по сторонам. Каждый запуск приложения - создание процесса и потока. Как они представляются в linux? Процесс является сборником потоков, необходимый для описания выполняющихся действий, контролирования обращения программы к ОЗУ, ЦП и устройствам ввода/вывода. Поток - сборник команд.

Ядро выделяет процессу какое-то кол-во страниц памяти (страница памяти - область памяти размером в 4кб.). В них и записывается набор команд и структур данных.

Процессы в linux имеют несколько своих id:

1) Чтобы контролировать работу процесса и определять его, каждому процессу присваивается свой уникальный номер PiD (Process identify). Каждый процесс может породить дочерний (если просматривать все запущенные процессы, то видно, что иногда дочерних процессов может быть даже раза 2 два больше родительских).

2) Для определения прав процесса существуют биты UID (User identify) и EUID (Effictive User identify), которые передается процессу от пользователя, его вызвавшего. Uid показывает, кто является автором процесса (он передается от пользователя, его породившего) и euid для определения прав данного процесса. Для большинства процессов данные биты одинаковы, однако существуют suid программы, имеющие определенные права независимо от того, кто является их автором. Биты GID и EGID показывают все то же самое, но для группы пользователя-автора, а не самого пользователя.

3) Ресурсы, занимаемые программой, определяются приоритетом процесса. Каждую сотую секунды ядро прерывает все процессы и определяет, какие программы необходимо выполнять. Для программ ядро разделяет время работы на равные доли, однако какой-то программе необходимо больше ресурсов. Тогда для процесса устанавливается определенный приоритет. Существуют команды nice и renice, определяющие фактор уступчивости. Надо заметить, что фактор уступчивости не прямо пропорционален приоритету процесса. Наоборот, чем он выше, тем ниже приоритет процесса (диапазон его допустимых знаний = [-20;19])

Сами процессы могут находиться в следующих состояниях: Выполнение, Ожидание (ждет, пока ядро даст ему ресурсы), Остановлен (ядро запретило его выполнение), Выключается (ждет, пока ядро его закроет).

Команда ps aux позволяет узнать обо всех запущенных процессах, выполняющихся в системе на данный момент.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.2 1789 59 ? R 0:00 0.05 init [3] ...

USER - автор процесса
PID - id процесса
%CPU - % использования процессора
%MEM - % использования памяти
VSZ - Виртуальный размер
RSS - Количество страниц памяти, выделяемых под него
TTY - Идентификатор процесса-родителя
STAT - статус выполнения (Z - зомби, S - неактивен, Т - остановлен, R - выполняется и др.)
START - время начала
TIME - кол-во времени, потраченное ЦП на его выполнение
COMMAND - имя и аргумент команды.

Похожих результатов можно добиться с помощью команд: ps - lax и top (причем top - самое удобное устройство).

Файлы и папки

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

/bin - Минимальный набор команд для возможности работы в linux
/boot - Ядро
/dev - файлы всех устройств
/etc - файлы конфигурации системы
/lib - для компилятора С
/opt - дополнительные пакеты программ
/proc - образы выполняющихся процессов
/root - home root'a
/sbin - команды для загрузки системы
/tmp - мусор +
/usr /bin - большинство команд linux
    /include - для С
    /lib - библиотеки для стандартных программ пакеты linux +
/local /bin - локальные исполняемые файлы
    /etc - системные команды
    /lib - вспомогательные файлы
    /sbin - служебные системные команды
    /src - исходники usr/local
    /sbin - редко используемые команды для root
/share /src - исходники разных программ +
/var /adm - разные журналы
    /log - системные журналы
    /spool - буферные каталоги
    /tmp - мусор

Данные о файлах

root@computer# ls -ld /root
drwx------ 27 root root 4096 Jan 01 00:00 /root

1) В первом поле находятся биты режима доступа к файлу. Все файлы в linux имеют права доступа для разных пользователей (на чтение, запись и выполнение (r,w,x)):

а) автор файла (в коде доступа им соответствуют восьмеричные значения 400, 200, 100)
б) группа автора файла (40, 20, 10 соответственно)
в) все остальные (4, 2, 1 соответственно)

Командой chmod можно поменять доступ к файлу. Для наиболее хорошего понимания параметров этой команды запишем таблицу:

Восьмер. число В Двоичной системе Режим доступа
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwх

Итак, если мы выполним команды chmod 755 file, то для file будут установлены следующие параметры доступа: rwxr-wr-w. Если бы данный файл был Suid-программой, то вместо Х в поле владельца файла стояла бы буква S.

2) Второе поле является счетчиком ссылок (жестких и символических (о них читайте лучше в моей статье про безопасность linux, локальный взлом)) на файл.

3) Следующие два поля указывают владельца файла и его группу.

4) В следующем поле - размер папки.

5) О значении последних догадаетесь сами :)

Журналы

Все действия в linux записываются со времени входа пользователя в систему и до выключения linux. Во время загрузки ядра linux создается большой буфер, куда записываются все его действия при начальной загрузке, а когда ядро загрузилось, с помощью команды dmesg данные из буфера перенаправляются в /var/log/dmesg (или var/log/boot.msg). Когда вы входите в систему, данные о входе записываются в var/log/wtmp. Все остальные команды записываются в отдельные журналы, информацию по которым можно посмотреть в файле etc/syslog.conf

Очень удобной системой "журналирования" является syslog. Поскольку ее конфигурирование достаточно сложное (точнее большое по объемам действий), я не буду рассказывать про нее.

Возникает только один вопрос: "О боже, как же проследить все эти логи?". Лично я предпочитаю программы, которые можно найти по адресам:

http://www.psionic.com/products/logsentry
и
http://www.oit.uscb.edu/~eta/swatch

Вот, кажется, и все. Теперь можно набрать команду shutdown и выключить компьютер. Для первого знакомства с устройством linux этого достаточно. Здесь я попытался рассказать новичкам о linux не просто поверхностно, но и углубляясь в подробности. Возможно, это у меня получилось плохо, но я старался. А в следующей статье мы будем учиться работать с сетью.