|
| ||||||||||||
| ||||||||||||
От включения питания до приглашения BashGreg O'Keefe, v0.9, Ноябрь 2000Перевод WintiX, Январь, 2003 Это краткое описание того, что происходит в системе Linux с момента, когда вы включаете питание до момента входа в систему и получения командной строки bash. Понимание этих вещей помогает в решении проблем и настройке системы.
1. ВведениеЯ нахожу огорчительным существование многих вещей в моей Linux, которые я не понимаю. И, если вы, подобно мне, хотите по настоящему разбираться в вашей системе, вместо того чтобы просто знать как ею пользоваться, этот документ может помочь вам начать. Подобные базовые знания будут также необходимымы вам, если вы хотите стать специалистом по решению проблем Linux.
Я буду предполагать, что вы имеете компьютер работающий под Linux, и имеете базовые знания системы UNIX и железа PC. Если это не так, обратитесь к превосходному документу от Эрика Рэймонда (Eric S. Raymond) The Unix and Internet Fundamentals HOWTO Он краток, понятен и охватывает все основы.
Главная тема этого документа - как Linux себя запускает. Однако эта тема попыталась стать несколько шире. Я включил упражнения для каждого раздела и, если вы действительно выполните их - вы научитесь гораздо большему, чем при простом чтении.
Надеюсь, что некоторые читатели предпочтут лучшее, из известных мне, учебное упражнение, а именно - построение системы из исходного кода. Итальянский философ Giambattista Vico (1668-1744) сказал: ``verum ipsum factum'', что значит: ``понимание приходит через делание''. Спасибо Alex'у (см. Благодарности) за эту цитату.
Так что, если вы предпочитаете настоящую самостоятельность, вам надо обратиться к документу Джерарда Бикмана (Gerard Beekmans) Linux From Scratch HOWTO (LFS). LFS содержит подробные инструкции по построению полнофункциональной системы "с листа". На сайте LFS вы также найдете почтовую рассылку для личностей, которые строят системы этим способом. Фрагменты более ранних версий документа, посвященные данной теме, сейчас выделены в отдельный документ ``Building a Minimal Linux System from Source Code'', который может быть найден на странице From PowerUp to Bash Prompt home page. Он объясняет, как правильно мучить систему в чисто учебных целях.
Пакеты рассмотрены в порядке их появления при загрузке системы. Это означает, что если вы устанавливаете пакеты в этом порядке и перегружаете систему после установки очередного пакета, вы каждый раз будете оказываться немного ближе к появлению командной строки bash, ощущая неумолимую поступь прогресса.
Рекомендую вам начинать с чтения основного текста каждого раздела, пропуская упражнения и ссылки. Затем вы можете решить, насколько глубоко вы хотите понять данную тему и какие усилия вы готовы на это потратить, после чего можно начинать сначала, выполняя упражнения и изучая дополнительные материалы.
2. ЖелезоКогда вы включаете компьютер, он выполняет самотестирование дабы быть уверенным, что всё в порядке. Это называется "Самотестирование при включении" (``Power on self test''- POST). Затем начальный загрузчик, размещенный в ROM BIOS, ищет загрузочный сектор. Этот сектор является первым сектором диска и содержит небольшую программу для загрузки операционной системы. Загрузочные сектора помечаются "волшебным" числом 0xAA55 = 43603 в позиции 0x1FE = 510. Это последние два байта сектора. Это позволяет компьютеру решить является ли данный диск загрузочным.
Начальный загрузчик имеет список мест для поиска загрузочных секторов. Моя старая машина ищет на первом флоппи, затем на первом винчестере. Более современные машины могут просматривать CD-ROM. Если он находит загрузочный сектор, он загружает его содержимое в оперативную память и передает управление программе, которая продолжает процесс загрузки ОС. На типичной Linux-машине это будет программа первого шага загрузчика LILO. Существует много способов и конфигураций процесса загрузки. Подробности можно почерпнуть в LILO User's Guide. Ссылки приведены в разделе LILO.
На самом деле о железе PC и его поведении можно рассказать гораздо больше. Но здесь не место. На эту тему есть много хороших книг.
2.1 НастройкаМашина хранит информацию о настройках в CMOS. В том числе там хранятся сведения о дисках и количестве оперативной памяти. BIOS содержит специальную программу, позволяющую вам изменять эти настройки. Следите за сообщениями на экране сразу после включения машины чтобы определить какой клавишей прозводится запуск этой программы. На моей машине необходимо нажать клавишу Delete до начала загрузки ОС.
2.2 УпражненияХорошим способом изучения железа PC являетс самостоятельная сборка компьютера из б/у частей. Для запуска Linux нужна машина с процессором от 386. Это не может дорого стоить. Расспросите друзей и знакомых - наверняка что-нибудь найдете.
Загрузите, скомпилируйте и создайте загрузочный диск для Unios. (В качестве их
домашней страницы значится http://www.unios.org/, но это не работает) Это
всего лишь загрузочная программа ``Hello World!'', состоящая из немногим более
100 строк ассемблерного кода. Было бы не плохо увидеть её преобразованной к
формату ассемблера GNU
Откройте образ загрузочного сектора unios в шеснадцатеричном редакторе. Этот
файл содержит 512 байт - ровно один сектор. Найдите "волшебное число" 0xAA55.
Проделайте тоже самое с загрузочной дискетой или диском вашего компьютера. Вы
можете использовать команду Прочитайте исходные тексты загрузчика LILO.
2.3 Дополнительные сведения
3. LiloКогда компьютер загружает загрузочный сектор на нормальной Linux-машине, то что он загружает является частью lilo (LInux LOader), называемой загрузчиком первого этапа. Эта крохотная программа имеет единственной целью своего существования загрузку и выполнение загрузчика второго этапа.
Загрузчик второго этапа предоставляет вам возможность выполнения команд и может загружать ОС по выбору.
Когда система установлена и запущена, вы можете выполнить команду
Есть множество способов организации загрузки вашей системы. То, что я описал, является наиболее очевидным и "нормальным", по крайней мере для машин, где главной ОС является Linux. Lilo Users' Guide рассматривает несколько примеров стратегий загрузки. С этим стоит ознакомиться, а кое-что и опробовать на практике.
3.1 НастройкаНастройки lilo хранятся в файле
3.2 УпражненияЭТО ОПАСНО: будте осторожны с этими упражнениями. Здесь легко ошибиться, испортить главную загрузочную запись (MBR) и привести систему в нерабочее состояние. Убедитесь, что у вас есть работающая загрузочная дискета и вы знаете как с её помощью восстанавливать загрузочные сектора. Ниже приведена ссылка на tomsrtbt - спасательный диск, который я использую и могу рекомендовать. Лучшая предосторожность - использовать машину на которой нет ничего важного.
Установите lilo на дискету. Неважно если там не окажется ничего кроме ядра - вы получите ``kernel panic'', когда ядро будет готово загрузить init, но по крайней мере вы убедитесь, что lilo работает.
Продолжайте и наблюдайте как много системы вы сможете запихнуть на одну дискету. Кажется это второй из лучших способов изучения Linux. За справками обращайтесь к Bootdisk HOWTO и tomsrtbt (ссылки приведены ниже).
Заставьте lilo грузить unios (см. раздел железо/упражнения). Будет совсем круто, если вы сможете проделать это на дискете.
Создайте загрузочную петлю. Пусть lilo в MBR грузит lilo в одном из загрузочных секторов первичных разделов диска. Последнюю надо заставить грузить lilo из MBR... Возможно также использовать MBR и все четыре первичных раздела диска для создания пятиузлового кольца. Наслаждайтесь!
3.3 Дополнительные сведения
4. Ядро Linux
Ядро выполняет множество полезной работы. Думаю, что правильно охарактеризовать его задачу можно так: оно заставляет железо выполнять задания программ точно, надежно и эффективно.
Процессор может единовременно выполнять только одну инструкцию, однако в системе Linux выполняются одновременно множество вещей. Ядро достигает этого быстрым переключением с задачи на задачу. Это приводит к лучшему использованию процессора, т.к. ядро отслеживает какие процессы готовы активно выполняться, а какие ожидают чего-либо вроде записи в файл или ввода с клавиатуры. Эта задача ядра называется scheduling.
Если программа ничего не делает -- её не надо держать в оперативной памяти. Если даже она что-то делает, могут найтись части, которые не делают ничего. Адресное пространство каждого процесса разделено на страницы. Ядро следит за тем, какие страницы каких процессов используются чаще. Редко используемые страницы могут быть перемещены в своп-раздел. Когда они понадобятся снова, другие неиспользуемые страницы перемещаются в своп, освобождая место в памяти. Это называется управлением виртуальной памятью.
Если вы уже компилировали своё собственное ядро, вы должны были заметить множество опций для различных устройств. Ядро содержит множество специального кода для взаимодействия с разнообразными видами железа и представляет все это для приложений достаточно простым и стандартным способом.
Ядро также управляет файловой системой, межпроцессным взаимодействием и всей этой сетевой кухней.
Будучи загруженным в память, первой задачей ядра является поиск и запуск
программы
4.1 НастройкаБольшинство настроек ядра выполняется при его построении посредством
LILO: linux root=/dev/hda3
Если вы строите систему из исходников, вы можете упростить себе жизнь, создав "монолитное" ядро. Такое ядро не имеет загружаемых модулей. Следовательно вам не понадобится копировать модули ядра на целевую систему.
ВАЖНО: Файл
4.2 УпражненияОсмысли следующее:
Постройте собственное ядро, если вы ещё не сделали этого. Прочтите всю документацию по каждой из опций настройки.
Выясните насколько маленькое (работоспособное) ядро вы сможете создать. Вы сможете многому научиться избавляясь от ошибок.
Прочтите ``The Linux Kernel'' (URL приведен ниже) и последовательно отыскивайте соответствующие части исходного кода. На момент напмсания данного документа эта книга описывала ядро версии 2.0.33, которое явно устарело. Возможно будет проще скачать исходные тексты для старой версии. Как приятно обнаруживать куски C-кода озаглавленные ``process'' и ``page''.
Хакайте! Посмотрим, сможете ли вывести какие-либо дополнительные сообщения или что-то ещё.
4.3 Дополнительные сведения
5. Библиотека GNU CСледующей, после загрузки ядра, вещью, является запуск процесса init. Однако init, подобно другим программам, использует вызовы функций из системных библиотек.
Вы наверняка знакомы с демо-программами похожими на эту:
main() {
printf("Hello World!\n");
}
Программа не содержит определения функции
Если вы заглянете в
Для программ существует два способа использования библиотечных функций. Если
программа собирается статически, эти функции будут скопированы в
создаваемый исполняемый код. Код при этом будет взят из библиотеки типа
Команда
[greg@Curry power2bash]$ ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000)
libc.so.6 => /lib/libc.so.6 (0x4001d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
5.1 НастройкаНекоторые из библиотечных функций зависят от вашего места обитания. Например
у нас в Австралии дату пишут как dd/mm/yy, а американцы пишут mm/dd/yy. Glibc
предоставляет специальную программу для настройки национальных особенностей -
5.2 УпражненияИспользуя
Используя
Создайте игрушечную библиотеку с одной - двумя функциями. Для создания
библиотек используется программа
5.3 Дополнительные сведения
6. InitЯ расскажу вам только о программе init в стиле ``System V'', которая
используется большинством Linux систем. Существуют и другие варианты. На самом
деле вы можете поместить любую программу в
Задачей
Я мог бы расказать вам длинную историю о проблеме переключения "уровней запуска" (``run-levels''), однако я пропущу большую её часть, остановившись исключительно на моментах связанных с запуском системы.
Init читает файл
Далее будет вызван следующий скрипт, который переведёт нас на "уровень
запуска" по умолчанию. Это подразумевает просто некоторый набор подсистем,
которые должны быть запущены. Для обслуживания уровней запуска существует набор
директорий
Итак, скрипт "уровня запуска", вызван процессом
Для изменения списка подсистем, запускаемых по умолчанию, вы должны
установить соответствующие ссылки в директории
Последним важным действием init является запуск некоторого количества
6.1 НастройкаФайлом верхнего уровня настройки init является
Директории
В одном из скриптов, вызываемых init, будет использована команда
6.2 УпражненияНайдите директорию
Измените количество виртуальных терминалов в системе.
Уберите любую не нужную вам подсистему из "уровня запуска" по умолчанию.
Оцените сколько вам удалось сэкономить на старте.
Создайте загрузочную дискету с lilo, ядром и "статически" собранной
программой "hello world", причем последнюю назовите
Отследите все сообщения, выдаваемые системой при запуске. Или распечатайте
содержимое системного журнала echo "Hello, I am rc.sysinit" Это упражнение помогает также в изучении техники написания скриптов под bash. Некоторые из скриптов устроены весьма непросто, поэтому справочник по командам bash окажется весьма кстати.
6.3 Дополнительные сведения
7. Файловая системаВ данном разделе я буду использовать терми "файловая система" в двух разных смыслах. Есть файловые системы на разделах дисков и других устройствах, и есть файловая система как она представлена для вас работающей системой Linux. Под Linux вы монтируете дисковые файловые системы в системную файловую систему.
В предыдущем разделе я упомянул, что скрипты загрузки проверяют и монтируют
файловые системы. Эти действия выполняются соответственно командами
Жесткий диск - это просто большое пространство, на котором можно записывать
единицы и нули. Файловая система предлагает метод структурирования информации на
диске и представляет нам его в виде файлов, размещенных внутри директорий ,
размещенных внутри директорий, размещенных внутри директорий... Каждый файл
представлен inode, который знает чей это файл, когда создан и где размещено его
содержимое. Директории таже представляются inod'ами, которые знают где найти
inod'ы файлов принадлежащих данной директории. Если система хочет прочитать
Если мы добавляем некоторые данные в конец файла, может случиться так, что
данные будут записаны на диск до того как содержание inode для этого файла
успеет обновиться, или наоборот. Если питание компьютера будет отключено в этот
момент, файловая система будет попорчена. Это тот случай, который должен быть
определен командой
Команда
Система Linux поддерживает некоторые другие файловые системы: msdos, vfat, minix и т.п. Специфические детали этих систем скрыты путем использования абстракции виртуальной файловой системы (VFS). Мне бы не хотелось вдаваться в детали. Обсуждение этой темы есть в ``The Linux Kernel''. (для ссылок см. раздел Ядро Linux)
Существенно иной вид файловой системы смонтирован в
7.1 НастройкаКоманда
Всё, что должно быть смонтировано в вашей файловой системе определяется
файлом
7.2 УпражненияСоздайте очень маленькую файловую систему и рассмотрите её с помощью шестнадцатеричного вьюера. Найдите inod'ы, суперблоки и содержимое файла.
Я верю в существование программ, которые представляют файловую систему в графическом виде. Найдите, опробуйте и пришлите мне ссылку и ваши впечатления.
Исследуйте код ядра, относящийся к файловой системе ext2.
7.3 Дополнительные сведения
8. Демоны ЯдраКогда вы используете команду
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND root 1 0.1 8.0 1284 536 ? S 07:37 0:04 init [2] root 2 0.0 0.0 0 0 ? SW 07:37 0:00 (kflushd) root 3 0.0 0.0 0 0 ? SW 07:37 0:00 (kupdate) root 4 0.0 0.0 0 0 ? SW 07:37 0:00 (kpiod) root 5 0.0 0.0 0 0 ? SW 07:37 0:00 (kswapd) root 52 0.0 10.7 1552 716 ? S 07:38 0:01 syslogd -m 0 root 54 0.0 7.1 1276 480 ? S 07:38 0:00 klogd root 56 0.3 17.3 2232 1156 1 S 07:38 0:13 -bash root 57 0.0 7.1 1272 480 2 S 07:38 0:01 /sbin/agetty 38400 tt root 64 0.1 7.2 1272 484 S1 S 08:16 0:01 /sbin/agetty -L ttyS1 root 70 0.0 10.6 1472 708 1 R Sep 11 0:01 ps aux
Это список процессов, выполняющихся в системе. Информация берется из файловой
системы
Эти процессы являются демонами ядра. Большая часть функций ядра не проявляется в списке процессов, и вы можете оценить объем потребляемой ядром памяти только путем вычитания доступной памяти из общего размера памяти компьютера. Демоны ядра стартуют после init и, следовательно, получают номера подобно другим процессам. Но их код и данные остаются в памяти, принадлежащей ядру.
Имена этих процессов заключены в скобки, поскольку файловая система
Так для чего нужны демоны ядра? Предыдущие версии документа содержали просьбу о помощи, так как я очень мало знал о демонах ядра. Последующее изложение было собрано из нескольких разных откликов на эту просьбу, за которые я весьма признателен. Приветствуются и будущие советы, ссылки и исправления!
Ввод и вывод выполняются через расположенные в памяти буферы. Это
позволяет программам выполняться быстрее. То, что программа записывает может
быть сохранено в памяти, в буфере, и записано на диск позднее, более крупной и
эффективной порцией. Эта работа выполняется демонами
Процессы часто остаются без работы, а некоторым нет необходимости держать
весь свой код и данные в памяти. Это значит, что мы могли бы использовать память
лучшим образом, перемещая неиспользуемые части программ в своп-раздел(ы) на
жестком диске. Работа по перемещению данных и кода из памяти на диск и обратно
выполняется демонами
Если вы настроили использование автоматического управления питанием (APM),
здесь будет присутствовать и демон
8.1 НастройкаПрограмма
Включение свопа происходит по команде
8.2 УпражненияВыполните
Перейдите в директорию
8.3 Дополнительные сведения``The Linux Kernel'' из LDP (The Linux Documentation Project) (для сылок см. раздел The Linux Kernel)
Исходные тексты ядра Linux, если вы достаточно отважны! Код
9. Системный ЛоггерInit запускает демонов
9.1 НастройкаФайл
ВАЖНО: Syslog требует присутствия файла
9.2 УпражненияЗагляните в системный журнал. Найдите непонятное вам сообщение и отыщите информацию о том что оно значит.
Направьте все сообщения на терминал (tty). (Потом верните всё обратно).
9.3 Дополнительные сведенияАвстралийское зеркало syslogd
10. Getty и LoginGetty - это программа, которая позволяет вам войти в систему через устройство
последовательного доступа такое как виртуальный терминал, текстовый терминал или
модем. Она отображает приглашение для регистрации (login prompt). Получив от вас
имя пользователя getty передает его
Существует много getty. Некоторые дистрибутивы, включая Red Hat, используют
один из самых маленьких -
Программа
10.1 НастройкаСообщение, появляющееся вверху экрана вместе с приглашением ввести имя
пользователя, прописывается в
10.2 УпражненияСоздайте файл
11. BashЕсли вы ввели правильную комбинацию имя пользователя/пароль,
Как интерфейс пользователя он читает ваши команды и выполняет их сам (если
это "внутренние" команды типа
Мы уже наблюдали работу for f in /home/greg/sh-utils-1.16*.patch; do patch -p0 < $f; done;
Будут найдены все файлы в моей домашней директории, чьи имена начинаются на
11.1 НастройкаФайл
Поведение клавиатуры по умолчанию обычно оставляет желать лучшего. Эти
проблемы решаются с помощью readline. Readline - это отдельный пакет, который
поддерживает интерфейс командной строки, предоставляя историю команд и
автозавершение имен файлов, также как и расширенные возможности редактирования.
Он вкомпилирован в bash. По умолчанию readline настраивается редактированием
файла
Прочтя общесистемный файл настройки, bash ищет ваш персональный файл
настройки. Он ищет его в вашей домашней директории проверяя имена
11.2 УпражненияОсновы bash легки в изучении. Однако вам не следует останавливаться: глубины невообразимы. Заведите привычку всегда искать лучшие пути для выполнения работы.
Читайте скрипты, найдите вещи которые вы не понимаете.
11.3 Дополнительные сведения
12. КомандыБольшинство работы в bash может быть выполнено с использованием команд типа
Команды собраны в пакеты, многие из которых разработаны Фондом Свободного ПО (Free Software Foundation or GNU). Вместо перечисления пакетов я направлю вас к документу Linux From Scratch HOWTO. Там вы найдете полный и свежий перечень пакетов, работающих с Linux, также как и инструкции по их сборке.
13. ЗаключениеЛучшей чертой Linux, по моему скромному мнению, является то, что вы можете залезть вовнутрь и разобраться как оно работает. Я надеюсь, что вы сможете насладиться этим не менее чем я. Я также надеюсь, что эти небольшие заметки помогут вам преуспеть в этом занятии.
14. Официальная часть14.1 Авторские праваАвторские права на этот документ принадлежат (c) 1999, 2000 Greg O'Keefe. Вы можете использовать, копировать, распространять или изменять этот документ не взымая за это денег, следуя соглашениям Общественной Лицензии GNU - GNU General Public Licence. Прошу уведомить меня, если вы используете его целиком или частично как часть другого документа.
14.2 Домашняя страницаПоследнюю версию этого документа можно найти на From Powerup To Bash Prompt также как и сопутствующий материал ``Building a Minimal Linux System from Source Code''.
Перевод на французский: From Powerup To Bash Prompt спасибо Dominique van den Broeck. Японский перевод Yuji Senda ожидается, если его ещё нет на Japanese Documentation and FAQ Project
14.3 Обратная связьБуду признателен за любые комментарии, критику и предложения по улучшению. Пожалуйста, присылайте их мне: Greg O'Keefe
14.4 БлагодарностиНазвания продуктов являются торговыми марками соответствующих владельцев.
Есть несколько людей, которым я хотел бы сказать спасибо за помощь в подготовке этого документа.
14.5 История изменений0.8 -> 0.9 (November 2000)
0.7 -> 0.8 (September 2000)
0.6 -> 0.7
0.5 -> 0.6
14.6 Надо сделать
|
|
CITForum © 1997–2025