Вот уж не думал, что материал об украинском Live-CD дистрибутиве Blin вызовет такой интерес у читателей (см. статью «Блины со сметаной», МК №23 (246)). На мой почтовый ящик пришло просто море писем с просьбой помочь установить его на жесткий диск и при этом не затронуть рабочие разделы. Мне, находившемуся в отпуске за тысячу километров от компьютера и пользующемуся только почтой в интернет-клубах, было тяжело посоветовать что-то стоящее. Однако сейчас я уже дома, поэтому давайте разбираться вместе.

Как вы помните из статьи, всем процессом установки blin'a на жесткий диск заправляет скрипт install-blin-to-hdd. Одной из особенностей его работы является уничтожение всех данных на Primary-Master жестком диске. Нашей задачей фактически является ручное выполнение скрипта. При этом необходимо будет создать разделы с требуемой файловой системой, перенести на нее blin, подправить конфигурационные файлы в соответствии с новыми данными и установить загрузчик. Все эти вопросы были освещены в соответствующих статьях более подробно, и я рекомендую желающим разобраться в происходящем перечитать их заново. Сразу же оговорюсь, что ни я, ни тем более редакция и разработчики дистрибутива никакой ответственности за сохранность данных не несем. Операции с разделами, особенно если непонятна суть процесса, всегда рискованна. Сохраните наиболее важное подальше. Приступаем.

Итак, для новой системы нужно место. Создайте на жестком диске при помощи Partition Magic еще один раздел размером приблизительно 800 Мб (с запасом). Для усложнения задачи, Linux будем помещать на двух разделах, плюс зарезервируем отдельный swap-раздел. Можно тут же их и нарезать в созданном разделе при помощи той же Partition, но мы ведь разбираемся с Linux, поэтому далее будем работать средствами этой системы. Да что ж это я в самом деле — откусить лишнее можно и при помощи parted, который имеется в комплекте blin и работает с разделами, отформатированными под FAT32 (желательно перед этим все же его дефрагментировать). Например:

root@localhost > parted GNU Parted 1.6.4 Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software, covered by the GNU General Public License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Using /dev/ide/host0/bus0/target0/lun0/disc Информация: The operating system thinks the geometry on /dev/ide/host0/bus0/target0/lun0/disc is 3649/255/63. Therefore, cylinder 1024 ends at 8032,499M.

Теперь смотрим, какие разделы (minor) имеются в наличии:

(parted) print Disk geometry for /dev/ide/host0/bus0/target0/lun0/disc: 0.000-28629,562 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 2 0,031 1898,305 primary fat32 boot 4 1898,306 2063,034 primary linux-swap 3 2063,035 6063,596 primary ext3 1 6063,596 28623,625 extended lba 5 6063,627 8063,876 logical ext3 6 8063,908 18065,280 logical fat32 7 26317,450 27619,562 logical lvm 8 27619,594 28623,625 logical ext3

Как видите, minor 6 с файловой системой FAT32 великоват, его и будем сокращать. Сделать это можно при помощи команды (полный список можно получить, введя help) resize MINOR Start End, где start и end должны быть новыми значениями. Подрежем-ка его на один гиг снизу, тем более что, судя по таблице, после него некоторое пространство свободно (между 18065 и 26317). Режем:

(parted) resize 6 8063,908 17065,280 moving data... 100% (time left 00:00) Предупреждение: The kernel was unable to re-read the partition table on /dev/ide/host0/bus0/target0/lun0/disc (Device or resource busy). This means Linux won't know anything nothing about the modifications you made until you reboot. You should reboot your computer before doing anything with /dev/ide/host0/bus0/target0/lun0/disc. (parted) print Disk geometry for /dev/ide/host0/bus0/target0/lun0/disc: 0.000-28629,562 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 2 0,031 1898,305 primary fat32 boot 4 1898,306 2063,034 primary linux-swap 3 2063,035 6063,596 primary ext3 1 6063,596 28623,625 extended lba 5 6063,627 8063,876 logical ext3 6 8063,908 17069,062 logical fat32 lba 7 26317,450 27619,562 logical lvm 8 27619,594 28623,625 logical ext3

Как видите, раздел 6 уменьшился. Далее создаем разделы для swap, корневого и /home при помощи той же утилиты; новички могут воспользоваться cfdisk, которая считается более удобной:

(parted) mkpartfs logical linux-swap 17070 17270 (parted) mkpart logical 17274 17774 (parted) mkpart logical 17775 18300

Напомню, что если раздел создается при помощи parted, его можно сразу отформатировать под выбранную файловую систему. К сожалению, в данный момент это только swap, ext2 и fat32. Поэтому мы отформатировали только swap-раздел, а в остальных используем более удобную журналируемую ext3. После изменения таблицы разделов рекомендуется перезагрузить систему, чтобы ядро могло их увидеть (иначе при форматировании последует сообщение о том, что такого раздела нет). После перезагрузки уточняем при помощи cfdisk или parted новые обозначения наших разделов:

cfdisk 2.11r Disk Drive: /dev/hda Size: 30020272128 bytes, 30.0 GB Heads: 255 Sectors per Track: 63 Cylinders: 3649 Name Flags Part Type FS Type [Label] Size (MB) ---------------------------------------------------- hda2 Boot Primary Win95 FAT32 1990,52 hda4 Primary Linux swap 172,74 hda3 Primary Linux ext3 [/] 4194,90 hda5 Logical Linux ext3 [/usr/local] 2097,45 hda6 Logical Win95 FAT32 (LBA) 9442,63 hda9 Logical Linux swap 213,86 hda7 Logical Linux 512,57 hda8 Logical Linux 320,79 Logical Free Space 8850,41 hda1 Logical Linux LVM 1365,40 hda1 Logical Linux ext3 [/home] 1052,84 [Bootable] [ Delete ] [ Help ] [Maximize] [ Print ] [ Quit ] [ Type ] [ Units ] [ Write ]

Итак, swap раздел будет помещаться на /dev/hda9, корневой поцепим на /dev/hda7, а /home — в /dev/hda8. Дальнейшие шаги, конечно, хотелось бы выполнить вручную, чтобы было понятней, но при этом придется вводить много данных, что увеличивает вероятность ошибки. Поэтому просто переделаем под свои нужды скрипт install-blin-to-hdd — убирать ведь легче, чем добавлять. Копируем оригинальный скрипт себе в текущий каталог, т.к. изменить его на CD-ROM’е не получится:

root@localhost > whereis install-blin-to-hdd install-blin-to-hdd: /usr/sbin/install-blin-to-hdd /usr/local/sbin/install-blin-to-hdd root@localhost > cp /usr/sbin/install-blin-to-hdd ./

И открываем его:

root@localhost > gedit ./install-blin-to-hdd&

Далее привожу рабочий вариант скрипта со своими комментариями, остальное нужно удалять. Вам останется только заменить в нужных местах место расположения своего корневого раздела и /home. И еще я заменил все вызовы die на exit 1 (их там 33, поэтому воспользуйтесь автозаменой в том же gedit), так как по непонятной причине, если что-то не получалось, скрипт не прерывал работу, а выводил сообщение о том, что он, мол, не знает, что такое «die», и продолжал смело кромсать далее, что приводило к некоторым осложнениям. В случае с exit все происходило, как и положено, скрипт прерывал работу, позволяя разобраться с проблемой. Итак, новый вариант скрипта:

#!/bin/bash disk=hda mountpoint=/mnt/${disk}7 # в этих строках в соответствующие переменные занесены значения диска (в нашем случае это Primary Master, на других дисках придется повозиться с LILO) и место будущего корневого раздела, т.е. /dev/hda7 (в моем случае) # размонтируем все смонтированные разделы. В процессе тестирования скрипт прерывал работу, ссылаясь на то, что-де такой-то раздел не смонтирован, поэтому в окончательном варианте я вообще выбросил эту строку (данные-то забэкапил, и терять в общем-то было то нечего), но все же вам я ее рекомендую оставить. for mnt in /mnt/${disk}* do if [ -e "$mnt" ] then umount $mnt || exit 1 fi done # в этом месте был вызов программы sfdisk, при помощи которой переразбивался на новые разделы жесткий диск — его выкидываем обязательно # создаем файловые системы ext3 на ./dev/hda7 и 8 — замените своими значениями mke2fs -j /dev/${disk}7 || exit 1 mke2fs -j /dev/${disk}8 || exit 1 # а эта строка создает swap-раздел. Мы это сделали раннее, я оставил ее для примера, а еще для тех, кто пользовался cfdisk при создании разделов mkswap /dev/${disk}9 || exit 1 if [ ! -d $mountpoint ] then mkdir -p $mountpoint || exit 1 fi mount /dev/${disk}7 $mountpoint || exit 1 # создаем точку монтирования для корневого раздела (если нет) и монтируем его сюда; замените своим значением # объявляем функцию, при помощи которой будем копировать данные copyfs () { echo -n "copying $1 to $2..." test -L "$2" && rm -f "$2" if [ ! -d "$2" ] then mkdir "$2" || exit 1 fi cd "$1" || exit 1 ## awn: change tar chaint to cp # tar clpf - . | tar xpf - -C $2 # эти закомментированные строки сохранены в оригинальном виде; они представляют второй вариант решения той же задачи cp -ax . "$2" || exit 1 echo " done" } # копируем корневую файловую систему copyfs / $mountpoint || exit 1 # монтируем копируем каталог /home rm -f $mountpoint/home || exit 1 echo -n "delete home..." mkdir -p $mountpoint/home || exit 1 mount /dev/${disk}8 $mountpoint/home || exit 1 copyfs /home $mountpoint/home || exit 1 # можно просто скопировать данные из /home в /mnt/hda8, но хотелось меньше скрипт переделывать # дальнейшие действия несколько озадачивают, ведь фактически команда cp / /mnt/hda7 должна была бы скопировать все каталоги. Но проблема состоит в том, что, например, /var является символической ссылкой куда-то в глубину, и поэтому их необходимо вытаскивать персонально. Потому-то я и оставил следующий фрагмент практически без изменений, просто закомментировав ненужное rm -f $mountpoint/var || exit 1 mkdir -p $mountpoint/var || exit 1 #mount /dev/${disk}7 $mountpoint/var || exit 1 copyfs /var $mountpoint/var || exit 1 copyfs /bin $mountpoint/bin || exit 1 copyfs /lib $mountpoint/lib || exit 1 copyfs /sbin $mountpoint/sbin || exit 1 # copying /usr copyfs /usr $mountpoint/usr || exit 1 # copying /opt... cd /opt || exit 1 for optpkg in * do if [ -e "/opt/$optpkg" ] # can be unexpanded mask from shell then copyfs /opt/$optpkg $mountpoint/opt/$optpkg || exit 1 fi done # далее создаем файл /etc/fstab под новое разбиение. Пропишите в него все разделы, которые вам бы хотелось видеть автоматически примонтированными при запуске, не забыв создать заранее точки монтирования, иначе скрипт будет ругаться при загрузке echo "creating fstab..." cat >$mountpoint/etc/fstab < ${mountpoint}${ff} || exit 1 done rm -f $mountpoint/etc/mtab || exit 1 ln -s /proc/mounts $mountpoint/etc/mtab || exit 1 # разобрались с точками монтирования в таблице процессов, теперь копируем ядро echo -n "copy kernel...." cp /mnt/cdrom/isolinux/vmlinuz $mountpoint || exit 1 # теперь создаем "на лету" файл /etc/lilo.conf и устанавливаем загрузчик # замените в строках ниже значения разделов на те, что используются в вашей системе mkdir -p $mountpoint/dev || exit 1 # cd /dev || exit 1 # tar clpf - . | tar xpf - -C $mountpoint/dev echo -n "..configure LILO...." cat >$mountpoint/etc/lilo.conf < ./ install-blin-to-hdd

Если скрипт отработал без ошибок, значит, можно перезагружаться и проверить работу. Все, blin у вас на жестком диске, и можно потихоньку приводить его к своим требованиям. А в случае сбоев, чтобы заново все не перебирать, лучше скопируйте получившийся скрипт в Windows-раздел, предварительно перемонтировав его в режим записи-чтения:

>mount -o remount,rw /mnt/hda6 >cp ./ install-blin-to-hdd /mnt/hda6

На этом все. При внимательном подходе проблем быть не должно. Напомню только, что удалить LILO средствами Windows можно, загрузившись с загрузочной дискеты и, перейдя на диск С, ввести fdisk /mbr. Если что непонятно, обратитесь к предыдущим моим материалам — там описано подробней все, чем мы сегодня занимались.

Linux forever!