Azzal szerintem mindenki tisztában van, hogy nem csak CD/DVD-ről lehet Ubuntut telepíteni, hanem pendrive-ról is.
Léteznek azonban olyan kész megoldások is, amiknek a segítségével ugyanarra pendrive-ra több Live CD-t és telepítőt lehet rakni és a bootolás során lehet kiválasztani, hogy mit akarunk elindítani.
Ilyen megoldás például a MultiSystem is: http://www.pendrivelinux.com/multiboot-create-a-multiboot-usb-from-linux/
Aki szeretne ilyen pendrive-ot készíteni, de csak a kész, kényelmes megoldás jöhet szó, az csak a következő bekezdés végéig folytassa az olvasást és próbálja inkább ki a Multisystem-et!
Én nem elégedtem meg a MultiSystem-mel, ugyanis vannak olyan tulajdonságai, amik nekem nem feleltek meg.
Hátrányok MultiSystem használata esetén:
- számomra túl sok felesleges dolgot tud
- számomra ismeretlen dolgokat módosít a telepítő lemezen
- csak VFAT fájlrendszert tartalmazó pendrive-val képes dolgozni
- grub2-t nem az MBR-be telepíti, ezért vélhetően előtte vagy utána még ki kell adni a "
sudo grub-install --root-directory=/media/pendrive /dev/sdX
" utasítást, ahol a /media/pendrive az a könyvtár, ahova a pendrive csatolva lett, jellemzően a /media alá egy könyvtárba (esetemben /media/UBUNTU), illetve /dev/sdX esetén a pendrive eszköze, ami nálam /dev/sde.
Ahogy írtam, én kész megoldás helyett saját megoldást akartam használni, aminél pontosan tudom, hogy az eredeti telepítő lemezen mit változtattam, valamint aminél tudok linuxos fájlrendszert használni.
Hozzávalók a megoldásomhoz:
- linuxos fájlrendszerrel formázott legalább 1 GB-os pendrive (ahány telepítőt akarsz a pendrive-ra rakni, annyiszor kb 700 MB)
- olyan linux operációs rendszer, ami ismeri a grub2-t - ezen fogjuk elkészíteni
- legalább 1 db Ubuntu ISO letöltésére alkalmas internet
- linuxos tapasztalat (pl. grub2 telepítés, ISO kibontás, pendrive formázás)
FONTOS!
Mindenki a saját felelősségére használja ezt a megoldást! Igyekeztem a legjobb tudásom szerint megírni a leírást, de esetleges félregépelés vagy a használó tapasztalatának hiánya miatt semmilyen felelősséget nem tudok vállalni!
Tehát akkor következzen a leírás.
I. Live CD-k és telepítők kiválasztása
Én a következő Live CD-ket és telepítőket raktam a pendrive-ra:
- Ubuntu 10.04.4 Desktop 32-bit és 64-bit (Live CD)
- Ubuntu 10.04.4 Alternate 32-bit és 64-bit (Telepítő)
- Ubuntu 10.04.4 server 32-bit és 64-bit (Telepítő)
Ez 6 db Live CD és telepítő összesen, így a pendrive-on nekem összesen 4178 MiB (4487 MB) helyre volt szükségem.
("Mi" az IEC prefixum, "M" az SI prefixum)
1 MiB = 2^10 * 2^10 * 1 B
1 MB = 10^3 * 10^3 * 1 B
Ennél a lépésnél én azt is meghatároztam, hogy a Live CD-k és telepítő lemezek hova kerülnek majd a pendrive-on.
Úgy döntöttem, hogy a
/boot/ubuntu/ könyvtárba fogom őket rakni.
Tehát nálam így néz ki a struktúra:
ubuntu-10.04.4-alternate-amd64.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64
ubuntu-10.04.4-alternate-i386.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-i386
ubuntu-10.04.4-desktop-amd64.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-desktop-amd64
ubuntu-10.04.4-desktop-i386.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-desktop-i386
ubuntu-10.04.4-server-amd64.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-server-amd64
ubuntu-10.04.4-server-i386.iso esetén /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-server-i386
FONTOS!
64-bites (amd64) verziók csak akkor működnek, ha 64-bites CPU van a gépben!
A név ne keverjen össze senki, nem csak AMD, hanem Intel CPU-val szerelt gépeken is megy, ha az 64-bites. A név történelmi okok miatt ragadt rajta a 64-biteseken, de ezt ebben a leírásban nem részletezem.
II. Live CD és telepítő közti különbség
Live CD bootolása esetén egy kész rendszerrel tud dolgozni az ember akár telepítés nélkül is, telepítő esetén viszont csak telepíteni tudja azt a rendszert a HDD-re, amivel majd dolgozni tud.
Azonban számunkra más miatt is érdekes, hogy Live CD-ről vagy telepítőről beszélünk.
Ubuntu 10.04.4 esetén a Desktop CD (Live CD) tartalmaz egy Casper nevű kis programot, ami jelentősen egyszerűbb teszi a pendrive elkészítését, ha csak Desktop CD-ket akarunk rárakni.
III. Grub2 telepítése pendrive-ra
Formázzuk meg a pendrive-ot (séma: MBR, fájlrendszer: linuxos (pl. ext2), partició legyen bootolható)
Lehetőség szerint adjunk a particiónak vaamilyen hangzatos nevet, például UBUNTU vagy MULTIBOOT.
Disk utility-ben (/usr/bin/palimpsest
) ezt a lépést könnyedén végre tudjuk hajtani.
Ha a rendszer automatikusan csatolja a pendrive-ot, akkor nézzük meg, hogy melyik eszköz a pendrive.
balazs@balazs:/$ mount | grep "/media/UBUNTU"
/dev/sde1 on /media/UBUNTU type ext2 (rw,nosuid,nodev,uhelper=udisks)
balazs@balazs:/$
Itt látható, hogy a /dev/sde1 a csatolt partició, tehát a pendrive a /dev/sde eszköz lesz.
Tehát esetemben a grub2 telepítéséhez a következő utasítást kell futtatni:
sudo grub-install --root-directory=/media/UBUNTU /dev/sde
Majd létre kell hozni ez üres "grub.cfg" nevű fájlt, amit majd később fogunk szerkeszteni.
Az esetemben ezt itt kell létrehozni: /media/UBUNTU/boot/grub/grub.cfg
IV. Pendrive partició UUID és fájlrendszer a telepítő CD-khez (Live CD-khez nem kell)
Mivel az előbb formáztuk meg a pendrive-ot, így tisztában vagyunk vele, hogy milyen fájlrendszer került rá, de UUID kiderítése közben is látni fogjuk ezt az információt.
UUID kiderítése esetemben a következő képpen néz ki:
balazs@balazs:/$ blkid /dev/sde1
/dev/sde1: LABEL="UBUNTU" UUID="2338807b-3bb0-4372-b00d-a4b59dcc6d25" TYPE="ext2"
balazs@balazs:/$
Tehát esetemben az UUID "2338807b-3bb0-4372-b00d-a4b59dcc6d25
" lesz macskakörmök nélkül.
Erre a két információra mindenképpen szükségünk lesz, jegyezzük le őket egy szöveges fájlba!
V. Munka a Live CD-kkel
Live CD esetén nagyon könnyű dolgunk van. Ki sem kell bontani az ISO-t.
Az esetemben ubuntu-10.04.4-desktop-amd64.iso
-t bemásoljuk a /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-desktop-amd64
könyvtárba.
A nemrég létrehozott grub.cfg-hez hozzáadjuk a következő bejegyzést (ha már írtunk bele, akkor a fájl végéhez adjuk):
menuentry "Ubuntu 10.04.4 Desktop 64-bit" {
set isofile="/boot/ubuntu/ubuntu-10.04.4-desktop-amd64/ubuntu-10.04.4-desktop-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
initrd (loop)/casper/initrd.lz
}
Az isofile változó mindig a pendrive csatolási pontjától számított relatív elérési útvonal abszolút útvonalként.
Tehát ha a /media/UBUNTU/boot/ubuntu/ útvonalon érhető el az ISO, akkor ez /boot/ubuntu/ lesz.
Lényegében ezzel már van egy olyan pendrive-unk, amin van egy Ubuntu 10.04.4 Desktop 64-bit verzió.
Ugyanezt elismételhetjük még természetesen a 32-bites verzióval is, abban az esetben a pendrive-ról képesek leszünk mint a 32-bites mind a 64-bites verziót indítani.
VI. Munka a telepítő lemezekkel
Telepítő lemezek esetén sokkal bonyolultabb dolgunk van, de egyáltalán nem lehetetlen megoldani a dolgot.
Első lépésként másoljuk a telepítő lemez ISO fájl tartalmát a pendrive-ra.
A példában én a /iso/ubuntu-10.04.4-alternate-amd64.iso
fájl tartalmát a /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64
könyvtárba másolom.
Innen már akár root-ként is tevékenykedhetünk, vélhetően egyszerű felhasználóként úgysem lesz több mindenhez jogunk.
root@balazs:~$ mkdir /mnt/iso
root@balazs:~$ mount -o loop /mnt/h3/UBUNTU_INSTALL_CD/ubuntu-10.04.4-alternate-amd64.iso /mnt/iso
mount: warning: /mnt/iso seems to be mounted read-only.
root@balazs:~$ mkdir /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64
root@balazs:~$ cp -r /mnt/iso/. /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64
root@balazs:~$
A pendrive-ra másolás a pendrive sebességétől függően sok ideig is eltarthat!
Ha ezzel megvagyunk, akkor az ISO fájlt lecsatolhatjuk, és törölhetjük a /mnt/iso könyvtárat.
root@balazs:~# umount /mnt/iso
root@balazs:~# rmdir /mnt/iso
root@balazs:~#
A telepítőn több dolgot is kell módosítani. Az első és legfontosabb az initrd változtatása, hogy a telepítő ne álljon majd le azzal, hogy nem tudja csatolni a CD-t.
FONTOS!
Az initrd (initrd.gz-ben lévő initrd nevű CPIO archívum) kibontásához mindenképpen root jog kell!
Bontsuk tehát ki az initrd-t.
root@balazs:~# cd /media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64# cd install
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# ls
initrd.gz mt86plus netboot README.sbm sbm.bin vmlinuz
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# gunzip initrd.gz
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# ls
initrd mt86plus netboot README.sbm sbm.bin vmlinuz
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# mkdir initrd_content
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# cd initrd_content
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content# cpio -id < ../initrd
37493 blocks
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content# ls
bin dev etc init initrd lib lib64 media mnt proc sbin sys tmp usr var
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content#
initrd-n belül nekünk a var/lib/dpkg/info/cdrom-detect.postinst fájlt kell szerkesztenünk.
Ez történhet bármilyen szövegszerkesztővel, és a gedit-et vagy vi-t javaslom.
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content# gedit var/lib/dpkg/info/cdrom-detect.postinst
Ebbe a részbe fogjuk beszúrni a saját kis kódunkat a mounted=
és a if db_get cdrom-detect/try-usb && [ "$RET" = true ]; then
közé:
log "Searching for Ubuntu installation media..."
mkdir /cdrom 2>/dev/null || true
try=1
while true
do
mounted=
if db_get cdrom-detect/try-usb && [ "$RET" = true ]; then
devices="$(list-devices usb-partition)"
devices="$devices $(list-devices mmc-partition)"
for device in $devices; do
Ezt szúrjuk be:
if db_get cdrom-detect/custom-usb && [ "$RET" = true ] && db_get cdrom-detect/uuid && db_get cdrom-detect/fs && db_get cdrom-detect/path; then
log "Trying to mount directory on custom USB drive"
device=$(db_get cdrom-detect/uuid; echo "/dev/disk/by-uuid/$RET")
fs=$(db_get cdrom-detect/fs; echo "$RET")
log "File system: $fs"
path=$(db_get cdrom-detect/path; echo "$RET")
log "Path to be mounted: $path"
mkdir /media/custom_USB
if mount -t $fs -o ro,exec $device /media/custom_USB && mount --bind /media/custom_USB/$path /cdrom 2>/dev/null; then
log "Mount of the directory on custom USB drive succeeded."
if [ -e /cdrom/.disk/info ]; then
log "CD-ROM mount suceeded: directory on custom USB drive"
mounted=1
db_set cdrom-detect/cdrom_device $device
db_set cdrom-detect/cdrom_fs $fs
break
else
log "CD-ROM mount failed: directory on custom USB drive"
umount /cdrom 2>/dev/null || true
umount /media/custom_USB 2>/dev/null || true
rmdir /media/custom_USB
fi
else
log "Mount of the directory on custom USB drive failed."
fi
fi
Tehát így fog kinézni az a rész:
log "Searching for Ubuntu installation media..."
mkdir /cdrom 2>/dev/null || true
try=1
while true
do
mounted=
if db_get cdrom-detect/custom-usb && [ "$RET" = true ] && db_get cdrom-detect/uuid && db_get cdrom-detect/fs && db_get cdrom-detect/path; then
log "Trying to mount directory on custom USB drive"
device=$(db_get cdrom-detect/uuid; echo "/dev/disk/by-uuid/$RET")
fs=$(db_get cdrom-detect/fs; echo "$RET")
log "File system: $fs"
path=$(db_get cdrom-detect/path; echo "$RET")
log "Path to be mounted: $path"
mkdir /media/custom_USB
if mount -t $fs -o ro,exec $device /media/custom_USB && mount --bind /media/custom_USB/$path /cdrom 2>/dev/null; then
log "Mount of the directory on custom USB drive succeeded."
if [ -e /cdrom/.disk/info ]; then
log "CD-ROM mount suceeded: directory on custom USB drive"
mounted=1
db_set cdrom-detect/cdrom_device $device
db_set cdrom-detect/cdrom_fs $fs
break
else
log "CD-ROM mount failed: directory on custom USB drive"
umount /cdrom 2>/dev/null || true
umount /media/custom_USB 2>/dev/null || true
rmdir /media/custom_USB
fi
else
log "Mount of the directory on custom USB drive failed."
fi
fi
if db_get cdrom-detect/try-usb && [ "$RET" = true ]; then
devices="$(list-devices usb-partition)"
devices="$devices $(list-devices mmc-partition)"
for device in $devices; do
Ez annyit eredményez, hogy amennyiben grub2-ben átadjuk a megfelelő paramétereket megfelelő értékekkel a kernelnek, akkor lefut az általunk hozzáadott rész és a telepítő nem dog elakadni a CD felismerésénél.
Akinek foglalkozott már script írással, az rá fog jönni, hogy pontosan mit csinál ez a rész, ezért ezt nem részletezném.
Annyit tennék csak hozzá, hogy a telepítés során pl nincs awk, így korlátozottak a lehetőségek, ezért nem is tudtam szebben megoldani.
Csomagoljuk vissza a initrd-t és töröljük az átmeneti könyvtárat.
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content# find ./ | cpio -H newc -o > ../initrd
37509 blocks
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd_content# cd ..
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# ls
initrd initrd_content mt86plus netboot README.sbm sbm.bin vmlinuz
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# gzip initrd
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# ls
initrd_content initrd.gz mt86plus netboot README.sbm sbm.bin vmlinuz
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install# rm -r initrd_content
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install#
Nézzük meg, hogy md5sum.txt szerint minden rendben van-e
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64# md5sum -c md5sum.txt | grep FAILED
./install/initrd.gz: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64#
Ha mindent jól csináltunk, akkor csak az initrd.gz checksum-ja nem fog megegyezni.
Generáljunk akkor egy úgy md5sum-txt-t.
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64# find . -type f | grep -v "md5sum.txt" | xargs md5sum > md5sum.txt
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64#
Nézzük meg, hogy az md5sum.txt-ben látszólag meg vannak-e a bejegyzések.
Ellenőrizzük le, hogy jó lett-e az md5sum.txt
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64# md5sum -c md5sum.txt | grep FAILED
root@balazs:/media/UBUNTU/boot/ubuntu/ubuntu-10.04.4-alternate-amd64#
Ha minden rendben, akkor adjuk hozzá grub.cfg-hez a következő bejegyzést.
menuentry "Ubuntu 10.04.4 Alternate 64-bit" {
linux /boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/vmlinuz root=UUID=2338807b-3bb0-4372-b00d-a4b59dcc6d25 file=/cdrom/preseed/ubuntu.seed cdrom-detect/custom-usb=true cdrom-detect/uuid=2338807b-3bb0-4372-b00d-a4b59dcc6d25 cdrom-detect/fs=ext2 cdrom-detect/path=boot/ubuntu/ubuntu-10.04.4-alternate-amd64 quiet --
initrd /boot/ubuntu/ubuntu-10.04.4-alternate-amd64/install/initrd.gz
}
root
és cdrom-detect/uuid
esetén legyen az az UUID, amit lejegyeztünk.
cdrom-detect/fs
értéke legyen a pendrive fájlrendszerének a típusa.
cdrom-detect/path
értéke legyen annak a könyvtárnak a relatív elérési útvonala a pendrive-on, ahova az ISO fájlt kibontottuk.
Természetesen minden egyéb bejegyzést a környezethez igazítva kell beírni!
VII. Pendrive kipróbálása
Miután az előző lépések sikeresek voltak, válaszd le szabályosan a pendrive-ot!
Majd bootolj be róla arra a fizikai/virtuális gépre, amin ki akarod próbálni!
A leírással kapcsolatban mindenféle véleményt, javaslatot és építő jellegű kritikát szívesen fogadok.
Ha valakinek szüksége lenne rá, akkor szívesen feltöltöm valahova az általam preparált telepítő csomagokat, és akkor csak a grub2 telepítésével és konfigjával kell foglalkozni.
UPDATE 1
Telepítő lemez esetén a grub.cfg-ben a file
értéke egy olyan file kell, hogy legyen, ami létezik a telepítőben, server változat esetén pl nincs ubuntu.seed
, de van helyette ubuntu-server.seed
UPDATE 2
Ubuntu brainstromra is feltöltöttem az ötletet.
Itt tudod támogatni (regisztráció szükséges): http://brainstorm.ubuntu.com/idea/29572/