LA PROCEDURA È OBSOLETA E NON PIÙ VALIDA PER LE ULTIME VERSIONI DI SLACKWARE (CHE INCLUDONO NATIVAMENTE ntfs-3g) E PER LE VERSIONI DI WINDOWS DIVERSE DA XP.
Questo tutorial nasce con lo scopo di consentire l'utilizzo di Linux (in questo caso Slackware) anche a chi non vuole ripartizionare il proprio disco su cui è presente Windows.
Ecco alcuni motivi per cui qualcuno vorrebbe/dovrebbe non ripartizionare il sistema:
Tutte queste situazioni sono risolvibili con l'utilizzo di una Virtual Machine tipo VMWare, ma questo comunque ci lega a Windows.
La soluzione quì presentata consiste nell'inserire TUTTO il root-filesystem in un singolo bigfile che sarà verrà creato in windows. Il kernel 2.6 ha un supporto del filesystem ntfs che non consente la creazione o eliminazione di file (se ben ricordo tale supporto era presente nel kernel 2.4 ma ne era caldamente sconsigliato l'utilizzo in quanto non era considerabile stabile). Il kernel 2.6, tuttavia, ha un supporto stabile che consente di modificare il contenuto del singolo file a patto di non cambiarne la dimensione. In questo modo trattiamo il nostro rootfs pari ad una partizione (alla quale non cambi la dimensione mentre ci scrivi dentro). Da un po' di tempo esiste anche il progetto ntfs-3g che consente di montare un fs ntfs in lettura/scrittura con supporto totale, e il progetto Linux NTFS, ma entrambi necessitano un sistema running, mentre il supporto ntfs del kernel 2.6 l'abbiamo appunto inside nel kernel e quindi disponibile dal boot.
Per fare questa installazione dovremo fare i seguenti passi:
Facoltativamente possiamo
C:> cd \ C:> mkdir LINUX C:> cd LINUX C:> mkdir boot C:> fsutil file createnew rootlinux.img 1000000000
Il file C:\LINUX\rootlinux.img da 1GB è stato creato
C:> dir 17/10/2007 11.06 1.000.000.000 rootlinux.img
# mkdir /xp # mount /dev/hda1 /xp # dmesg|tail
potrebbero capitare errori tipo:
NTFS-fs error (device hda1): load_system_files(): Volume has unsupported flags set. Mounting read-only. Run chkdsk and mount in Windows.
il che vuol dire che Windows non è stato chiuso correttamente. Abbiamo necessità di riavviare il sistema in windows. Dovrebbe partire il chkdsk in automatico; se non parte diamo il comando:
C:> chkdsk C: /f /l /x
quindi riavviamo. Dopo aver fatto il check dovremo comunque fa ripartire Windows. Dopo aver pulito facciamo ripartire l'installazione di Slackware
# mkdir /xp # mount /dev/hda1 /xp # dmesg|tail NTFS volume version 3.1.
# losetup /dev/loop0 /xp/LINUX/rootlinux.img # mke2fs -j /dev/loop0 # mount /dev/loop0 /mnt # setup
Partirà l'installer che tanto conosciamo, ma con qualche errore (non ci sono partizioni di linux)...
NO LINUX PARTITION FOUND (ignoriamo il messaggio)
continuiamo con la configurazione normale; al TARGET non ci chiederà per il rootfs ma solo per l'NTFS (che trova). Ricordiamo di NON configurarla; lo faremo a mano a posteriori. All'INSTALL avremo un
CANNOT INSTALL SOFTWARE YET
non gli abbiamo detto dove installare. Dovremo ingannarlo facendogli credere che l'abbiamo specificato. Premiamo ALT+F2
# touch /tmp/SeTnative
ALT+F1 e riscegliamo INSTALL. Alla conf. di lilo scegliamo SIMPLE e ROOT come device. Ovviamente fallirà, però almeno ci ha creato un lilo.conf di base.
# chroot /mnt
modofichiamo l'initrd per montare il rootfs come loop-device
$ cd /usr/share/mkinitrd $ mkdir initrd $ cd initrd $ tar zxf ../initrd-tree.tar.gz $ vi init
cercare "# Switch to real root partition:" e aggiungere
mount -t ntfs /dev/hda1 /xp LOOPIMAGE=$(cat /proc/cmdline|sed 's/.*rootimage=\([^ ]*\).*$/\1/') losetup $ROOTDEV /xp/$LOOPIMAGE
sia in fondo, sia prima di "exit 1" aggiungere, per debug:
/bin/sh
e salviamo. Poi
$ mkdir xp $ cp /sbin/losetup bin/ $ cp /lib/ld-linux.so.2 /lib/libc.so.6 lib/ $ mknod dev/loop0 b 7 0 $ mknod dev/hda b 3 0 $ mknod dev/hda1 b 3 1 $ mv ../initrd-tree.tar.gz ../initrd-tree.tar.gz-orig $ tar czf ../initrd-tree.tar.gz .
configuriamo lilo
$ cd /etc
$ vi lilo.conf
boot = ?????????? (vedi sotto in 'Scelta posizione per il bootloader')
prompt
timeout = 1200
change-rules
reset
vga = normal
image = /boot/vmlinuz
label = linux
root = /dev/loop0
read-only
initrd=/boot/initrd.gz
append = "rootimage=/LINUX/rootlinux.img"
$ exit
Per questa operazione avremo bisogno di accedere in read-write al filesystem ntfs, quindi avremo bisogno di ntfs-3g. Io ho fatto con una Knoppix, ma è possibile farlo con una qualsiasi altra distribuzione live (ormai l'ntfs-3g ce l'hanno tutte, o quasi)
knoppix 2 lang=it
e montiamo i filesystem
# mkdir /xp # mkdir /slak # mount -t ntfs-3g /dev/hda /xp
potrebbe capitare
Volume is scheduled for check. Please boot into Windows TWICE, or use the 'force' mount option.
nessun problema, possiamo forzarlo tranquillamente senza problemi
# mount -t ntfs-3g -o force /dev/hda1 /xp # mount -o loop /xp/LINUX/rootlinux.img /slak
Aggiungiamo il rootfs in fstab (non l'abbiamo messo in fase di installazione)
# vi /slak/etc/fstab /dev/loop0 / ext3 defaults 1 0
Configuriamo il bootloader
# mkdir /xp/LINUX/boot # rm /boot # ln -s /slak/boot / # chroot /slak $ cd /boot $ mkinitrd -c -f ext2 -r /dev/loop0 $ exit
Ora dovremo installare il bootloader. Prima abbiamo lasciato in sospeso la riga "boot=" di lilo.conf, perchè ancora dobbiamo scegliere la posizione dove sistemare il bootloader.
Se stiamo eseguendo tutta la procedura per non perdere la garanzia del nostro portatile, allora abbandoniamo subito l'idea di poterlo mettere nell'mbr.
Se invece non abbiamo una garanzia da salvaguardare, l'mbr è la scelta migliore dove piazzare un lilo. In tal caso dovremo modificare lilo.conf settando la riga boot= e aggiungendo una sezione per il boot di Windows
# vi /slak/etc/lilo.conf
boot = /dev/hda
...
other = /dev/hda1
label=windows
Se abbiamo il problema della garanzia, una scelta facile è quella dell'antico e sottovalutato, ma ancora utile, Floppy.
Prendiamo un floppy (ammesso che ne abbiamo ancora uno in casa) ed inseriamolo. Quindi settiamo il lilo.conf
# vi /slak/etc/lilo.conf boot = /dev/fd0
Se abbiamo il problema della garanzia per un portatile, però, è molto probabile (al 99,9999%) che questo non possieda un floppy. Allora possiamo ripiegare su una pendrive.
Inseriamo la pendrive e controlliamo come la vede il sistema.
# dmesg|tail
probabilmente vedremo sda o sda+sda1. Per entrambi i casi
# vi /slak/etc/lilo.conf boot = /dev/sda
Se la nostra macchina non fa il boot da pendrive, la nostra scelta ricade su un cdrom (magari un minicd). Non descrivo quì la procedura per farlo, ma potete prendere il dvd di slackware come modello da cui partire.
L'idea originale che mi ha spinto a scrivere questo tutorial è partita proprio da quì.
Se, ancora, siamo nella condizione di dover rispettare una garanzia, ma non vogliamo portarci dietro floppy, dischi o pendrive, possiamo aggiungere linux al bootloader di Windows. In questo modo quando questo partirà ci chiederà quale sistema lanciare. Quando sceglieremo Linux, NTLDR (il bootloader di windows) caricherà il nostro lilo.
Ecco cosa faremo: creeremo un file bootsect.b che conterrà quello che dovrebbe contenere il boot-record di un disco/floppy/pendrive. Configureremo windows (file C:\boot.ini) per caricare questo file, il quale richiamerà lilo nel classico modo. In fondo abbiamo l'intera root in un file, perchè non metterci pure il bootsector?
Modifichiamo il boot.ini
# vi /xp/boot.ini C:\bootsect.b="Linux"
Creiamo il boot sector file
# dd if=/dev/zero of=/xp/bootsect.b count=1
e mettiamo il lilo
# vi /slak/etc/lilo.conf boot=/xp/bootsect.b
Indipendentemante da dove abbiamo scelto di mettere lilo, ora lo installiamo
# cp /slak/boot/{vmlinuz,initrd.gz} /boot
# lilo -C /slak/etc/lilo.conf
Added linux *
# umount /slak # umount /xp # reboot
L'installazione è terminata. Mi ci sono volute prove su prove ed esperimenti su esperimenti per concepire questa procedura, ma ora dovrebbe funzionare, e se avete seguito scrupolosamente le istruzioni dovrebbe partire; al massimo potrebbe essere necessario qualche chkdsk da windows. Se non avete eseguito il chkdsk darà un warning nell'initrd e dei fatal durante il tentativo di fsck (v. sotto)
Ma se avete scelto di posizionare il bootloader sull'ntfs, si presenterà con alta probabilità un problema che non avevo tenuto in considerazione prima di iniziare lo sviluppo.
Da quello che ho capito, windows non fa come linux che prima apre il filesystem il sola lettura e dopo in scrittura. Lui lo apre subito in read-write sin da quando deve anche solo leggere il boot.ini. Questo implica che il fs sarà flaggato come 'mounted', e quando il controllo passa a lilo questo flag non sarà resettato.
Durante il boot, nell'initrd al momento del mount /xp, comparirà
NTFS-fs error (device hda1): load_system_files(): Volume has unsupported flags set. Mounting read-only. Run chkdsk and mount in Windows.
e verrà montato in read-only.
Anche se rebooto in windows, quando ricarico lilo la situazione si ripete (fortunatamente questo stato non corrompe il filesystem e il suo contenuto).
Il filesystem è ora in readonly, ma comunque montato, quindi sarà possibile montare correttamente /dev/loop0 in readonly (come ext2), e parte, ma quando rc.S arriva al momento dell'fsck, questo non si aspetta di avere sotto un altro filesystem sotto a /dev/loop0, e visto che è readonly non riuscità ad aprire la root in readwrite, tanto più che è journaled (è ext3). Comincerà a dare montagne di errori e saremo costretti a resettare il computer.
A questo non ho ancora trovato la soluzione. Sto cercando un work-around. Se qualcuno ha idee sono felice di ascoltarle.
Il tutorial non è ancora terminato. I prossimi passi, dopo la correzione di questo bug, saranno: