Журнал LinuxFormat - перейти на главную

LXF169:Linux – что это?

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Linux – что это?

Нейл Бот­вик ко­па­ет­ся в луч­шей в ми­­ре опе­ра­ци­он­ной сис­те­ме, вы­яс­няя, что же за­став­ля­ет ее ра­бо­тать.

Сло­во «Linux» — од­но из са­мых час­то встре­чаю­щих­ся в этом жур­на­ле, но что оно оз­на­ча­ет? Оно оз­на­ча­ет раз­ное для раз­ных лю­дей — от пу­ри­стов, для ко­то­рых это в пер­вую оче­редь яд­ро, до сто­ронников GNU, ко­то­рые счи­та­ют его ча­стью GNU/Linux, и но­вых поль­зо­ва­те­лей, по­ла­гаю­щих, что это вто­рое на­звание Ubuntu. На са­мом де­ле Linux — все это сра­зу, а выбор за­ви­сит от ва­шей точ­ки зрения. Стро­го го­во­ря, тер­мин “Linux”, ис­поль­зуе­мый от­дель­но, от­но­сит­ся к яд­ру опе­ра­ци­он­ной сис­те­мы, а GNU/Linux — это вся опе­ра­ци­он­ная сис­те­ма, объ­е­ди­няю­щая яд­ро Linux и ин­ст­ру­мен­ты GNU; од­но бу­дет со­вер­шен­но бес­по­лез­но без дру­го­го (или ка­кой-ли­бо его аль­тер­на­ти­вы).

Ес­ли до­ба­вить сю­да еще и при­ло­жения, и неко­то­рые ин­ст­ру­мен­ты, по­зво­ляю­щие управ­лять всем этим в це­лом, вы по­лу­чи­те ди­ст­ри­бу­тив, на­при­мер, Ubuntu.

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

Что та­кое ОС?

Что та­кое ди­ст­ри­бу­тив?

336980.png

Опе­ра­ци­он­ную сис­те­му мож­но оп­ре­де­лить как про­грам­му, необ­хо­ди­мую для то­го, что­бы при­ло­жения ра­бо­та­ли на обо­ру­до­вании – как та­ко­вая, она со­сто­ит из несколь­ких переплетенных уровней. В са­мом серд­це ее ле­жит яд­ро, ко­то­рое взаи­мо­дей­ст­ву­ет с обо­ру­до­ванием че­рез драй­ве­ры и по­зво­ля­ет дру­гим про­грам­мам ис­поль­зо­вать это обо­ру­до­вание. По­верх него рас­по­ла­га­ют­ся раз­лич­ные слои, ра­бо­таю­щие с уст­рой­ст­ва­ми вво­да, се­те­вы­ми уст­рой­ст­ва­ми, уст­рой­ст­ва­ми зву­ка и ви­део. Обыч­но вам неза­чем об этом знать. Знания, конеч­но, бы­ва­ют по­лез­ны при возник­но­вении ка­ких-ли­бо про­блем, но да­же тогда они не так уж важ­ны, осо­бен­но ес­ли ваш ком­пь­ю­тер есть ко­му от­ре­мон­ти­ро­вать. Од­на­ко, раз уж вы чи­тае­те этот жур­нал, есть ве­ро­ят­ность, что вас ин­те­ре­су­ет про­ис­хо­дя­щее «внут­ри» Linux, и мы по­пы­та­ем­ся дать вам пред­став­ление об этом – и о том, кто за что от­ве­ча­ет.

Ди­ст­ри­бу­тив Linux – это спо­соб рас­про­странения осно­ван­ной на Linux опе­ра­ци­он­ной сис­те­мы и со­пут­ст­вую­щих про­грамм. В са­мом на­ча­ле это бы­ли про­сто фай­лы, необходимые для ОС, плюс спо­соб их уста­нов­ки на ком­пь­ю­тер. По­сте­пен­но ди­ст­ри­бу­ти­ву на­ча­ли тре­бо­вать­ся менед­же­ры па­ке­тов, ин­ст­ру­мен­ты об­нов­ления, на­строй­ка GUI и мно­же­ст­во иных удобств. Тем не менее, при появившихся дру­же­лю­бии к поль­зо­ва­те­лю и внешнем лоске (или не появившихся, ес­ли ваш дистрибутив – Gentoo) все ди­ст­ри­бу­ти­вы по-прежнему пред­став­ля­ют со­бой Linux.

Яд­ро

Нерв­ный центр в серд­цевине ва­шей опе­ра­ци­он­ной сис­те­мы Linux.

Яд­ро — это бью­щее­ся серд­це сис­те­мы, но что оно та­кое? Яд­ро — это про­грамм­ный ин­тер­фейс к обо­ру­до­ванию ком­пь­ю­те­ра. Оно об­ща­ет­ся с CPU, па­мя­тью и про­чи­ми уст­рой­ст­ва­ми от имени лю­бой про­грам­мы, уста­нов­лен­ной на ком­пь­ю­те­ре. И как та­ко­вое, яв­ля­ет­ся са­мым низ­ко­уровневым ком­понен­том сре­ди про­грамм — и са­мым важ­ным. Ес­ли в яд­ре есть про­бле­ма, эта про­бле­ма от­ра­жа­ет­ся на лю­бой про­грам­ме, ра­бо­таю­щей на ком­пь­ю­те­ре.

Яд­ро Linux мо­но­лит­но, т. е. все основ­ные сер­ви­сы ОС ра­бо­та­ют в нем. Аль­тер­на­тив­ный под­ход – мик­ро­яд­ро, где боль­шая часть ра­бо­ты де­ла­ет­ся внешними про­цес­са­ми, а яд­ро занима­ет­ся все­го лишь ко­ор­диниро­ванием.

Чис­то мо­но­лит­ное яд­ро непло­хо ра­бо­та­ло рань­ше, когда поль­зо­ва­те­ли ком­пи­ли­ро­ва­ли яд­ро под свое обо­ру­до­вание; но сей­час та­кое ко­ли­че­­ст­во ком­би­на­ций обо­ру­до­вания, что встраи­вание их всех в яд­ро при­ве­дет к по­яв­лению неподъемного фай­ла. По­это­му яд­ро Linux ста­ло мо­дуль­ным: клю­че­вые функ­ции на­хо­дят­ся в фай­ле яд­ра (его мож­но уви­деть в /boot как vmlinuz-version), а оп­цио­наль­ные драй­ве­ры встрое­ны в ви­де от­дель­ных мо­ду­лей в /lib/modules (фай­лы .ko в этой ди­рек­то­рии).

На­при­мер, 64-бит­ное яд­ро Ubuntu 12.10 име­ет раз­мер 5 MБ, и есть еще 3700 мо­ду­лей, занимаю­щих бо­лее 100 MБ. На кон­крет­ной ма­шине нуж­на толь­ко часть из них, и бы­ло бы су­щим бе­зу­ми­ем пы­тать­ся за­гру­зить их все с основ­ным ядром. Вме­сто это­го яд­ро оп­ре­де­ля­ет ис­поль­зуе­мое обо­ру­до­вание и за­гру­жа­ет со­от­вет­ст­вую­щие мо­ду­ли, ко­то­рые ста­но­вят­ся ча­стью яд­ра в па­мя­ти, так что в за­гру­жен­ном ви­де оно по-прежнему оста­ет­ся мо­но­лит­ным, да­же когда рас­пре­де­ля­ет­ся по ты­ся­чам фай­лов. Это по­зво­ля­ет сис­те­ме реа­ги­ро­вать на из­менение обо­ру­до­вания. Ес­ли под­клю­чить уст­рой­ст­во USB, за­гру­зят­ся мо­дуль usb-storage и мо­дуль фай­ло­вой сис­те­мы, необ­хо­ди­мый для то­го, что­бы его под­мон­ти­ро­вать. Вот по­че­му при до­бав­лении обо­ру­до­вания так ред­ко при­хо­дит­ся уста­нав­ли­вать но­вые драй­ве­ры: все они уже есть, и про­сто ждут, когда вы ку­пи­те и под­клю­чи­те но­вые иг­руш­ки. Ком­пь­ю­те­ры, ра­бо­таю­щие на спе­циа­ли­зи­ро­ван­ном обо­ру­до­вании, ко­то­рое не из­ме­ня­ет­ся, на­при­мер, сер­ве­ры, обыч­но име­ют яд­ро с уже ском­пи­ли­ро­ван­ны­ми необ­хо­ди­мы­ми драй­ве­ра­ми и от­клю­чен­ной за­груз­кой мо­ду­лей, что до­бав­ля­ет неболь­шую до­лю безо­пас­но­сти.

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

