Faceţi căutări pe acest blog

Se încarcă...

duminică, 6 aprilie 2014

Boot iso de pe hdd (Grub2)

 Există deja două materiale/ tutoriale/ topicuri pe această temă pe forumurile Ubuntu și Softpedia (vedeți la Surse primele 2 linkuri), dar cum nu toți linuxiștii frecventează aceste forumuri și cum am aprofundat puțin subiectul în direcțiile ce mă interesează (Arch și Rosa/ OpenMandriva)...

 Putem boota o distribuție Linux direct de pe hdd, fișierul .iso nu trebuie scris neapărat pe cd/ dvd/ usb sau copiate pe o partiție dedicată.
 Unele distribuții au unelte proprii:
Rosa (rosa-fromiso): http://wiki.rosalab.ru/en/index.php/Booting_ROSA_from_iso_file
Fedora (fedora-fromiso): https://gist.github.com/oxplot/2132076
Grml (grml-rescueboot): http://wiki.grml.org/doku.php?id=rescueboot

 Aceste utilitare nu sunt universal valabile, dar din fericire Grub2 știe să lucreze cu imagini .iso de pe care să booteze!

1- În primul rând trebuie să avem descărcată imaginea .iso a distribuției ce ne interesează. În materialele din care m-am inspirat se crează un director special în care se copie imaginile respective, dar e posibil să păstrăm imaginile .iso în locul unde sunt descărcate și să pasăm calea corectă către ele. Eu voi menține indicațiile originale din aceste materiale.

2- Vom crea ca root (sau folosind sudo în fața comenzii) un director special, dedicat în /boot:
mkdir /boot/iso

3- Vom muta imaginea în directorul nou creat:
mv cale-către-imagine.iso /boot/iso 
 De exemplu:
mv ~/Downloads/ROSA.FRESH.KDE.R2.x86_64.iso /boot/iso
mv /home/shogun/Downloads/Archlinux-2014.04.01-dual.iso /boot/iso
mv Desktop/ubuntu-14.04-beta2-desktop-amd64.iso /boot/iso

4- Apoi trebuie să modificăm  fișierul /etc/grub.d/40_custom, adăugând acel fișier .iso în opțiunile de boot ale Grub2. Fiecare distribuție are parametri specifici datorați diferențelor dintre ele, iar pentru unele distribuții este necesar să dezarhivăm fișierul .iso (e cazul distribuțiilor bazate pe rpm, Rosa, OpenMandriva, Fedora).
 Folosiți editorul preferat (nano, mcedit, gedit, kwrite, kate, șamd) și adăugați în /etc/grub.d/40_custom liniile următoare în funcție de distribuția pe care doriți s-o testați sau instalați pe o partiție pregătită pentru așa ceva.
 Eu am testat câteva distribuții, toate pe 64 biți, Clonezilla, Arch, Manjaro, Rosa, OpenMandriva, Ubuntu, Fedora, Gparted, Crunchbang, Gentoo și Knoppix. Imaginile .iso ale Rosa, OpenMandriva și Fedora trebuie dezarhivate în /boot/iso și dată calea către ele (se pare că un bug în dracut e responsabil, sau n-am reușit eu altfel...), celelalte pornesc la boot direct de pe pe imaginea .iso.
 Dacă nu observați singuri, ceea ce ne interesează este calea corectă către vmlinuz și initrd.img, cu variante precum vmlinuz0 și initrd0.img (în cazul Rosa, OpenMandriva, Fedora) sau vmlinuz.efi și initrd.lz (în cazul Ubuntu), șamd. Intrările (menuentry) din /etc/grub.d/40_custom sunt similare cu intrările din /boot/grub/grub.cfg, vmlinuz este imaginea comprimată a kernelului Linux (la boot este decomprimat, încărcat în memoria RAM și executat), iar initrd.img (initial RAM disk) este o imagine comprimată a sistemului de fișiere/ module necesare la boot.
 
 Putem căuta aceste fișiere în imaginea .iso fără să dezarhivăm/ extragem conținutul, mc și Ark citesc / deschid arhivele:


