понедельник, 29 декабря 2008 г.

Создание собственного LiveCD на базе Mandriva One 2008

Введение

Под термином LiveCD понимают полноценный дистрибутив операционной системы, позволяющий загружаться прямо с исходного носителя (CD, DVD, USB Flash) без необходимости установки на жесткий диск. Вот наиболее типичные сценарии использования LiveCD:
  • Независимое мобильное рабочее место
  • Аварийный диск восстановления системы
  • Медиа-центр: аудио, видео, интернет
  • Демонстрационный диск с вашим продуктом
На сегодняшний день существует множество LiveCD дистрибутивов для самых разнообразных целей, так зачем же еще что-то придумывать? Дело в том, что у каждого пользователя свои требования и свое понимание "идеальной системы". Допустим вам не хватает какой-то программы или, наоборот, установлено слишком много лишнего, наконец, нужно заранее преднастроить систему: язык, кодировка, сетевые параметры, оформление и т.д.

В этой статье рассказывается о том как приспособить LiveCD дистрибутив Mandriva One 2008 под ваши нужды. В качестве хост-системы использовалась Mandriva 2008 PowerPack. Если вы пользуетесь другой системой - не спешите уходить! Поняв основной принцип вы разберетесь и со своим дистрибутивом. Итак, приступим.

Инструменты

Для пересборки LiveCD потребуются утилиты readcd, mkisofs и cdrecord из пакета Cdrtools, а также mksquashfs из пакета squashfs-tools. Вместо Cdrtools можно так же использовать пакет Cdrkit, входящий в стандартную поставку Mandriva, но тут могут быть подводные камни. Пакета squashfs-tools в моей поставке не оказалось, поэтому пришлось его скачать: squashfs-tools-3.2-1.r2.2mdv2007.1.i586.rpm (~80 Кб).

Сборка LiveCD

Для начала создадим отдельную директорию и сохраним ее в переменной окружения LIVE_CD. Внутри этой директории и развернутся самые интересные события:
mkdir LiveCD
cd LiveCD
export LIVE_CD=`pwd`
Теперь необходимо вставить оригинальный LiveCD в CD-ROM и сохранить его в виде ISO-образа. Если у вас уже есть готовый ISO-образ то можете пропустить этот шаг:
readcd dev=/dev/cdrom f="$LIVE_CD/mandriva_orig.iso"
В директории LIVE_CD должен появиться файл mandriva_orig.iso Теперь создадим директорию orig_iso/ и смонтируем в нее созданный ISO-образ:
mkdir "$LIVE_CD/orig_iso"
sudo mount -r -t iso9660 -o loop "$LIVE_CD/mandriva_orig.iso" \
"$LIVE_CD/orig_iso"
Посмотрим что внутри:
ls "$LIVE_CD/orig_iso"

boot/ isolinux/ LISEZMOI.pdf loopbacks/ README.pdf
Как и следовало ожидать, внутри директории orig_iso/ мы видим содержимое оригинального компакт диска.

Итак, мы подошли к первому препятствию: нам необходимо вносить изменения в файловую систему iso9660, смонтировать которую можно только на чтение. Эта задача решается в два приема: во-первых, создадим в памяти файловую систему tmpfs:
mkdir "$LIVE_CD/tmp_iso"
sudo mount -t tmpfs none "$LIVE_CD/tmp_iso"
Эта файловая система доступна как на чтение так и на запись. Все что мы запишем в tmp_iso/ будет сохраняться в памяти. Теперь объединим файловые системы iso9660 (ro) и tmpfs (rw) в одну при помощи файловой системы unionfs:
mkdir "$LIVE_CD/union_iso"
sudo mount -o dirs="$LIVE_CD/tmp_iso=rw:$LIVE_CD/orig_iso=ro" \
-t unionfs unionfs "$LIVE_CD/union_iso"
Посмотрим что внутри:
ls "$LIVE_CD/union_iso"

boot/ isolinux/ LISEZMOI.pdf loopbacks/ README.pdf
На первый взгляд ничего не изменилось - все те же файлы, что и на оригинальном CD. Тем не менее отличие есть: union_iso/ доступна на запись:
mount | grep union_iso

unionfs on /home/xander/LiveCD/union_iso type unionfs \
(rw,dirs=/home/xander/LiveCD/tmp_iso=rw:/home/xander/LiveCD/orig_iso=ro)
Все изменения которые мы сделаем в union_iso/ будут прозрачно сохраняться в памяти.

Двигаемся дальше. Давайте заглянем в папку loopbacks/ оригинального CD:
ls -lh "$LIVE_CD/orig_iso/loopbacks"

