Збірка тонкого клієнта, оріетнірованного на певні клієнти, зводиться до наступних етапів:
- Викачуємо повний репозиторій ThinStation
- Збираємо "товстий" (повний) образ
- Завантажуємо тонкий клієнт на товстому образі
- Отримуємо список необхідних для цього клієнта модулів ядра і пакетів
- Виправляємо конфіги збірки, залишивши тільки найнеобхідніше (в тому числі отримане на попередньому етапі)
- Збираємо "тонкий" (полегшений) образ
підготовка кухні
Відразу скажу, що є й інший шлях збірки - скачування підготовленого .iso образу. Але мені це здається не таким зручним, тому я буду описувати "правильний" варіант.
Завантаження сховища
Взагалі, для роботи з ThinStation рекомендується мати базові знання роботи з Git. Просто тому, що ваші зміни потрібно буде кудись зберігати, а заблукати в ієрархії файлів, коли кухня вже розпакована (не знаючи Git) - дуже легко. Завантаження зводиться до виконання однієї команди.
Також потрібно зауважити, що мейнтейнера проекту рекомендують навіть клонувати репозиторій від імені рута - про це мені сказали, коли я намагався запропонувати зміни щодо виправлення власника деяких скриптів. Наскільки це правильно - я не беруся судити, але якщо ви спостерігаєте проблеми з правами на файли - можливо варто піти цій раді.
підготовка chroot
У кореневій директорії завантаженого сховища лежить bash-скрипт setup-chroot. який зробить всю роботу за вас. Про нього потрібно знати лише те, що запускати його потрібно від рута (тому що він, наприклад, монтує в нове дерево службові файлові системи), а по-друге він має набір ключів, найнеобхіднішим з яких на першому етапі є ключ - a - не ставити питання, а завантажувати все що потрібно автоматично.
До слова, все інше виконується вже всередині цього чрута. У перший раз операція підготовки може зайняти до години часу (на повільному диску), але потім вхід здійснюється практично миттєво до наступної повної очистки.
товстий образ
Збірка товстого образу - це попередній етап і потрібен він для того, щоб в перший раз завантажити ваше залізо і з'ясувати, який набір пакетів і модулів йому знадобиться. Надалі, якщо у вас зоопарк заліза або передбачається закупівля нового - просто зберігайте цей образ під рукою. Збирати заново його доведеться тільки при серйозних змінах, наприклад - нова версія ядра.
Безумовно, є ймовірність, що для вашого заліза це хтось вже зробив. Ви можете зайти в директорію ts / build / machine і пошукати там назва вашої платформи. Якщо знайдете - сміливо пропускайте цей пункт.
Налаштування збірки
Все інше зараз не важливо - налаштовувати тонко будемо потім.
Окремо зупинюся на тому, навіщо потрібно поміняти систему стиснення зі squashfs на gzip. Скрипт hwlister.sh. про який піде мова нижче, використовує дуже цікаву методику пошуку завантаженого firmware - він просто дивиться час доступу до файлів в / lib / firmware і на основі цього робить висновки, які файли були завантажені. Але squashfs монтується з параметром relatime. що призводить до того, що час доступу до файлів не змінюється і список firmware (чорт, не знаю, як перевести це слово, не втративши сенс) завжди порожній. Зміна режиму стиснення на gzip - найпростіший і швидкий спосіб повернути скрипт до життя не залазячи в кишки. Я написав про це розробникам, але відповіді поки не було.
Збірка будь-якого способу виконується в chroot - так що не забуваємо в нього зайти. Для складання товстого образу існує також спеціальний параметр --allmodules. який включає в образ всі доступні модулі ядра, що також стане в нагоді на невідомому залозі.
Після того, як процес завершиться, в директорії boot-images можна буде знайти варіанти образу - iso, pxe і syslinux. Можна використовувати будь-який і завантажувати клієнт будь-яким зручним способом.
Збір інформації
Коли піддослідна залізо успішно загрузилось, необхідно зайти в консоль будь-яким зручним способом і написати:
Це звичайний bash-скрипт, після виконання якого ви виявите декілька файлів:
- /firmware.list - список необхідних firmware
- /module.list - список необхідних модулів ядра
- /package.list - список необхідних пакетів, враховуючи архітектуру буде містити тільки xorg7- * пакети
- /vbe_modes.list - якщо використовується uvesafb. цей файл буде містити список підтримуваних режимів
Деякі файли можуть бути відсутніми, якщо нічого підходящого не знайдено
Цей же скрипт спробує завантажити файли на ваш tftp-сервер, вказаний в конфіги, однак, сподіваюся, у вас запис на tftp, як і у мене, заборонена. Тому забираємо файли з тестованої системи будь-яким способом і кладемо в директорію ts / build / machine / MACHINENAME. де MACHINENAME - кодове ім'я, яке ви дасте своєму залозу.
тонкий образ
Збірка тонкого образу - це завжди балансування на межі між функціональністю і обсягом. Менше обсяг - швидше завантаження бездискових робочих станцій по мережі, швидше старт системи, менше оперативної пам'яті потрібно клієнтам. Особисто у мене стояло завдання зробити образ мінімального обсягу всього під одну задачу - термінальний RDP-клієнт. Про це я і буду розповідати.
Конфігурація збірки - build.conf
Як я вже писав вище, перший етап в конфігурації збірки - це правка файлу build.conf. Він визначає які пакунки будуть включені в образ і деякі інші параметри збирача.
Що стосується пакетів в розділі Applications - тут вибір повністю за вами. Все описане вище можна застосувати до тонким клієнтам, де користувач не буде бачити свого робочого столу (RDP, VNC, etc) і для використання, наприклад, локального браузера - багато з перерахованого вище доведеться залишити.
Залишається не забути повернути param initrdcmd "squashfs" і прибрати 3 рядки в самому кінці: package alltimezone. param allres true і param allfirmware true - в тонкому образі це нам не знадобиться.
Runtime-конфігурація - thinstation.conf.buildtime
Файл thinstation.conf.buildtime є за своєю суттю bash-скриптом, що надає змінні оточення для всіх скриптів запуску. Перед тим, як почати його редагувати, варто заглянути в директорію ts / build / conf (github) - тут зібрані шматочки конфігурацій для кожного пакета, що включають в себе пояснення і всі доступні змінні.
Давати якісь універсальні поради - складно. Налаштування буде залежати від вашого оточення і використовуваних пакетів. Наведу лише приклад для RDP-сесії.
Збірка тонкого образу
Тепер, коли конфігурація готова, залишається лише зібрати легкий образ. Все ті ж команди, що й для повного образу, за винятком одного параметра:
І це все. Залежно від того, що ви вказали в build.conf. ви отримаєте готові образи для завантаження по PXE, з CD-ROM, жорсткого диска або флешки. При описаної конфігурації можна домогтися образу розміром
90 MB і часу завантаження по PXE (від включення харчування до робочого столу) близько 1 хвилини. З локального диска і того швидше.
інші можливості
Корисні замітки
очищення кухні
Періодично, особливо якщо ви активно експериментуєте з версіями пакетів, складанням, перезбирання, перекомпілірованіем бінарників і т.д. рано чи пізно вам доведеться почати очищати робочу директорію від нагромадилося сміття.
- Не забути вийти з chroot
- Переконатися, що зберегли всі свої зміни в Git
- Отмонтировать все системні ФС всередині кухні: umount -R thinstation / *
- Запустити скрипт очищення: sudo ./setup-chroot -a
- Видалити все, що залишилося: git clean -dx - це видалить все незбережені файли
Додавання своїх пакетів
Якщо ви збираєтеся привносити в проект щось своє, потрібно знати про те, що в термінології ThinStation, а вірніше в термінології CRUX Linux, на якому базується TS, існує два базових поняття:
- package (далі "пакет") - якась абстракція, яка вказує на те, що необхідно встановити в майбутній образ. Пакет може містити шматок дерева файлової системи, окремі файли, або навіть просто один конфігураційний файл, який вказує, наприклад на залежності.
- port (далі "порт") - подобу * .deb йди * .rpm пакета, з однією важливою відмінністю: архів зі скомпільованими файлами не містить правил установки, а вдає із себе просто шматок дерева файлової системи. Будь-які правила (скрипт компіляції, скрипти пост-установки, і т.д.) лежать поруч з архівом і легко редагуються.
Коли ви хочете доповнити образ чимось своїм, перше, про що варто задуматися, а що саме вам потрібно? Якщо ви хочете додати в образ пару текстових конфігов - просто створіть свій пакет, включите його build.conf - і цього буде більш ніж достатньо. Якщо ж вам потрібно збирати бінарні файли - то вам знадобиться зробити свій порт.
Створення свого порту
Перше, що я рекомендую зробити, це створити для своїх виробів окрему директорію. Для цього потрібно в файл ts / etc / prt-get.conf додати рядок:
Зберігати в окремій директорії буде набагато простіше і безпечніше. Після редагування файлу потрібно не забути перезайти в chroot. Варто відзначити, що в цьому файлі вже присутні директорії з портами, розкладеними по колекціях. Складальник буде шукати порт на ім'я у всіх директоріях по-порядку, тому, якщо боїтеся колізії імен - розташовуйте вашу директорію вище за інших.
Тепер вам знадобиться створити один єдиний bash-скрипт, який буде відповідати за збірку порту: / ts / ports / yourproject / portname / Pkgfile. Зразок можна подивитися тут. а можна підглянути в будь-якому іншому порту. Базовий варіант виглядає так:
Давайте розберемося, що він робить (насправді робить не він, він лише визначає стадію збірки):
Перевіримо наші припущення. Щоб виконати першу збірку, необхідно зробити наступне:
Кінцевий файл portname # 0.5.2.3-1.pkg.tar.xz (ім'я файлу формується з урахуванням змінних заданих на початку скрипта) представляє з себе готовий до установки порт і містить в собі дерево файлової системи. Залишається включити його в образ - про те, як це зробити, дивіться нижче.
Потрібно також відзначити, що якщо у вас в директорії з портом присутні файли .footprint або .md5sum - збірка може "провалитися" з помилкою через невідповідність дерева файлів або md5-сум. Можна ці файли видалити перед складанням і вони згенерує автоматично, а можна виконати наступну послідовність дій:
Порт зібраний - саме час встановити його в систему. На даному етапі мова йде про систему робочої, тієї, де ви збираєте ThinStation.
Тепер архів розпакований в систему і всі файли доступні для використання. Однак ці файли не з'являться в зібраному вами образі - для цього вам крім порту, знадобиться ще й пакет.
створення пакета
Мінімальний пакет може виглядати так:
Де в файлі dependencies досить вказати один рядок - base. Вважається хорошим тоном, щоб всі пакети залежали хоча б від пакета base. але ви можете додати більше правил. Цього вже достатньо, щоб при включенні рядка package mypackage в ваш build.conf - файл somefile-placed-in-etc потрапив в директорію / etc вашого готового образу.
Що ж робити, якщо ми хочемо, щоб наш пакет, крім звичайних файлів, включав в збірку наш порт? Для цього нам знадобляться всього два скрипта. Скрипт установки ts / build / packages / mypackage / build / install:
І скрипт видалення ts / build / packages / mypackage / build / remove:
Тепер, при запуску магічного ./build наш порт буде додано в дерево файлів образу і з'явиться в збірці. Звичайно, якщо ви не забули додати цей пакет в build.conf.
оновлення
Потрібно відзначити, що всі маніпуляції описані вище можливі завдяки магії системи портів CRUX. Порт встановлюється і видаляється з системи на основі даних з .footprint і важливо стежити, щоб цей файл завжди було актуальним. Є й інші підводні камені - перерваний процес установки, помилка під час установки і ще безліч різних непередбачених дій можуть легко призвести до того, що у вашій системі (і як наслідок - образі) будуть файли, які ви зовсім не очікуєте побачити. Я періодично роблю повну очистку кухні, щоб бути впевненим в тому, що система буде вести себе as-expected. Однак, іноді на це часу не вистачає. Тому, якщо якийсь пакет і / або порт став неконсістентним, я для себе вивів наступну послідовність команд, яка в 99% випадків очистить всі зайві файли і все-таки призведе дерево в порядок:
Що ще почитати
Ось пара досить цікавих статей, які колись мені дуже допомогли:
Ну і про всяк випадок, моя гілка ThinStation на GitHub, де можна знайти деякі додаткові профілі і зміни, може бути знадобиться: