Как да направим Debian да стартира по-бързо
Преди три години на един рожден ден (на Червото) след като разглобихме на съставните му части един HP notebook, се заформи дискусия защо (в частния случай на моето и на още едно PC) Debian Linux се стартира толкова бавно. В резултат на дискусията на място поправих rc скрипта, така че да позволява паралелно стартиране на boot script-овете, от което linux-а започна да се стартира около 3 пъти по-бързо (всъщност подобен код и поправка си правих на линукса от години, но тогава се избистри напълно). Тази поправка в момента е стандартна част от Debian дистрибуцията (и следователно и на всички деривати като Ubuntu, Kubuntu и подобни), малко пренаписана (аз я бях направил значително по-малка, но с използване на bash специфични функции – например генериране на ред от числа) уж за да работи под всякакъв shell, макар че за мен това е безсмислено, тъй като Debian използва винаги bash и има изключително много „забравени” башовизми по всички стартиращи скриптове. Такова разширение, което позволява паралелно стартиране на boot скриптовете вече се намира и по другите Unix базирани операционни системи.
Обаче не е пуснато по подразбиране и често чувам незапознати да обясняват как “Linux” се стартирал много бавно. На това ще дам коментар, че има Linux-и които стартират успешно в рамките на около 5 секунди, на специализирани устройства може дори по-малко. Просто човек трябва да си познава OS-а, за да извлече максимума от него.
Та основната идея е базирана на правилото на OSF за отговарящите на OSF Unix подобни операционни системи за последователност на старта на инициализиращите скриптове: по време на старт се стартират скриптовете намиращи се в директория /etc/rcX.d (където X е нивото, в което ос-а е включен да работи в този момент) и имената им започват с S* последователно, подредени по азбучен ред. Препоръчително е имената да са формирани SXXиме_описващо_предназначението, където XX е число от 00 до 99. Така спазвайки правилото за стартиране по азбучен ред, винаги S00* ще бъде стартиран преди S01*, който ще е стартиран преди S98* и т.н. При спиране на машината се спазва същата процедура,но за скриптовете започващи с K. При старт, стоп или рестарт, на скрипта се подава параметър start, stop, restart макар, че много скриптове не го и обработват.
Статистически обаче много скриптове започват с едно и също SXX*. Това означава, че не зависят един от друг и не разчитат един от тях да е стартиран преди другите. Следователно не е никакъв проблем да се стартират едновременно. И ето тук идва моята поправка:
Тя взима всички файлове, и тези, които започват с един и същи номер SXX се стартират заедно, изчаква се да приключи последния от тях (команда “wait”), и се стартира следващата група.
Тази малка поправка намалява времето на стартиране на моят линукс два пъти. На компютри с по-малко инсталиран софтуер може и да няма особено видим ефект, на компютри с повече софтуер пък може да ускори стартирането дори повече. На компютри със SSD хард дискове пък ускорението може да е още по-осезаемо.
Тъй като патча е вграден в Debian (и деривати, вече) от години но не на всички дистрибуции е включен по подразбиране, за да го активирате трябва да редактирате файла /etc/init.d/rc и в него да намерите променливата CONCURRENCY където да и подадете стойност „shell”. Около инициализацията на тази променлива има и коментар, който описва какви са опциите и особеностите. Като промените променливата, записвате стойността, и рестартирате за да видите има ли осезаем ефект. Ако (макар до сега да не ми се е случвало нито веднъж) все пак някой скрипт се чупи по време на старт, винаги можете после да върнете стойността на “none” и линукса да ви се стартира класически бавно.
Освен класическият OSF boot механизъм (Оригиналния BSD механизъм бе с монолитни rc файлове, rc, rc.init, rc.inet, rc.local), в съвременният Unix (или по точно Linux) започват да навлизат и по-агресивни и иновативни boot механизми, много подобни на dependency boot логиката на стартирането на Windows Services, макар и разширено с правила за всички процеси и стартиращи/ни програми. Не много операционни системи, Linux дистрибуции и Unix деривати смеят да експериментират с тях, тъй като портването на софтуер от друг Unix би се усложнило.
Все пак някой дистрибуции и операционни системи експериментират с нов процес за стартиране (Apple OS X, някой форми на Ubuntu), като pkg-initng, и подобни. Други подобни идеи за паралелно стартиране базирано на нова форма на записване на зависимостите межди пакетите също се срещат. Например базираната на „make” идея на Джеймс Хънт описана тук - http://www.ibm.com/developerworks/linux/library/l-boot.html
В частност за Debian има много избор, какъв метод да използвате за стартиране на вашите процеси. Но ако се придържате към класическия, пускането на паралелизъм по време на boot също ускорява стартирането на линукса, без да трябва да следите зависимостите между процесите.







9 коментара:
"някой дистрибуции" това не трябва ли да е "някой Дистрибуций". Моля те преди да публикуваш нещо направи едно търсене на "й " и провери дали си ги написал правилно.
Иначе за бързото първоначално стартиране. Забелязал съм че най-бавната част при мен е първото пускане на ldconfig, следвано от доста по-бързото fc-cache. Би било значително подобрение ако самите програми проверяват дали директориите които следят са променяни от последното им пускане, и съответно да приемат че са си свършили работата миналия път.
Лично аз открих че вграденият в ядрото hibernate/suspend_to_disk (acpi s3) на моята система работи почти напълно безпроблемно и съответно 3 секунди след зареждане на ядрото съм обратно в X при всичките ми програми.
Правописа, както куп други неща не ми е сила. Уж го оправих обаче стои у мен съмнението, че май не звучи естествено
Все забравям че трябва ироничните бележки да ги маркирам с нещо ~~
Разбира се че ще ти звучи грешно, просто защото е грешно. Дистрибуций е роднина на Конфуций, оттам и главната буква ;)
Мисля че доста коментари назад някой го беше обяснил по-точно. Няма дума която в множествено число да завършва на "й". Така че "ии" е множествено число, "ий" е единствено. Пробвай да членуваш думата и виж какво се получава.
Дистрибуций не съм го чувал, но при някоЙ линуксиЙ, например в слак, има бсд стайл на стартиране, много по-удобен и бърз според мен, това не е засегнато в статията.
Но иначе интерсно за дебианцийте, Деляний.
Точно щях да ти пиша да видиш initng но погледнах линка и видях че са го споменали
Аз ползвам Gentoo и там нещата са максимално опростени. Липсват стандартните 1..6 нива и нещата са разделени на boot, default, nonetwork и sigle. Във всеки инит скрипт си пише от какво се нуждае да е стартиране, преди/след кое (в зависимост от инсталираните неща) и какво от инсталираните неща използва.
Пример:
depend() {
before cron portmap
need net
use dns logger
}
Струва ми се супер елегантно.
Иванушка толкова сложно и претенциозно се е изразил, че на Делян не му стана ясно какво точно е объркал с правописа. Деляне, просто Иванушка иска да ти каже, че е правилно да напишеш "някоИ дистрибуции". Понеже е множествено число и е правилно да се напише "някои", а не "някой". Това е, просто и ясно. Сега спокойно можеш да го поправиш :)
Отдавна не съм виждал някое BSD да ползва монолитен /etc/rc. Проблемът там е решен с rcorder, чийто механизъм е почти същият като описания от lem0na. Идеята с няколко еднакви Sxx ми харесва, благодаря, Деляне.
Мда, NetBSD са пионерите (любимите ми), а след това и FreeBSD започнаха да ползват rc.d, rcorder с require, before, etc...
Само OpenBSD се цепят, както винаги, с дървено стартиране, но и при тях няма монолитност в чист вид, ако изобщо може да се говори, де. :-)
Поздравления Деляне, не знаех че тази идея е твоя и приятно се изненадах, като прочетох.
От около година съм го сложил това на едно eepc с ubuntu.
От всичките неща, които хората препоръчват да се моднат на убунту (с еепц), твоя фикс наистина почти цепи на две времето за старт :)
Публикуване на коментар