menuentry "ISO Clonezilla 2.2.1-25" {
set isofile="/boot/iso/clonezilla-live-2.2.1-25-amd64.iso"
loopback loop (hd0,2)$isofile
linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}
menuentry "ISO Ubuntu 14.04" {
set isofile="/boot/iso/ubuntu-14.04-beta2-desktop-amd64.iso"
loopback loop (hd0,2)$isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject
initrd (loop)/casper/initrd.lz
}
menuentry "ISO Manjaro 0.8.9" {
set isofile="/boot/iso/manjaro-xfce-0.8.9-x86_64.iso"
loopback loop (hd0,2)$isofile
linux (loop)/manjaro/boot/x86_64/manjaroiso img_dev=/dev/sda2 img_loop=$isofile misobasedir=manjaro misolabel=MJRO_089 nouveau.modeset=1 i915.modeset=1 radeon.modeset=1
initrd (loop)/manjaro/boot/x86_64/manjaro.img
}
menuentry "ISO Knoppix 7.2" {
set isofile="/boot/iso/ADRIANE-KNOPPIX_V7.2.0gCD-2013-07-28-EN.iso"
loopback loop (hd0,2)$isofile
linux (loop)/boot/isolinux/linux bootfrom=/dev/sda2$isofile lang=en apm=power-off  nomce libata.force=noncq hpsa.hpsa_allow_any=1 loglevel=1
initrd (loop)/boot/isolinux/minirt.gz
}
menuentry "ISO Archlinux-2014.04.01-dual.iso" --class iso {
set isofile="/boot/iso/archlinux-2014.04.01-dual.iso"
loopback loop (hd0,2)/$isofile
linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201404 img_dev=/dev/sda2 img_loop=$isofile earlymodules=loop
initrd (loop)/arch/boot/x86_64/archiso.img
}
menuentry "ISO Rosa 2014 Fresh R2" {
insmod ext2
set root='(hd0,2)'
search --no-floppy --fs-uuid --set 3862caaa-4363-43a1-a994-cf8001e0b95a
linux /boot/iso/ROSA.FRESH.KDE.R2.x86_64/isolinux/vmlinuz0 rootfstype=auto root=UUID=3862caaa-4363-43a1-a994-cf8001e0b95a liveimg rd.live.dir=/boot/iso/ROSA.FRESH.KDE.R2.x86_64/LiveOS/ ro quiet rhgb
initrd /boot/iso/ROSA.FRESH.KDE.R2.x86_64/isolinux/initrd0.img
}
menuentry "ISO OpenMandriva 2014" {
insmod ext2
set root='(hd0,2)'
search --no-floppy --fs-uuid --set 3862caaa-4363-43a1-a994-cf8001e0b95a
linux /boot/iso/OpenMandrivaLx-2014.0-beta1.x86_64/isolinux/vmlinuz0 rootfstype=auto root=UUID=3862caaa-4363-43a1-a994-cf8001e0b95a liveimg rd.live.dir=/boot/iso/OpenMandrivaLx-2014.0-beta1.x86_64/LiveOS/ ro quiet rhgb
initrd /boot/iso/OpenMandrivaLx-2014.0-beta1.x86_64/isolinux/initrd0.img
}

