Автор Гілка: Загрузчик для переносного HD дистрибутиву Linux  (Прочитано 3719 раз)

Відсутній ihorsl

  • Дописувач
  • **
  • дописів: 67
  • Карма: +0/-0
Почалося все з того, що хотілося зклепати собі
переносний дистр Linux на харді, щоб можна було
до іншої системи підключи і загрузитися

Але виникли такі граблі :

Всі загрузчики Linux (lilo, grub, extlinux) при зміні імені диску
перестають грузитися.

Якщо перенести Grub на інший розділ він все одно шукає
свій stage2 та menu.lst на тому диску, куда його інстальнули
командою grub_install.sh

Тобто якщо grub був інстальований на hda3 (hda 0,2) а потім диск перепідключений як hdc3, то grub все одно шукає себе на hda3

Здається проблема в тому що в 512-байтний загрузчик розділу записується на якому саме диску (hda.., hbc..) розташована основна частина загрузчика.

Може хтось підкаже solution,
адже з Live-cd дистибутивами цю проблему якось рішають ...

Наперед дякую

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
syslinux кажуть використовувати. Але в мене він матюкнувся на великий розмір кластера (в мене FAT32 на 40Гб).

http://www.livejournal.com/users/eth0_blog/

# syslinux /dev/sda

# mount -t vfat /dev/sda /mnt/tmp
# cp vmlinuz initrd.gz /mnt/tmp

# cat > /mnt/tmp/syslinux.cfg
default vmlinuz
append initrd=initrd.gz ramdisk_size=10240 root=/dev/rd/0 devfs=mount,dall rw DEBCONF_PRIORITY=medium
^D
#

# cp sarge.iso /mnt/tmp
[Fedora Linux]

Відсутній ihorsl

  • Дописувач
  • **
  • дописів: 67
  • Карма: +0/-0
Попередня відповідь - це трохи не те, що мені було
потрібно. Адже навіть якщо ядро вже завантажене
загрузчиком, йому всеодно треба передати параметр root,
який буде мінятися при переносі системи.

Але мені вдалося знайти одне досить просте рішення.
Я зробив загрузочний флопік на основі grub

На флопіку треба створити папку /boot/grub/
та записати туди файли stage1, stage2 та menu.lst

Після того виконати скріпт

grub --device-map=/boot/grub/device.map --batch <<EOF
install (fd0)/boot/grub/stage1 d (fd0) (fd0)/boot/grub/stage2 p (fd0)/boot/grub/menu.lst
quit
EOF

Потім stage1 можна стерти

В якості menu.lst я використав такий файл

timeout 30
default 0

# 0
title hda1
kernel (hd0,0)/boot/vmlinuz root=/dev/hda1
initrd (hd0,0)/boot/initrd.img

# 1
title hda2
kernel (hd0,1)/boot/vmlinuz root=/dev/hda2
initrd (hd0,1)/boot/initrd.img

# 2
title hda3
kernel (hd0,2)/boot/vmlinuz root=/dev/hda3
initrd (hd0,2)/boot/initrd.img

# 3
title hda4
kernel (hd0,3)/boot/vmlinuz root=/dev/hda4
initrd (hd0,3)/boot/initrd.img

# 4
title hda5
kernel (hd0,4)/boot/vmlinuz root=/dev/hda5
initrd (hd0,4)/boot/initrd.img

# 5
title hda6
kernel (hd0,5)/boot/vmlinuz root=/dev/hda6
initrd (hd0,5)/boot/initrd.img

# 6
title hda7
kernel (hd0,6)/boot/vmlinuz root=/dev/hda7
initrd (hd0,6)/boot/initrd.img

# 7
title hda8
kernel (hd0,7)/boot/vmlinuz root=/dev/hda8
initrd (hd0,7)/boot/initrd.img

# 8
title hda9
kernel (hd0,8)/boot/vmlinuz root=/dev/hda9
initrd (hd0,8)/boot/initrd.img

# 9
title hdb1
kernel (hd0,0)/boot/vmlinuz root=/dev/hdb1
initrd (hd0,0)/boot/initrd.img

# 10
title hdb2
kernel (hd0,1)/boot/vmlinuz root=/dev/hdb2
initrd (hd0,1)/boot/initrd.img

