Участник:HihinRuslan/LiveCDHowto: различия между версиями
Becase (обсуждение | вклад) м (→Рассмотрим вначале вопрос -- что должно находится на этом CD .: Исправлена опечатка "который расположена") |
(→Ссылки) |
||
(не показаны 4 промежуточные версии 3 участников) | |||
Строка 2: | Строка 2: | ||
== Вступление == | == Вступление == | ||
Мне на работе часто приходится решать задачу -- накидать какую-то инфу на CD/DVD (далее -- просто CD) | Мне на работе часто приходится решать задачу -- накидать какую-то инфу на CD/DVD (далее -- просто CD) с тем, чтобы потом можно было скинуть её где-нибудь в другом городе, где найти комп с Win проблема, не говоря уже о том, чтобы была нормальная ОС. | ||
Так что поневоле приходится смотреть, как и где делаются загрузочные CD. В принципе, есть проприетарные программы, но речь тут не о них. | Так что поневоле приходится смотреть, как и где делаются загрузочные CD. В принципе, есть проприетарные программы, но речь тут не о них. | ||
== Алгоритм работы | == Алгоритм работы [[LiveCD|LiveCD]] == | ||
Допустим, мне надо перенеси небольшую "кучку" RPM с одного места на другое, и я хочу, чтобы носителем этой "кучки" был небольшой дистрибутив Linux (желательно последнее ядро и интерфейс покрасивее, чтобы на меня смотрели не с сожалением, а с изумлением :) ). | Допустим, мне надо перенеси небольшую "кучку" RPM с одного места на другое, и я хочу, чтобы носителем этой "кучки" был небольшой дистрибутив Linux (желательно, последнее ядро и интерфейс покрасивее, чтобы на меня смотрели не с сожалением, а с изумлением :) ). | ||
=== Рассмотрим вначале вопрос -- что должно находится на этом CD | === Рассмотрим вначале вопрос -- что должно находится на этом CD? === | ||
1 - Поскольку это загрузочный диск, то на нём должен находится загрузчик, умеющий работать с isofs (iso9660). | 1 - Поскольку это загрузочный диск, то на нём должен находится загрузчик, умеющий работать с isofs (iso9660). | ||
Из тех, что на слуху - это или grub или syslinux | Из тех, что на слуху, - это или grub или syslinux | ||
: Для grub команда установки загрузчика (сформулировано мной нечётко, но кратко) | : Для grub команда установки загрузчика (сформулировано мной нечётко, но кратко) | ||
::выглядит так (info grub раздел 3.4): | ::выглядит так (info grub раздел 3.4): | ||
Строка 26: | Строка 26: | ||
::::::: <root-of-iso-tree> | ::::::: <root-of-iso-tree> | ||
(Опции - см man mkisofd) | (Опции - см. man mkisofd) | ||
Для dvd вместо mkisofs используется growisofs с аналогичными | |||
(практически теми же опциями - см. man growisofs). | |||
2 - Сформированный "контейнер" пакетов - собственно то, что будет являться тем дистрибутивом, который расположен на [[ | |||
2 - Сформированный "контейнер" пакетов - собственно то, что будет являться тем дистрибутивом, который расположен на [[LiveCD|LiveCD]] | |||
В последнее время эту среду упаковывают в какую-нибудь специфическую файловую систему - это на ваш выбор. | В последнее время эту среду упаковывают в какую-нибудь специфическую файловую систему - это на ваш выбор. | ||
3 - То, что видно пользователю при открытии диска. | 3 - То, что видно пользователю при открытии диска. | ||
Если говорить образно, то первый и второй пункт это тот "корабль", который может иметь на | Если говорить образно, то первый и второй пункт это тот "корабль", который может иметь на своем борту пассажиров. | ||
А третий пункт - это то, что нужно увидеть пользователю для текущей работы (дистрибутив установки, сырцы и т.п.) | А третий пункт - это то, что нужно увидеть пользователю для текущей работы (дистрибутив установки, сырцы и т.п.) | ||
=== Непосредственный алгоритм работы [[ | === Непосредственный алгоритм работы [[LiveCD|LiveCD]] === | ||
Работа [[ | Работа [[LiveCD|LiveCD]] аналогична работе обычной работе с жёстким диском, но отличается всем понятными отличиями : | ||
* Нет возможности изменять файлы на самом CD, поэтому приходится размещать корень файловой системы в памяти (одна из причин упаковки в специфическую файловую систему). | |||
* [[LiveCD|LiveCD]] должен уметь определять аппаратуру компьютера, на который он загружен и подгружать необходимые модули. | |||
* В частности [[LiveCD|LiveCD]] должен уметь находить разделы жёсткого диска компьютера и внешние носители информации (флеш-память, флоппи-диски и т.п.) | |||
* Желательна возможность догружать "редко встречающиеся" и специфичные модули ядра (cups и т.п.), не учтённые при создании [[LiveCD|LiveCD]]. | |||
#загрузка ядра и его модулей из initrd (ещё одна упакованная файловая система с "драйверами"). | |||
#распаковка модулей ядра из Мandrake arhiv (mar) - исторически идёт от Мандрейка. | |||
#монтирование специфического файлового образа и создание корня в памяти компьютера. | |||
#монтирование остальных файловых систем (в том числе некоторых тоже в памяти) | |||
В остальном всё аналогично обычной или сетевой загрузке. | В остальном всё аналогично обычной или сетевой загрузке. | ||
== Как сформировать образ [[ | == Как сформировать образ [[LiveCD|LiveCD]] == | ||
Для того, чтобы сформировать образ [[ | Для того, чтобы сформировать образ [[LiveCD|LiveCD]]: | ||
* во-первых, необходимо иметь пакетную базу (репозитарий пакетов), из которого можно спокойно собрать сборочную среду и желательно, чтобы эта пакетная база была "непротиворечива" (без unmet` ов и т.п.); | |||
среду | * во-вторых, создать какой-нибудь "контейнер" для построения будущего [[LiveCD|LiveCD]]. | ||
=== Создание пакетной базы === | === Создание пакетной базы === | ||
Теоретически, если у вас есть устойчивый и непротиворечивый дистрибутив, то вам можно сказать повезло и вам этот этап возможно не потребуется. Другое дело | Теоретически, если у вас есть устойчивый и непротиворечивый дистрибутив, то вам, можно сказать, повезло и вам этот этап, возможно, не потребуется. Другое дело если вы хотите собрать дистрибутив из пакетной базы, в которой "не всё так гладко" или надо выбрать из неё только часть пакетов. | ||
Наверное. есть более простой путь, чем предлагаю я, но он ведёт к написанию собственных скриптов или пакетов (что конечно это самый правильный путь). | Наверное. есть более простой путь, чем предлагаю я, но он ведёт к написанию собственных скриптов или пакетов (что конечно это самый правильный путь). | ||
В пакете rpmtools есть очень полезный перловый скрипт | В пакете rpmtools есть очень полезный перловый скрипт gendistrib, как я понимаю, он остался ещё со времён старого установщика. | ||
У него есть очень полезное для нас свойство - он в заданной директории, заполненной | У него есть очень полезное для нас свойство - он в заданной директории, заполненной пакетами rpm (назовём это базой дистрибутива) находит: | ||
+ недостающие для этой базы дистрибутива пакеты | + недостающие для этой базы дистрибутива пакеты; | ||
+ указывает на нарушение зависимостей и конфликты пакетов (написал и задумался - а так-ли это ?) | + указывает на нарушение зависимостей и конфликты пакетов (написал и задумался - а так-ли это?); | ||
но у него есть один недостаток - он работает с определённой структурой папок (можно посмотреть, например в Junior ) | но у него есть один недостаток - он работает с определённой структурой папок (можно посмотреть, например, в Junior). | ||
*Distrib | *Distrib | ||
Строка 78: | Строка 80: | ||
''''''* base | ''''''* base | ||
1 Итак, | 1 Итак, открываем файл ./ALTLinux/base/hdlists и прописываем туда строчку : | ||
hdlist1.cz ALTLinux/RPMS MyLiveCD 0.01 LiveCD | hdlist1.cz ALTLinux/RPMS MyLiveCD 0.01 LiveCD | ||
2 Прописываем в ./disk/info | 2 Прописываем в ./disk/info | ||
MyLiveCD 0.01 | MyLiveCD 0.01 LiveCD | ||
3. На всякий случай (вроде | 3. На всякий случай (вроде бы и не надо) | ||
:genbasedir --progress --todir `pwd`/Distrib ALTLinux alpha | :genbasedir --progress --todir `pwd`/Distrib ALTLinux alpha | ||
Строка 91: | Строка 93: | ||
:gendistrib --distrib Distrib | :gendistrib --distrib Distrib | ||
5 Читаем результаты и по ним принимаем решение - что можно удалить из дистрибутива, что надо пересобрать | 5 Читаем результаты и по ним принимаем решение - что можно удалить из дистрибутива, что надо пересобрать и что надо добавить. | ||
Так | Так как мы собираемся собирать свой [[LiveCD|LiveCD]] через spt( или separator), то тоже надо положить в базу дистрибутива и сделать так, чтобы он в нём остался :) | ||
=== Создание "контейнера" для построения [[ | === Создание "контейнера" для построения [[LiveCD|LiveCD]] === | ||
Ну тут можно просто настроить apt на созданную нами базу дистрибутива, прописать в профиль spt (или separator) пакеты, прописанные в базе дистрибутива и дожидаться когда он всё построит, хотя в принципе можно | Ну тут можно просто настроить apt на созданную нами базу дистрибутива, прописать в профиль spt (или separator) пакеты, прописанные в базе дистрибутива и дожидаться, когда он всё построит, хотя в принципе можно оставшуюся часть тоже сделать руками (или своим скриптом). Просто надо понять, что осталось нам сделать для построения полноценного [[LiveCD|LiveCD]]. | ||
==== Критика и самокритика ==== | ==== Критика и самокритика ==== | ||
Строка 105: | Строка 107: | ||
Почитай sandman или spt. | Почитай sandman или spt. | ||
</blockquote> | </blockquote> | ||
: '''NB: по состоянию на 2011 год могу рекомендовать [[Mkimage/Profiles/Desktop|mkimage]]. --[[Участник:MichaelShigorin|mike]] 16:24, 27 февраля 2011 (UTC) | |||
И мой ответ : | И мой ответ : | ||
Строка 114: | Строка 117: | ||
Отсюда его недостаток - он ломается по зависимостям и | Отсюда его недостаток - он ломается по зависимостям и | ||
становится "неработоспособным". Будь моя воля, я | становится "неработоспособным". Будь моя воля, я бы его на части | ||
разделил для каждого этапа ( | разделил для каждого этапа (чтобы каждый отдельный этап его работы | ||
обслуживал отдельный пакет, имеющий минимальные зависимости). | обслуживал отдельный пакет, имеющий минимальные зависимости). | ||
Например, в идеале spt на этапе выбора | Например, в идеале spt на этапе выбора пакетной базы, | ||
должен зависеть только от rpm (apt). | должен зависеть только от rpm (apt). | ||
Ну и "сшил" бы вызовы программ отдельного этапа | Ну и "сшил" бы вызовы программ отдельного этапа скриптом, | ||
написанном на ash, который бы вызывал "скрипт" каждого этапа убирает его хвосты, в случае неудачи, | написанном на ash, который бы вызывал "скрипт" каждого этапа убирает его хвосты, в случае неудачи, | ||
а также | а также выдаёт на output наиболее важные моменты построения дистрибутива в удобной форме + механизм выполнять построение с заданного этапа до какого-то другого (особенно хорошо при возникновении ошибок). | ||
Тогда | Тогда бы не было этого заколдованного круга. | ||
</blockquote> | </blockquote> | ||
PS Про sandman ничего сказать не могу, уже читаю :) | PS Про sandman ничего сказать не могу, уже читаю :) | ||
PPS В голове почему-то крутится аналогия с этапами загрузки компьютера. | PPS В голове почему-то крутится аналогия с этапами загрузки компьютера. | ||
Вначале выполняется первый этап, который даёт выполнится второму. | Вначале выполняется первый этап, который даёт выполнится второму. | ||
Т.е. построение базы пакетов, которая позволяет построить пакет | Т.е. построение базы пакетов, которая позволяет построить пакет A, чтобы его поставить, с тем чтобы следующий этап мог спокойно выполнится и включить в базу пакет B, который позволяет выполнится следующему этапу. Тут что-то с хэшером связано :) | ||
=== Ссылки === | === Ссылки === | ||
* [ | * [[Mkimage/history | Сепаратор]] | ||
* [ | * [[Spt]] | ||
Текущая версия от 07:52, 3 февраля 2023
Вступление
Мне на работе часто приходится решать задачу -- накидать какую-то инфу на CD/DVD (далее -- просто CD) с тем, чтобы потом можно было скинуть её где-нибудь в другом городе, где найти комп с Win проблема, не говоря уже о том, чтобы была нормальная ОС.
Так что поневоле приходится смотреть, как и где делаются загрузочные CD. В принципе, есть проприетарные программы, но речь тут не о них.
Алгоритм работы LiveCD
Допустим, мне надо перенеси небольшую "кучку" RPM с одного места на другое, и я хочу, чтобы носителем этой "кучки" был небольшой дистрибутив Linux (желательно, последнее ядро и интерфейс покрасивее, чтобы на меня смотрели не с сожалением, а с изумлением :) ).
Рассмотрим вначале вопрос -- что должно находится на этом CD?
1 - Поскольку это загрузочный диск, то на нём должен находится загрузчик, умеющий работать с isofs (iso9660).
Из тех, что на слуху, - это или grub или syslinux
- Для grub команда установки загрузчика (сформулировано мной нечётко, но кратко)
- выглядит так (info grub раздел 3.4):
- $ mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot \
- -boot-load-size 4 -boot-info-table -o grub.iso iso
- $ mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot \
- Для syslinux так (isolinux.man) :
- mkisofs -o <isoimage> \
- -b isolinux/isolinux.bin -c isolinux/boot.cat \
- -no-emul-boot -boot-load-size 4 -boot-info-table \
- <root-of-iso-tree>
- mkisofs -o <isoimage> \
(Опции - см. man mkisofd)
Для dvd вместо mkisofs используется growisofs с аналогичными
(практически теми же опциями - см. man growisofs).
2 - Сформированный "контейнер" пакетов - собственно то, что будет являться тем дистрибутивом, который расположен на LiveCD
В последнее время эту среду упаковывают в какую-нибудь специфическую файловую систему - это на ваш выбор.
3 - То, что видно пользователю при открытии диска.
Если говорить образно, то первый и второй пункт это тот "корабль", который может иметь на своем борту пассажиров. А третий пункт - это то, что нужно увидеть пользователю для текущей работы (дистрибутив установки, сырцы и т.п.)
Непосредственный алгоритм работы LiveCD
Работа LiveCD аналогична работе обычной работе с жёстким диском, но отличается всем понятными отличиями :
- Нет возможности изменять файлы на самом CD, поэтому приходится размещать корень файловой системы в памяти (одна из причин упаковки в специфическую файловую систему).
- LiveCD должен уметь определять аппаратуру компьютера, на который он загружен и подгружать необходимые модули.
- В частности LiveCD должен уметь находить разделы жёсткого диска компьютера и внешние носители информации (флеш-память, флоппи-диски и т.п.)
- Желательна возможность догружать "редко встречающиеся" и специфичные модули ядра (cups и т.п.), не учтённые при создании LiveCD.
- загрузка ядра и его модулей из initrd (ещё одна упакованная файловая система с "драйверами").
- распаковка модулей ядра из Мandrake arhiv (mar) - исторически идёт от Мандрейка.
- монтирование специфического файлового образа и создание корня в памяти компьютера.
- монтирование остальных файловых систем (в том числе некоторых тоже в памяти)
В остальном всё аналогично обычной или сетевой загрузке.
Как сформировать образ LiveCD
Для того, чтобы сформировать образ LiveCD:
- во-первых, необходимо иметь пакетную базу (репозитарий пакетов), из которого можно спокойно собрать сборочную среду и желательно, чтобы эта пакетная база была "непротиворечива" (без unmet` ов и т.п.);
- во-вторых, создать какой-нибудь "контейнер" для построения будущего LiveCD.
Создание пакетной базы
Теоретически, если у вас есть устойчивый и непротиворечивый дистрибутив, то вам, можно сказать, повезло и вам этот этап, возможно, не потребуется. Другое дело если вы хотите собрать дистрибутив из пакетной базы, в которой "не всё так гладко" или надо выбрать из неё только часть пакетов.
Наверное. есть более простой путь, чем предлагаю я, но он ведёт к написанию собственных скриптов или пакетов (что конечно это самый правильный путь).
В пакете rpmtools есть очень полезный перловый скрипт gendistrib, как я понимаю, он остался ещё со времён старого установщика. У него есть очень полезное для нас свойство - он в заданной директории, заполненной пакетами rpm (назовём это базой дистрибутива) находит:
+ недостающие для этой базы дистрибутива пакеты; + указывает на нарушение зависимостей и конфликты пакетов (написал и задумался - а так-ли это?); но у него есть один недостаток - он работает с определённой структурой папок (можно посмотреть, например, в Junior).
- Distrib
** .disk ** ALTLinux '* RPMS '* RPMS.alpha (ссылка на RPMS) '* base 1 Итак, открываем файл ./ALTLinux/base/hdlists и прописываем туда строчку :
hdlist1.cz ALTLinux/RPMS MyLiveCD 0.01 LiveCD 2 Прописываем в ./disk/info MyLiveCD 0.01 LiveCD
3. На всякий случай (вроде бы и не надо)
- genbasedir --progress --todir `pwd`/Distrib ALTLinux alpha
4 Натравливаем на базу дистрибутива gendistrib :
- gendistrib --distrib Distrib
5 Читаем результаты и по ним принимаем решение - что можно удалить из дистрибутива, что надо пересобрать и что надо добавить.
Так как мы собираемся собирать свой LiveCD через spt( или separator), то тоже надо положить в базу дистрибутива и сделать так, чтобы он в нём остался :)
Создание "контейнера" для построения LiveCD
Ну тут можно просто настроить apt на созданную нами базу дистрибутива, прописать в профиль spt (или separator) пакеты, прописанные в базе дистрибутива и дожидаться, когда он всё построит, хотя в принципе можно оставшуюся часть тоже сделать руками (или своим скриптом). Просто надо понять, что осталось нам сделать для построения полноценного LiveCD.
Критика и самокритика
Тем, кто будет читать : Важное замечание получил я от МихаилаШигорина :
Почитай sandman или spt.
И мой ответ :
А spt лежит по зависимостям "глубоко внизу" и может быть, поэтому, не устанавливаемым. Отсюда, прежде чем им начать пользоваться, надо выбрать в базу дистрибутива, как минимум, те пакеты, которые обеспечивают возможность поставить spt. Получается заколдованный круг.
Отсюда его недостаток - он ломается по зависимостям и становится "неработоспособным". Будь моя воля, я бы его на части разделил для каждого этапа (чтобы каждый отдельный этап его работы обслуживал отдельный пакет, имеющий минимальные зависимости). Например, в идеале spt на этапе выбора пакетной базы, должен зависеть только от rpm (apt). Ну и "сшил" бы вызовы программ отдельного этапа скриптом, написанном на ash, который бы вызывал "скрипт" каждого этапа убирает его хвосты, в случае неудачи, а также выдаёт на output наиболее важные моменты построения дистрибутива в удобной форме + механизм выполнять построение с заданного этапа до какого-то другого (особенно хорошо при возникновении ошибок). Тогда бы не было этого заколдованного круга.
PS Про sandman ничего сказать не могу, уже читаю :) PPS В голове почему-то крутится аналогия с этапами загрузки компьютера.
Вначале выполняется первый этап, который даёт выполнится второму. Т.е. построение базы пакетов, которая позволяет построить пакет A, чтобы его поставить, с тем чтобы следующий этап мог спокойно выполнится и включить в базу пакет B, который позволяет выполнится следующему этапу. Тут что-то с хэшером связано :)
Ссылки