Ключевые слова:linux, freebsd, init, install, initrd, boot, grub, (найти похожие документы)
From: Paul Petruk <berserker@neolocation.com.>
Date: Mon, 22 Oct 2005 14:31:37 +0000 (UTC)
Subject: Удаленная замена FreeBSD на Debian/GNU Linux
Оригинал: http://index.kaven.neolocation.net/switching.html
Удаление FreeBSD и установка Debian по SSH
Задача - удалить freebsd и установить debian на далеком сервере.
Итак, у нас есть :
1. freebsd-сервер с доступом по ssh далеко в инете. RAM=>256Mb.
2. локальный комп с 500 Мб свободного места на винчестере и быстрым инетом
3. инсталляционный CD debian sarge
Краткий порядок действий:
1. ставим базовую систему debian к себе на комп
2. из базовой системы делаем initrd.img
3. компилируем ядро linux
4. закачиваем на freebsd initrd и ядро linux, ставим grub
5. грузим linux из initrd , ставим linux на диск.
Теперь подробнее.
1. ставим базовую систему debian к себе на комп
Тут все просто, грузимся с компакта, ставим базовую систему debian
(linux26) куда-нибудь к себе на винчестер, на отдельный раздел. Все
сетевые настройки (IP, gateway, netmask,DNS-server) указать такие же,
как на freebsd-сервере. Не забыть пароль root'a !
Базовую систему поставили на /dev/hda3, GRUB ставим также на
/dev/hda3. Перегрузились, настроили, не добавляя CD-ROM в индексы apt
(экономим объем). Ставим ssh:
mount /media/cdrom
dpkg -i /media/cdrom/pool/main/o/openssh/ssh_3.8.1p1-8.sarge.4_i386.deb
Разрешаем логиниться root'у и обязательно проверяем :
grep -i permitrootlogin /etc/ssh/sshd_config
Добавляем автоматический ребут после 5 минут работы:
echo "*/1 * * * * [ `cat /proc/uptime|cut -d. -f1` -lt 300 ] || /sbin/reboot" \
>> /var/spool/cron/crontabs/root
2. из базовой системы делаем initrd.img
Перезагружаемся в рабочую (та, что была до установки debian'a) ОС.
Далее:
mkdir /mnt/debian
mount /dev/hda3 /mnt/debian
Делаем снимок базовой системы , он понадобится для пункта 5:
cd /mnt/debian
tar -cpf ~/deb_base.tar *
Теперь почистим :
chroot /mnt/debian
apt-get remove dhcp-client ed fdutils grub hotplug info \
initrd-tools ipchains iptables locales mailx manpages nano \
ppp* usbutils exim4*
find /usr/share/{doc,locale,man} -type f -exec rm -f \;
exit #from chroot
df -h /mnt/debian
Должно показать меньше 70Мб.
Делаем initrd.img размером 80Мб :
dd if=/dev/zero of=~/initrd.img count=80 bs=1M
создаем там ext3fs и монтируем
mke2fs -j -F -m0 ~/initrd.img
mkdir /mnt/initrd
mount ~/initrd.img /mnt/initrd -o loop
копируем урезанную базовую систему внутрь :
cp -rap /mnt/debian/* /mnt/initrd/
размонтируем и проверяем целостность
umount /mnt/initrd/
umount /mnt/debian
e2fsck ~/initrd.img
gzip -9 ~/initrd.img.gz
Результат - файлы ~/initrd.img.gz и ~/deb_base.tar.
3. компилируем ядро linux
Скачиваем не слишком древнее ядро на свою рабочую машину,
конфигурируем. Основные моменты :
а) обязательно включить поддержку той сетевой карты, что стоит на сервере
б) обязательно включить поддержку ramdisk, initrd, ext2fs, ext3fs
в) если надо что-то включить, надо включать сразу в ядро, а не модулем.
г) CONFIG_BLK_DEV_RAM_SIZE выставить больше чем `du -k initrd.img`
д) желательно включить поддержку DMA для чипсета сервера
После конфигурирования проверить :
grep -E "RAM|INITRD|E100|EXT2|EXT3" .config
make
Компилируем, результат - файл bzImage.
4. закачиваем на freebsd initrd и ядро linux. Ставим grub.
Сейчас надо освободить субраздел внутри слайса, желательно наименьший.
Под это хорошо подойдет своп (к примеру /dev/ad0s1b, 200Mb)
swapoff /dev/ad0s1b
newfs -O1 /dev/ad0s1b
mkdir /small
mount /dev/ad0s1b /small
Выносим /dev/ad0s1b из /etc/fstab
Скачиваем в /small файлы bzImage и initrd.img.gz
Создаем предварительно ~/menu.lst :
echo "
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 init=/sbin/init rw panic=1
initrd (hd0,0,b)/initrd.img.gz
savedefault 0
" > ~/menu.lst
То есть, freebsd грузим с 1-го слайса, подраздела a, а linux - с 1-го
слайса, подраздела b.
Причем в случаях kernel panic ядра linux случится перезагрузка через 1
сек , и при невозможности загрузки или ядра linux, или initrd - будет
загружена freebsd (fallback).
Качаем и ставим grub версии 0.97 или выше (ЭТО ВАЖНО, в предыдущих
версиях неполная поддержка savedefault) .
cd /usr/ports/sysutils/ && make clean install
# pkg_add grub-0.97.tbz - я сделал себе бинарный пакет и ставил его
sysctl kern.geom.debugflags=16
grub-install /dev/ad0
grub-set-default 1
cp ~/menu.lst /boot/grub/menu.lst
reboot #and pray
5. грузим linux из initrd , ставим linux на диск.
Итак, через некоторое время мы логинимся на ssh как root. Если все
прошло нормально, должен подойти пароль root'a от debian'a :) Иначе
пробуем войти с паролем root'a от freebsd. Если порт 22 вообще не
откликается, и сервер не пингуется, значит something goes wrong :))
ВНИМАНИЕ - после того, как залогинились, сразу вынести перезагрузку из
cron. Иначе придется 5-й пункт делать за время, меньшее 5 мин.
ВНИМАНИЕ - все делать осторожно и вдумчиво, т.к. возврата уже не
будет.
Дальше все просто - сейчас система работает с диска в ОЗУ. Запускаем
cfdisk, сносим все на винчестере, делаем первый раздел /dev/hda1
размером 2Гб, помечаем его как загрузочный.
mke2fs -j /dev/hda1
mount /dev/hda1 /mnt/
С локальной машины закачиваем файл deb_base.tar
scp ~/deb_base.tar root@remoteserver:/mnt/
и распаковываем. Ставим GRUB в MBR:
tar -xpf /mnt/deb_base.tar -C /mnt/
chroot /mnt/
grub
grub>install (hd0,0)/boot/grub/stage1 (hd0) (hd0,0)/boot/grub/stage2
grub>quit
exit #from chroot
Ставим всё верно:
vi /boot/grub/menu.lst
reboot #and pray again
ждем, результат - логинимся на debian-хост, работающий с винчестера и
выносим перезагрузку из cron
Примечание
Данная инструкция может содержать ошибки, смысловые или опечатки,
однако дает общее представление о процессе.
Paul Petruk aka Berserker, berserker()neolocation.com
10.09.2005