# 11
title hdb3
kernel (hd0,2)/boot/vmlinuz root=/dev/hdb3
initrd (hd0,2)/boot/initrd.img

# 12
title hdb4
kernel (hd0,3)/boot/vmlinuz root=/dev/hdb4
initrd (hd0,3)/boot/initrd.img

# 13
title hdb5
kernel (hd0,4)/boot/vmlinuz root=/dev/hdb5
initrd (hd0,4)/boot/initrd.img

# 14
title hdb6
kernel (hd0,5)/boot/vmlinuz root=/dev/hdb6
initrd (hd0,5)/boot/initrd.img

# 15
title hdb7
kernel (hd0,6)/boot/vmlinuz root=/dev/hdb7
initrd (hd0,6)/boot/initrd.img

# 16
title hdb8
kernel (hd0,7)/boot/vmlinuz root=/dev/hdb8
initrd (hd0,7)/boot/initrd.img

# 17
title hdb9
kernel (hd0,8)/boot/vmlinuz root=/dev/hdb9
initrd (hd0,8)/boot/initrd.img

# 18
title hdc1
kernel (hd0,0)/boot/vmlinuz root=/dev/hdc1
initrd (hd0,0)/boot/initrd.img

# 19
title hdc2
kernel (hd0,1)/boot/vmlinuz root=/dev/hdc2
initrd (hd0,1)/boot/initrd.img

# 20
title hdc3
kernel (hd0,2)/boot/vmlinuz root=/dev/hdc3
initrd (hd0,2)/boot/initrd.img

# 21
title hdc4
kernel (hd0,3)/boot/vmlinuz root=/dev/hdc4
initrd (hd0,3)/boot/initrd.img

# 22
title hdc5
kernel (hd0,4)/boot/vmlinuz root=/dev/hdc5
initrd (hd0,4)/boot/initrd.img

# 23
title hdc6
kernel (hd0,5)/boot/vmlinuz root=/dev/hdc6
initrd (hd0,5)/boot/initrd.img

# 24
title hdc7
kernel (hd0,6)/boot/vmlinuz root=/dev/hdc7
initrd (hd0,6)/boot/initrd.img

# 25
title hdc8
kernel (hd0,7)/boot/vmlinuz root=/dev/hdc8
initrd (hd0,7)/boot/initrd.img

# 26
title hdc9
kernel (hd0,8)/boot/vmlinuz root=/dev/hdc9
initrd (hd0,8)/boot/initrd.img

# 27
title hdd1
kernel (hd0,0)/boot/vmlinuz root=/dev/hdd1
initrd (hd0,0)/boot/initrd.img

# 28
title hdd2
kernel (hd0,1)/boot/vmlinuz root=/dev/hdd2
initrd (hd0,1)/boot/initrd.img

# 29
title hdd3
kernel (hd0,2)/boot/vmlinuz root=/dev/hdd3
initrd (hd0,2)/boot/initrd.img

# 30
title hdd4
kernel (hd0,3)/boot/vmlinuz root=/dev/hdd4
initrd (hd0,3)/boot/initrd.img

# 31
title hdd5
kernel (hd0,4)/boot/vmlinuz root=/dev/hdd5
initrd (hd0,4)/boot/initrd.img

# 32
title hdd6
kernel (hd0,5)/boot/vmlinuz root=/dev/hdd6
initrd (hd0,5)/boot/initrd.img

# 33
title hdd7
kernel (hd0,6)/boot/vmlinuz root=/dev/hdd7
initrd (hd0,6)/boot/initrd.img

# 34
title hdd8
kernel (hd0,7)/boot/vmlinuz root=/dev/hdd8
initrd (hd0,7)/boot/initrd.img

# 35
title hdd9
kernel (hd0,8)/boot/vmlinuz root=/dev/hdd9
initrd (hd0,8)/boot/initrd.img


Всюди вказано (hd0,x), тому, що Grub визанчає (очевидно)
індекс диску не по інтерфейсу підключення (Primary Master, P. Slave, etc ...), а по тому, який диск виставлений в BIOS як First Boot Device.

Для First Boot Device - (hd0,x)
Second Boot Device - (hd1,x)

(але це лише моє емпіричне твердження, якщо інакше - прошу виправити)



---------

Одже загрузившись з такого флопа можна загрузити Linux
з любого розділу