menuentry 'ISO Gparted' {
set isofile="/boot/iso/gparted-live-0.18.0-1-amd64.iso"
set root=(hd0,2)
loopback loop (hd0,2)$isofile
linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}
menuentry 'ISO Crunchbang' {
set isofile="/boot/iso/crunchbang-11-20130506-amd64.iso"
set root=(hd0,2)
loopback loop (hd0,2)$isofile
linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile toram--
initrd (loop)/live/initrd.img

menuentry "ISO Gentoo" {
set isofile="/boot/iso/livedvd-amd64-multilib-2012.1.iso"
loopback loop (hd0,2)$isofile
linux (loop)/boot/gentoo root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot initrd=/boot/gentoo.igz isoboot=/shogun/Downloads/livedvd-amd64-multilib-2012.1.iso toram--
initrd (loop)/boot/gentoo.igz


 Puneți calea corectă către partiția unde aveți imaginile, (hd0,2) se referă la primul disc și a doua partiție, /dev/sda2, (hd0,1) la /dev/sda1, (hd1,4) este al doilea disc și a patra partiție de pe disc, /dev/sdb4, etc. Grub2 începe numerotarea discurilor de la 0 și a partițiilor de la 1!
 Înlocuiți la UUID cu valoarea potrivită partiției voastre / pentru varianta cu /boot/iso sau /home dacă păstrați imaginile în /home și pasați calea către acestea. Aflați UUID cu comanda blkid dată ca root sau precedată de sudo.
 Înlocuiți numele versiunilor de aici cu versiunea corectă a distribuției testate.
 Pentru versiuni pe 32 biți trebuie făcute modificări minore, de exemplu (la Arch i686 în loc de x86_64, la Ubuntu vmlinuz în loc de vmlinuz.efi, șamd):

menuentry "ISO Archlinux-2014.04.01-dual.iso" --class iso {
set isofile="/boot/iso/archlinux-2014.04.01-dual.iso"
set partition="2"
loopback loop (hd0,$partition)/$isofile
linux (loop)/arch/boot/i686/vmlinuz archisolabel=ARCH_201404 img_dev=/dev/sda2 img_loop=$isofile earlymodules=loop
initrd (loop)/arch/boot/i686/archiso.img
}

 menuentry "ISO Ubuntu 14.04" {
set isofile="/boot/iso/ubuntu-14.04-beta2-desktop-i386.iso"
loopback loop (hd0,2)$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
initrd (loop)/casper/initrd.lz
}



 După cum spuneam este posibil ca imaginile .iso să fie stocate în partiția /home sau chiar pe alte partiții, chiar NTFS... În acest caz trebuie înlocuită locația dată ca exemplu anterior (/boot/iso) cu locația corectă.
 Dacă partiția /home este /dev/sda3 (iar imaginea .iso este în directorul Downloads, mai precis /home/user/Downloads), iar partiția ntfs este /dev/sda5 (imaginea în folder Descărcări):
menuentry "ISO Gentoo" {
set isofile="/shogun/Downloads/livedvd-amd64-multilib-2012.1.iso"
loopback loop (hd0,3)$isofile
linux (loop)/boot/gentoo root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot initrd=/boot/gentoo.igz isoboot=/shogun/Downloads/livedvd-amd64-multilib-2012.1.iso toram--
initrd (loop)/boot/gentoo.igz

menuentry "ISO Clonezilla" {
set isofile="/Descărcări/clonezilla-live-2.2.1-25-amd64.iso"
loopback loop (hd0,5)$isofile
linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}


 În exemplul anterior înlocuiți user (shogun) cu numele corect al utilizatorului.
 Mai multe exemple găsiți în legăturile date la Surse, nu le-am încercat personal:
menuentry 'Parted Magic ISO ' {
set isofile="/iso/pmagic_2013_05_01.iso"
loopback loop (hd0,1)$isofile
linux (loop)/pmagic/bzImage iso_filename=/iso/pmagic_2013_05_01.iso boot=live
initrd (loop)/pmagic/initrd.img
}
menuentry "Petra Cinnamon" {
set isofile="/iso/linuxmint-16-cinnamon-dvd-32bit.iso"
loopback loop (hd0,1)$isofile
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
initrd (loop)/casper/initrd.lz
}
menuentry "aptosid-2013-01-hesperides-kde-lite-i386-201305050307" {
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  6c52a4df-175d-4ccf-842c-76daf7e1ee4d
        else
          search --no-floppy --fs-uuid --set=root 6c52a4df-175d-4ccf-842c-76daf7e1ee4d
        fi
        iso_path="/iso/aptosid-2013-01-hesperides-kde-lite-i386-201305050307.iso"
        export iso_path
        kernelopts="   "
        export kernelopts
        loopback loop "/iso/aptosid-2013-01-hesperides-kde-lite-i386-201305050307.iso"
        set root=(loop)
        configfile /boot/grub/loopback.cfg
}



 Reamintesc: intrările colorate cu galben sunt testate personal de mine, cele cu roșu nu!




 Dacă aveți destulă memorie RAM (eu de exemplu am 8 GB, e mai mult decât suficient, bănuiesc că 4 GB e deasemenea suficient), puteți adăuga la linia cu linux parametrul toram, astfel sistemul se va încărca direct în RAM, deci procesul va fi mai rapid și în cazul instalării pe o partiție nu va trebui demontat /isodevice (pentru distribuțiile bazate pe Ubuntu).  
 Exemplu:
menuentry "ISO Archlinux-2014.04.01-dual.iso" --class iso {
set isofile="/boot/iso/archlinux-2014.04.01-dual.iso"
loopback loop (hd0,2)/$isofile
linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201404 img_dev=/dev/sda2 img_loop=$isofile earlymodules=loop toram--
initrd (loop)/arch/boot/x86_64/archiso.img
}


 Toram se poate adăuga și la boot editând intrarea în meniu, are efect doar la acea pornire, nu e permanent. Distribuții mici, precum Clonezilla, Puppy pot fi încărcate în memorie chiar cu mai puțin RAM, 1-2 GB, uitați-vă la intrarea Clonezilla de mai sus...

4- Actualizăm setările Grub2, astfel încât să avem la boot opțiunea de-a boota distribuția dorită:
sudo update-grub  (în Ubuntu și alte distribuții unde avem implicit instalat update-grub)
grub-mkconfig -o /boot/grub/grub.cfg  (ca root în Arch)

 În cazul folosirii Burg fișierul de editat este /etc/burg.d/40_custom iar comanda de actualizare a bootloaderului este sudo update-burg.

5- Repornim sistemul, în meniul Grub vom vedea intrarea/ intrările distribuției/ distribuțiilor noi, navigăm la acestea și le selectăm pentru bootare.


 Dacă aveți multe intrări în meniul de boot și doriți să-l aerisiți puțin, este posibil prin crearea unui fișier text în care vom muta toate intrările din /etc/grub.d/40_custom, iar în /etc/grub.d/40_custom vom pune doar intrarea către acest fișier sursă. De exemplu fișierul ce conține toate intrările Grub pentru imaginile .iso se numește iso.grub.sh, este localizat pe partiția /dev/sda3, partiția mea /home, în directorul /home/shogun.
menuentry "ALL ISO" {
configfile (hd0,3)/shogun/iso.grub.sh
}


 Dacă am avea acest fișier în /boot/iso, pe partiția /dev/sda2, intrarea ar fi:
menuentry "ALL ISO" {
configfile (hd0,2)/boot/iso/iso.grub.sh
}


 După acest pas actualizăm meniul de boot cu grub-mkconfig -o /boot/grub/grub.cfg, iar la bootare vom avea în meniul Grub2 linia ”ALL ISO”, navigăm la ea, Enter și vom avea toate intrările cu imagini .iso!


Surse:
http://forum.softpedia.com/topic/966259-booteaza-imagini-iso-direct-de-pe-hdd/
http://forum.ubuntu.ro/viewtopic.php?pid=186288#p186288
https://wiki.archlinux.org/index.php/GRUB2#Booting_an_ISO_directly_from_GRUB
http://askubuntu.com/questions/141940/how-to-boot-live-iso-images
https://help.ubuntu.com/community/Grub2/ISOBoot/Examples


Back to top