И еще мо­ду­ли

Ог­ром­ное ко­ли­че­­ст­во мо­ду­лей, боль­шин­ст­во из ко­то­рых – драй­ве­ры уст­ройств, ста­ло од­ной из силь­ных сто­рон Linux: по умол­чанию под­дер­жа­но столь­ко уст­ройств, что драй­ве­ры ка­чать и уста­нав­ли­вать от­ку­да-то еще со­вер­шен­но неза­чем. Но неко­то­рые уст­рой­ст­ва по­ка не ох­ва­че­ны встро­ен­ны­ми в яд­ро мо­ду­ля­ми, обыч­но по при­чине то­го, что код еще очень нов или его ли­цен­зия не по­зво­ля­ет вклю­чать его в яд­ро (да, ZFS, это про те­бя).

Са­мый из­вест­ный при­мер – драй­ве­ры для карт Nvidia. Обыч­но име­нуе­мые сто­ронними мо­ду­ля­ми, хо­тя Ubuntu так­же ис­поль­зу­ет тер­мин «ог­раничен­ные драй­ве­ры», они уста­нав­ли­ва­ют­ся из ва­ше­го менед­же­ра па­ке­тов, ес­ли их под­дер­жи­ва­ет ваш ди­ст­ри­бу­тив. В ином слу­чае их при­дет­ся ком­пи­ли­ро­вать из ис­ходника, что нуж­но бу­дет про­де­лы­вать ре­гу­ляр­но, при ка­ж­дом об­нов­лении яд­ра, по­сколь­ку они при­вя­за­ны к яд­ру, для ко­то­ро­го ком­пи­ли­ро­ва­лись.

Пред­принима­лись некие по­пыт­ки ав­то­ма­ти­зи­ро­вать этот про­цесс, на­при­мер, DKMS (Dynamic Kernel Module Support – ди­на­ми­че­­ская под­держ­ка мо­ду­лей яд­ра), когда при уста­нов­ке яд­ра ав­то­ма­ти­че­­ски пе­ре­ком­пи­ли­ру­ют­ся все сто­ронние мо­ду­ли, де­лая про­цесс об­нов­ления яд­ра поч­ти та­ким же без­бо­лезнен­ным, как про­цесс об­нов­ления поль­зо­ва­тель­ских при­ло­жений.

Го­во­ря о яд­ре, обя­за­тель­но жонг­ли­ру­ют та­ки­ми по­ня­тия­ми, как «об­ласть яд­ра» и «поль­зо­ва­тель­ская об­ласть». Об­ласть яд­ра – это па­мять, доступ к ко­то­рой есть толь­ко у яд­ра; ни од­на поль­зо­ва­тель­ская про­грам­ма (то есть нечто по­ми­мо яд­ра и его мо­ду­лей) не мо­жет ниче­го здесь за­пи­сы­вать, по­это­му сто­рон­няя про­грам­ма не мо­жет по­вре­дить ра­бо­те яд­ра. А поль­зо­ва­тель­ская об­ласть – это об­ласть, доступ к ко­то­рой мо­жет по­лу­чить лю­бая про­грам­ма с со­от­вет­ст­вую­щи­ми при­ви­ле­гия­ми. Это спо­соб­ст­ву­ет ста­биль­но­сти и безо­пас­но­сти Linux, по­сколь­ку ни од­на про­грам­ма, да­же ра­бо­таю­щая от имени су­пер­поль­зо­ва­те­ля-root, не мо­жет на­пря­мую раз­ру­шить яд­ро.