-rwx------ 1 root root 688M 2007-10-09 02:01 distrib.sqfs
Обратите внимание на размер файла distrib.sqfs - 688 мегабайт. Он занимает почти весь CD-диск. Это образ сжатой файловой системы squashfs в котором хранится файловая система LiveCD. Как и iso9660 смонтировать squashfs можно только на чтение:
mkdir "$LIVE_CD/orig_sqfs"
sudo mount "$LIVE_CD/orig_iso/loopbacks/distrib.sqfs" -o ro,loop \
-t squashfs "$LIVE_CD/orig_sqfs"
Посмортим что внутри:
ls "$LIVE_CD/orig_sqfs"

bin/ dev/ home/ lib/ mnt/ proc/ sbin/ tmp/ var/
boot/ etc/ initrd/ media/ opt/ root/ sys/ usr/
Ага! Это действительно похоже на файловую систему LiveCD. По отработанной схеме сделаем ее доступной для записи. Сначала создадим временную файловую систему в памяти:
mkdir "$LIVE_CD/tmp_sqfs"
sudo mount -t tmpfs none "$LIVE_CD/tmp_sqfs"
Теперь объединим файловые системы tmpfs (rw) и squashfs (ro) при помощи файловой системы unionfs:
mkdir "$LIVE_CD/union_sqfs"
sudo mount -o dirs="$LIVE_CD/tmp_sqfs=rw:$LIVE_CD/orig_sqfs=ro" \
-t unionfs unionfs "$LIVE_CD/union_sqfs"
Для проверки заглянем внутрь union_sqfs/:
ls "$LIVE_CD/union_sqfs"

bin/ dev/ home/ lib/ mnt/ proc/ sbin/ tmp/ var/
boot/ etc/ initrd/ media/ opt/ root/ sys/ usr/
Все как в orig_sqfs/, но теперь с возможностью записи:
mount | grep union_sqfs

unionfs on /home/xander/LiveCD/union_sqfs type unionfs \
(rw,dirs=/home/xander/LiveCD/tmp_sqfs=rw:/home/xander/LiveCD/orig_sqfs=ro)
Теперь, когда все подготовительные действия выполнены, можно приступить к редактированию дистрибутива. Для примера установим на LiveCD программу Midnight Commander (на стандартном LiveCD ее не оказалось):
sudo urpmi --quiet --auto --root="$LIVE_CD/union_sqfs" mc
Для тех кто не сталкивался с Mandriva Linux я поясню смысл последней команды. Утилита urpmi устанавливает RPM-пакеты с учетом их зависимостей. Ключ --auto просит urpmi не задавать лишних вопросов - этот режим часто используется в неинтерактивных скриптах. Ключ --quiet подавляет лишний вывод. Ключ --root заслуживает особого внимания. Поскольку в качестве хост-системы в данном примере также используется Mandriva Linux мы можем использовать RPM-репозиторий хост-системы для установки пакетов на LiveCD. Очень изящно и красиво!

Также просто можно удалить программу если она вам не нужна. В Mandriva Linux для этой цели используется утилита urpme. Давайте в качестве примера удалим OpenOffice:
sudo urpme -a --auto --root="$LIVE_CD/union_sqfs" openoffice
Ключ -a заставит urpme удалить все пакеты в названиях которых есть openoffice.

При необходимости можно редактировать любые конфигурационные файлы внутри LiveCD. Все изменения попадут в итоговую систему.

Итак, допустим мы внести все необходимые коррективы в наш будущий LiveCD-дистрибутив. Что дальше? Для начала давайте пересоберем squashfs-образ с учетом всех сделанных изменений, ведь пока все они хранятся в памяти!
sudo mksquashfs "$LIVE_CD/union_sqfs" \
"$LIVE_CD/distrib_new.sqfs"

Parallel mksquashfs: Using 2 processors
...

sudo mv -f "$LIVE_CD/distrib_new.sqfs" \
"$LIVE_CD/union_iso/loopbacks/distrib.sqfs"
Первая команда создает новый сжатый образ distrib_new.sqfs, а вторая - заменяет им оригинальный distrib.sqfs. Обратите внимание на сообщение Parallel mksquashfs: Using 2 processors. Приятно, что программа использует возможности многоядерных CPU.

Итак, образ squashfs пересобран и помещен в нужное место. Теперь необходимо пересобрать ISO-образ с новым файлом distrib.sqfs. Делается это следующей командой:
sudo mkisofs -quiet -o "$LIVE_CD/mandriva_new.iso" -input-charset iso8859-1 \
-J -R -V "MandrivaOne" -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table "$LIVE_CD/union_iso"
Обратите внимание на опции -b и -c. Они необходимы для того чтобы сделать CD загрузочным. Опции -no-emul-boot, -boot-load-size 4 и -boot-info-table так же специфичны для создания загрузочных дисков. Внимательно читайте mkisofs(1).

