replace freebsd with linux via ssh
Имея в своем распоряжении несколько серверов решил привести их к одной платформе, а именно - Ubuntu Linux.
Вдохновленный этим описанием я решил попробовать повторить его.
Сразу скажу - к серверу я таки поехал. Я забыл сделать fstab, но до него дело не дошло - не завелся grub.
Хочу выразить глубокую признательность берсеркеру за статью, идею и подсказки!
[cc lang="text"]
ВНИМАНИЕ! Все что тут описано Вы делаете на свой страх и риск.
[/cc]
Итак, что получилось.
Первым делом я выделил небольшой раздел - 1ГБ - под линукс, и поставил его туда в минимальном доступном варианте. На один раздел как "/", без свопа. Сразу же поставил к нему ssh - а то потом плохо будет.
Затем из работающего линукса я смонтировал установленный (допустим, в /mnt/freshlinux) и сделал из него тарбол:
[cc lang="bash"]
cd /mnt/freshlinux && tar -cpf ~/base.tar *
[/cc]
В дальнейшем будет два варианта установки: развернуть полностью установленный или развернуть новый посредством debootstrap. Мне было весьма лениво закачивать немаленький тарбол на удаленную систему со скоростью аплода 30КБ/с.
Теперь пора урезать базовую систему. Проще всего сделать это находясь в нем:
[cc lang="bash"]
chroot /mnt/freshlinux
[/cc]
И начинаем все несущественное удалять. Желательно оставить grub (потом понадобится). Я же еще оставил debootstrap - см. примечание выше. Также я люблю reiserfs, поэтому надо для него утилиты оставить.
Как было сказано в руководсте берсеркера - вырезаем доки-маны
[cc lang="bash"]
find /usr/share/{doc,locale,man} -type f -exec rm -f \;
[/cc]
То что осталось должно весить около 70МБ.
Обязательно надо прописать в /etc/network/interfaces сетевые настройки удаленной машинки. Также не забыть /etc/resolv.conf.
Далее у меня подход стал чуть отличаться: новые ядра поддерживают initramfs. Используя initrd у меня почему-то небыло возможноси записи в него.
Initramfs я собирал так как сказано в мане:
[cc lang="bash"]
cd /mnt/freshlinux && find . | cpio -o -H newc | gzip -9 > ~/initramfs.cpio.gz
[/cc]
Следующий шаг - надо собрать ядро, которое будет поддерживать все что нам нужно. Вот такой конфиг у меня получился для ядра 2.6.22 и вот такое ядро. Знаю, что ядро не идеальное, но оно работает.
Теперь можно загружать ядро и initramfs на удаленную машину. Там для раздела с которого загрузится линукс можно освободить раздел свапа (допустим, это ad0s1b):
[cc lang="bash"]
swapoff /dev/ad0s1b
newfs -O1 /dev/ad0s1b
mkdir /small
mount /dev/ad0s1b /small
[/cc]
Затем надо поставить grub
[cc lang="bash"]
sysctl kern.geom.debugflags=16
grub-install /dev/ad0
grub-set-default 1
[/cc]
и создать для него такой конфиг в /boot/grub/menu.lst:
[cc lang="bash"]
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
[/cc]
После перезагрузки мы должны попасть в linux.
Процитирую берсеркера:
[cc lang="text"]
ВНИМАНИЕ - все делать осторожно и вдумчиво, т.к. возврата уже не будет.
[/cc]
Теперь надо переразметить диск. Для разметки я привык использовать cfdisk.
Далее на указанных разделах создал файловые системы и смонтировал все это.
И вот тут можно поступить двумя способами - развернуть тарболл или поставить заново систему через debootstrap. Я пошел вторым путем, и поехал к серверу - не встал загрузчик.
Так как распаковка тарбола не нуждается в пояснениях, то расскажу немного о debootstrap.
Собственно, имеем директорию, в которую смонтирован "/" новой системы. Также я разношу /usr, /var/, /home, /tmp. Все это добро смонтировалвнутри нового корня, и выполнил
[cc lang="bash"]
CHROOT=/mnt/freshlinux
debootstrap --include=ssh edgy $CHROOT
[/cc]
Так туда станет новая система.
Не помешает сразу сделать
[cc lang="bash"]
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
[/cc]
Вот тут уместно будет создать файл /etc/fstab, который я забыл сделать у себя. Синтаксис можно подсмотреть в живущей в памяти системе - там все просто.
И войдем в новую систему и обновим список пакетов и поставим ядро и загрузчик:
[cc lang="bash"]
chroot $CHROOT
apt-get update
apt-get install linux-image grub
mkdir /boot/grub
update-grub
vi /boot/grub/menu.lst
[/cc]
и в конфиг граба пишем:
[cc lang="bash"]
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
[/cc]
и затем уже не в chroot'е делаем
[cc lang="bash"]
grub-install --root-directory=$CHROOT
[/cc]
По идее все. Надеюсь, мне покажут ошибки, которые я сделал =)