По­ря­док за­груз­ки

Та­ин­ст­вен­ное че­ре­дование вспы­шек и зву­ков при за­пуске.

Боль­шин­ст­во ди­ст­ри­бу­ти­вов при за­груз­ке сра­зу прикрываются за­став­кой, и мы не мо­жем на­блю­дать за про­ис­хо­дя­щим. А про­ис­хо­дит-то мно­го че­го — как до по­яв­ления за­став­ки, так и по­сле. Пер­вым за­гру­жа­ет­ся BIOS с ма­те­рин­ской пла­ты. Она ищет уст­рой­ст­во за­груз­ки и за­гру­жа­ет с него код.

Ес­ли же­ст­кий диск ис­поль­зу­ет тра­ди­ци­он­ную сис­те­му де­ления на раз­де­лы DOS, она со­дер­жит­ся в Master Boot Record (MBR) дис­ка – все­го 512 байт. 64 бай­та ис­поль­зу­ют­ся для хранения таб­ли­цы раз­де­лов для дис­ка (вот по­че­му доступ­ны толь­ко че­ты­ре пер­вич­ных раз­де­ла), а осталь­ные 446 байт оста­ют­ся для ко­да про­грам­мы-за­груз­чи­ка (обыч­но это Grub). В 446 байт осо­бо мно­го функ­ций не впих­нуть, по­это­му все, что де­ла­ет этот код – за­гру­жа­ет оста­ток за­гру­зоч­но­го ко­да от­ку­да-то еще с дис­ка, из того мес­та, которое уста­нав­ли­вае­тся при за­дании ко­да MBR за­груз­чи­ком.

В по­ис­ках спи­ска оп­ций за­груз­ки за­груз­чик счи­ты­ва­ет свой файл кон­фи­гу­ра­ции – обыч­но это /boot/grub2/grub.cfg – и ли­бо ото­бра­жа­ет ме­ню, ли­бо пе­ре­хо­дит пря­ми­ком к за­груз­ке по умол­чанию. На дан­ной ста­дии Linux никак не за­дей­ст­во­ван: ра­бо­та­ет толь­ко код за­груз­чи­ка. Файл кон­фи­гу­ра­ции вы­да­ет за­груз­чи­ку адрес яд­ра Linux и всех необ­хо­ди­мых фай­лов initramfs, а так­же лю­бые дру­гие на­строй­ки, та­кие, как раз­дел root и то, на­до ли скры­вать это все за за­став­кой. Для же­лаю­щих ви­деть, что про­ис­хо­дит на­чи­ная с это­го мо­мен­та и даль­ше, в боль­шин­ст­ве ди­ст­ри­бу­ти­вов за­став­ку мож­но убрать, на­жав кноп­ку Е для ре­дак­ти­ро­вания пунк­тов ме­ню Grub, уда­лив оп­ции за­став­ки и за­глу­шения зву­ков и на­жав F10 для про­дол­жения за­груз­ки.

За­чем ну­жен ramdisk?