Опции -J и -R включают расширения Joliet и Rock Ridge соответственно. Опция -V задает метку тома. Если указать метку отличную от "MandrivaOne" то система откажется загружаться. Так что лучше устанавливайте на "свой" ISO такую же метку какая была на оригинальном диске.

Итак, пересобранный образ mandriva_new.iso готов, но не спешите записывать его на болванку! Сначала проверьте его в эмуляторе, например, в VirtualBox.

Для создания новой виртуальной машины выберите МашинаСоздатьДалее. Присвойте машине название и укажите тип ОС Linux 2.6. Раздел жесткого диска создавать не обязательно.

Для того чтобы "загрузиться" с ISO-образа как с CD-ROM нажмите на иконку CD/DVD-ROM, установите флажок Подключить CD/DVD и выберите опцию Файл ISO-образа. В открывшемся диалоге укажите путь к файлу mandriva_new.iso:


Теперь виртуальную машину можно запустить:


Примите поздравления! Система успешно загрузилась. Теперь ее можно записать на болванку и проверить на "настоящем" компьютере:
sudo cdrecord dev=/dev/cdrw -v -eject "$LIVE_CD/mandriva_new.iso"
Перед тем как пойти на перезагрузку не забудьте отмонтировать файловые системы, созданные в процессе сборки:
sudo umount "$LIVE_CD/union_sqfs"
sudo umount "$LIVE_CD/tmp_sqfs"
sudo umount "$LIVE_CD/orig_sqfs"
sudo umount "$LIVE_CD/union_iso"
sudo umount "$LIVE_CD/tmp_iso"
sudo umount "$LIVE_CD/orig_iso"
А вот теперь:
sudo reboot
Заключение

Как вы могли убедиться, приспособить LiveCD под свои нужны совсем не сложно. Все описанные команды можно оформить в виде shell-скриптов и автоматизировать процесс от начала до конца. Отмечу, что описанная методика не специфична исключительно для Mandriva Linux. Поняв основную идею вы разберетесь с любым дистрибутовом.

Ссылки

Статья опубликована на портале CITKIT

пятница, 5 декабря 2008 г.

Запись CD/DVD/BluRay дисков с помощью Cdrtools

Введение

В этой статье рассказывается о том как записывать CD, DVD и BluRay диски при помощи консольных утилит из пакета Cdrtools. Это идеальное решение для задач автоматизации резервного копирования и прожига дисков в системах без графического интерфейса.

Cdrtools и Cdrkit

Поддержкой пакета Cdrtools занимается Jörg Schilling. За более чем десятилетнюю историю этот проект пережил несколько ответвлений: наиболее известная ветка называется Cdrkit. Причиной ее создания стало решение Jörg Schilling о смене лицензии с GPL на CDDL. На эту тему была очень бурная полемика между разработчиками Debian, инициировавшими создание ветки, и автором оригинальной программы. Вот несколько интересных материалов на эту тему:
Утилиты из пакета Cdrkit совместимы с Cdrtools на уровне опций командной строки. Сами программы называются по другому, но символические ссылки со "старыми" именами решают эту проблему. Обычный пользователь не должен заметить подмены.

Из за смены лицензии во многие Linux-дистрибутивы (Debian, Red Hat, SUSE, Mandriva) вместо Cdrtools стали включать Cdrkit. Если в вашем дистрибутиве установлен Cdrkit и он вас устраивает, то наверное нет особого смысла возвращаться к Cdrtools. Однако, если в вашем дистрибутиве старая версия Cdrkit, содержащая ошибки подобно этой, я советую скачать и установить оригинальную версию пакета Cdrtools. В следующем разделе рассказывается о том как это сделать.

Установка

Скачать Cdrtools можно отсюда. Для написания этой статьи использовалась версия cdrtools-2.01.01a53.tar.gz (~2 Мб). Процедура сборки достаточно типична:
$ tar -xzf cdrtools-2.01.01a53.tar.gz
$ cd cdrtools-2.01.01
# ./Gmake.linux INS_BASE=/usr/local install
При необходимости отредактируйте переменную окружения PATH. В данном примере PATH=$PATH:/usr/local/bin.

Если в вашей системе уже есть пакет Cdrkit, то установка Cdrtools в /usr/local позволит вам пользоваться одним или другим пакетом по вашему выбору: достаточно лишь удалить символические ссылки, созданные Cdrkit для совместимости.

В пакет Cdrtools входит несколько утилит. Вот наиболее важные:
  • cdrecord - прожиг дисков
  • mkisofs - создание файловой системы ISO9660
  • readcd - создание образа с компакт-диска
  • isoinfo - исследование ISO-файлов
Вот как должен выглядеть вывод команд cdrecord и mkisofs из пакета Cdrtools:
cdrecord -version

