Fork me on GitHub

The WebDevil

Enjoy development

Имея в своем распоряжении несколько серверов решил привести их к одной платформе, а именно – Ubuntu Linux.
Вдохновленный этим описанием я решил попробовать повторить его.
Сразу скажу – к серверу я таки поехал. Я забыл сделать fstab, но до него дело не дошло – не завелся grub.
Хочу выразить глубокую признательность берсеркеру за статью, идею и подсказки!

ВНИМАНИЕ! Все что тут описано Вы делаете на свой страх и риск.

Итак, что получилось.

Первым делом я выделил небольшой раздел – 1ГБ – под линукс, и поставил его туда в минимальном доступном варианте. На один раздел как “/”, без свопа. Сразу же поставил к нему ssh – а то потом плохо будет.
Затем из работающего линукса я смонтировал установленный (допустим, в /mnt/freshlinux) и сделал из него тарбол:

cd /mnt/freshlinux && tar -cpf ~/base.tar *

В дальнейшем будет два варианта установки: развернуть полностью установленный или развернуть новый посредством debootstrap. Мне было весьма лениво закачивать немаленький тарбол на удаленную систему со скоростью аплода 30КБ/с.

Теперь пора урезать базовую систему. Проще всего сделать это находясь в нем:

chroot /mnt/freshlinux

И начинаем все несущественное удалять. Желательно оставить grub (потом понадобится). Я же еще оставил debootstrap – см. примечание выше. Также я люблю reiserfs, поэтому надо для него утилиты оставить.

Как было сказано в руководсте берсеркера – вырезаем доки-маны

find /usr/share/{doc,locale,man} -type f -exec rm -f \;

То что осталось должно весить около 70МБ.
Обязательно надо прописать в /etc/network/interfaces сетевые настройки удаленной машинки. Также не забыть /etc/resolv.conf.

Далее у меня подход стал чуть отличаться: новые ядра поддерживают initramfs. Используя initrd у меня почему-то небыло возможноси записи в него.
Initramfs я собирал так как сказано в мане:

cd /mnt/freshlinux && find . | cpio -o -H newc | gzip -9 > ~/initramfs.cpio.gz

Следующий шаг – надо собрать ядро, которое будет поддерживать все что нам нужно. Вот такой конфиг у меня получился для ядра 2.6.22 и вот такое ядро. Знаю, что ядро не идеальное, но оно работает.

Теперь можно загружать ядро и initramfs на удаленную машину. Там для раздела с которого загрузится линукс можно освободить раздел свапа (допустим, это ad0s1b):

swapoff /dev/ad0s1b
newfs -O1 /dev/ad0s1b
mkdir /small
mount /dev/ad0s1b /small

Затем надо поставить grub

sysctl kern.geom.debugflags=16
grub-install /dev/ad0
grub-set-default 1

и создать для него такой конфиг в /boot/grub/menu.lst:

default saved
fallback 0
timeout 1
title freebsd
kernel (hd0,0,a)/boot/loader
savedefault 0
title debian
kernel (hd0,0,b)/bzImage root=/dev/ram0 rdinit=/sbin/init rw panic=1
initrd (hd0,0,b)/initramfs.cpio.gz
savedefault 0

После перезагрузки мы должны попасть в linux.

Процитирую берсеркера:

ВНИМАНИЕ  -  все  делать  осторожно  и  вдумчиво, т.к. возврата уже не будет.

Теперь надо переразметить диск. Для разметки я привык использовать cfdisk.
Далее на указанных разделах создал файловые системы и смонтировал все это.

И вот тут можно поступить двумя способами – развернуть тарболл или поставить заново систему через debootstrap. Я пошел вторым путем, и поехал к серверу – не встал загрузчик.
Так как распаковка тарбола не нуждается в пояснениях, то расскажу немного о debootstrap.
Собственно, имеем директорию, в которую смонтирован “/” новой системы. Также я разношу /usr, /var/, /home, /tmp. Все это добро смонтировалвнутри нового корня, и выполнил

CHROOT=/mnt/freshlinux
debootstrap --include=ssh edgy $CHROOT

Так туда станет новая система.
Не помешает сразу сделать

cp /etc/apt/sources.list /mnt/freshlinux/etc/apt/sources.list
cp /etc/network/interfaces /mnt/freshlinux/etc/network/interfaces
cp /etc/resolv.conf /mnt/freshlinux/etc/resolv.conf
apt-get install sudo
addgroup admin
adduser myusername
adduser myusername admin
echo "%admin ALL=(ALL) ALL" >> /etc/sudoers

Вот тут уместно будет создать файл /etc/fstab, который я забыл сделать у себя. Синтаксис можно подсмотреть в живущей в памяти системе – там все просто.

И войдем в новую систему и обновим список пакетов и поставим ядро и загрузчик:

chroot $CHROOT
apt-get update
apt-get install linux-image grub
mkdir /boot/grub
update-grub
vi /boot/grub/menu.lst

и в конфиг граба пишем:

timeout 10
title           Ubuntu, kernel 2.6.22-14-generic
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.22-14-generic root=/dev/sda1 ro quiet
initrd          /boot/initrd.img-2.6.22-14-generic
quiet
savedefault

и затем уже не в chroot’е делаем

grub-install --root-directory=$CHROOT

По идее все. Надеюсь, мне покажут ошибки, которые я сделал =)

4 Responses to “replace freebsd with linux via ssh”

  1. По-моему было бы быстрее поставить там на отдельный раздел размером 100-200 МБ тот же DSL, а уже с него поставить удаленно дебиан через netinstall
    Имхо конечно… но так было бы правильнее и быстрее.

    DeViL

  2. Возможности работать с разделом нету. Максимум – загрузить все из него в память, и оттуда уже работать. Так что только образ SDL туда скинуть можно было бы.

    dm

  3. Да, сер знает толк в извращениях(c)не мое…
    Скажи, зачем нужно затевать удаленный геморой, когда есть физический доступ к серверу?
    Самый простой в таком случае вариант(и с самым коротким простоем) – сделать образ новой системы и всех необходимых сервисов в вмваре, подъехать и развернуть его.
    Если серверов много, то клонирование системы вобще единственный правильный вариант…

    pharmacolog

  4. Приехать-то можно было… И таки пришлось. Хотелось набраться скиллов и не ехать. В общем, буду еще на VirtualBox’е обкатывать этот подход.

    dm