Боль­шин­ст­во ди­ст­ри­бу­ти­вов ис­поль­зу­ют файл initramfs – глав­ным об­ра­зом, по той при­чине, что оп­ре­де­лен­ные драй­ве­ры, в ча­ст­но­сти, нуж­ные для за­груз­ки дис­ка (на­при­мер, кон­трол­ле­ры SATA и код фай­ло­вой сис­те­мы), на­до за­гру­жать вме­сте с ядром. Для обыч­но­го ди­ст­ри­бу­ти­ва встраи­вание всех воз­мож­ных оп­ций в яд­ро раз­ду­ет его на­столь­ко, что оно ока­жет­ся нера­бо­то­спо­соб­ным, по­это­му все встраи­ва­ет­ся в ви­де мо­ду­лей, и те, что нуж­ны для за­груз­ки, вклю­ча­ют­ся в initramfs. Это тип ramdisk’а, за­гру­жае­мо­го про­грам­мой за­груз­ки вме­сте с ядром (ис­поль­зуя про­це­ду­ру BIOS, что­бы счи­тать его с дис­ка), со­дер­жа­щий все фай­лы, необ­хо­ди­мые для то­го, что­бы под­мон­ти­ро­вать раз­дел root. Здесь по­мо­га­ет функ­ция рас­по­зна­вания ядром уст­ройств, ре­шая, ка­кие мо­ду­ли за­гру­жать, и за­тем управ­ление пе­ре­да­ет­ся же­ст­ко­му дис­ку. Так­же initramfs ис­поль­зу­ет­ся для вывода на экран за­ста­вок, по­это­му они и по­яв­ля­ют­ся в са­мом на­ча­ле про­цес­са за­груз­ки.

По­сле мон­ти­ро­вания раз­де­ла root, на­пря­мую или че­рез initramfs, все­рь­ез за­пуска­ет­ся по­сле­до­ва­тель­ность инициа­ли­за­ции. Тра­ди­ци­он­но она на­чи­на­ет­ся с за­пуска /sbin/init, ко­то­рая за­тем за­пуска­ет все осталь­ное, под кон­тро­лем /etc/inittab, и от­ве­ча­ет за спи­сок со­об­щений при за­пуске сер­ви­сов, ко­то­рые вы ви­ди­те на кон­со­ли, ес­ли у вас нет за­став­ки. Так­же это по­зво­ля­ет уви­деть, в ка­ком мес­те про­цесс за­груз­ки под­вис или за­нял боль­ше по­ло­жен­но­го вре­мени, ес­ли у вас возник­ли та­кие про­бле­мы.

Но­вые оп­ции

Вре­мя идет, и все эти сис­те­мы под­вер­га­ют­ся из­менениям. На са­мом по­следнем обо­ру­до­вании BIOS за­ме­ня­ет­ся на UEFI, хо­тя ес­ли вы уста­но­ви­ли про­грам­му за­груз­ки, разницы вы не по­чув­ст­вуе­те. Есть так­же по­пыт­ки за­менить тра­ди­ци­он­ную сис­те­му SysVinit, ко­то­рая су­ще­ст­ву­ет уже мно­го лет. Ubuntu ввел Upstart, а Red Hat и Fedora пред­по­чи­та­ют systemd.

Все они де­ла­ют при­мер­но од­но и то же – за­пуска­ют за­да­чи, необ­хо­ди­мые, что­бы за­ра­бо­та­ла ОС. От­ли­ча­ют­ся толь­ко ме­то­ды. Ос­нов­ное раз­ли­чие в том, что SysVinit по­сле­до­ва­тель­на: ка­ж­дый сле­дую­щий сер­вис до­жи­да­ет­ся за­вер­шения за­пуска пре­ды­ду­ще­го. Мед­лен­но за­пускае­мый сер­вис тор­мо­зит все осталь­ные. Upstart и systemd за­пуска­ют сер­ви­сы па­рал­лель­но, из­бе­гая по­доб­ных уз­ких мест. Конеч­но, есть те, кто счи­та­ет, что Linux на­столь­ко ста­би­лен, что вре­мя за­груз­ки не столь важ­но – ес­ли вы вме­сто вы­клю­чения ма­ши­ны мо­же­те уй­ти в спя­щий ре­жим, пе­ре­за­груз­ка ста­но­вит­ся весь­ма ред­ким слу­ча­ем.

(thumbnail)
> Прости, Ричард, но мы не будем все время говорить «GNU слэш».

> Уб­рав за­став­ку, вы уви­ди­те про­цесс за­груз­ки во всей кра­се, в том чис­ле и со­стоя­ние за­пус­кае­мых про­цес­сов.


Персональные инструменты
купить
подписаться
Яндекс.Метрика