Cdrecord-ProDVD-ProBD-Clone 2.01.01a53 (i686-pc-linux-gnu) Copyright (C) 1995-2008 Jorg Schilling

mkisofs -version

mkisofs 2.01.01a53 (i686-pc-linux-gnu) Copyright (C) 1993-1997 Eric Youngdale (C) 1997-2008 Jorg Schilling
Если же вы получите что-то вроде
cdrecord -version

Wodim 1.1.7.1
Copyright (C) 2006 Cdrkit suite contributors
Based on works from Joerg Schilling, Copyright (C) 1995-2006, J. Schilling

mkisofs -version

genisoimage 1.1.6 (Linux)
то значит в вашей системе cdrecord и mkisofs являются символическими ссылками на программы-двойники wodim и genisoimage из пакета Cdrkit. Эти ссылки необходимо удалить.

Пример

Для записи данных на диск необходимо подготовить ISO-образ:
mkisofs -quiet -R -J -l -o image.iso /tmp/data/
Опции mkisofs которые мы использовали:
  • -quiet подавление вывода
  • -R создать расширения RockRidge
  • -J создать расширения Joliet
  • -l разрешить длинные имена файлов
  • -o файл ISO-образа
Подготовленный образ можно теперь записать на диск:
cdrecord -scanbus

Cdrecord-ProDVD-ProBD-Clone 2.01.01a53 (i686-pc-linux-gnu) Copyright (C) 1995-2008 Jorg Schilling
Linux sg driver version: 3.5.34
Using libscg version 'schily-0.9'.
scsibus1:
1,0,0 100) 'ATA ' 'ST3160815AS ' '3.AA' Disk
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) *
1,6,0 106) *
1,7,0 107) *
scsibus4:
4,0,0 400) 'PIONEER ' 'DVD-RW DVR-112D' '1.21' Removable CD-ROM
4,1,0 401) *
4,2,0 402) *
4,3,0 403) *
4,4,0 404) *
4,5,0 405) *
4,6,0 406) *
4,7,0 407) *

cdrecord dev=4,0,0 blank=fast -sao -eject image.iso

Cdrecord-ProDVD-ProBD-Clone 2.01.01a53 (i686-pc-linux-gnu) Copyright (C) 1995-2008 Jorg Schilling
scsidev: '4,0,0'
scsibus: 4 target: 0 lun: 0
Linux sg driver version: 3.5.34
Using libscg version 'schily-0.9'.
Device type : Removable CD-ROM
Version : 5
Response Format: 2
Capabilities :
Vendor_info : 'PIONEER '
Identifikation : 'DVD-RW DVR-112D'
Revision : '1.21'
Device seems to be: Generic mmc2 DVD-R/DVD-RW/DVD-RAM.
Using generic SCSI-3/mmc CD-R/CD-RW driver (mmc_cdr).
Driver flags : MMC-3 SWABAUDIO BURNFREE
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R LAYER_JUMP
Starting to write CD/DVD/BD at speed 10 in real SAO mode for single session.
Last chance to quit, starting real write 0 seconds. Operation starts.
Track 01: Total bytes read/written: 23975936/23975936 (11707 sectors).
Первой командой мы опросили все SCSI-устройства на всех SCSI-шинах и нашли там DVD-рекордер. Второй командой мы запустили прожиг CD-RW диска предварительно попросив его очистить. Дополнительную информацию читайте в руководстве: mkisofs(1) и cdrecord(1).

Заключение

В этой статье рассказано о том как записывать CD/DVD/BluRay диски при помощи консольных утилит из пакета Cdrtools. Это неоценимый и очень мощный инструмент! Также рассмотрен пакет Cdrkit и его связь с Cdrtools. Надеюсь эта статья поможет обойти подводные камни если вам понадобится параллельно с Cdrkit установить на свою машину оригинальный пакет Cdrtools.

Ссылки

Статья опубликована на портале OpenNET

среда, 3 декабря 2008 г.

Работа с CSV-файлами на Ruby

Формат CSV (Comma Separated Values) очень часто используется для переноса данных из одной системы в другую. В Ruby есть стандартная библиотека CSV, позволяющая создавать и обрабатывать такие файлы. В самом простейшем случае создание CSV-файла выглядит так:


1
2
3
4
5
6
7
8
9
#!/usr/bin/ruby

require 'csv'

CSV.open('test.csv', 'w') do |writer|
writer << ['r1c1', 'r1c2']
writer << ['r2c1', 'r2c2']
writer << [nil, nil]
end

Прочитать созданный файл можно следующим образом:


1
2
3
4
5
6
7
#!/usr/bin/ruby

require 'csv'

CSV.open('test.csv', 'r') do |row|
p row
end

Если вы обрабатываете большие объемы данных то имеет смысл попробовать библиотеку FasterCSV. Она работает быстрее и обладает большим количеством возможностей.