Repository 32bit  Forum
Repository 64bit  Wiki

Slackware su NTFS

Da Slacky.eu.

Indice

Introduzione

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:

  • Il sistema è un portatile di ultima generazione con Vista: talvolta i produttori ti annullano la garanzia se solo sfiori la tabella delle partizioni
  • Il sistema è un portatile o postazione aziendale: spesso le ditte non vogliono che tu ci installi qualcosa di troppo invasivo
  • Non si desidera fare partizioni (qualcuno ha paura di tutti gli strumenti quali Partition Magic, GParted e compagnia)
  • Si vuole fare una installazione temporanea di prova
  • Altro

Soluzioni

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.

Passi

Per fare questa installazione dovremo fare i seguenti passi:

  • creare il file su cui installare linux (con Windows)
  • installare Slackware dentro quel file (con il cd di Slackware)
  • configurare il sistema per il boot (con il dvd di Slackware)
  • installare il bootloader (con Knoppix)
  • rebootare
  • pregare ;-)

Facoltativamente possiamo

  • Aggiungere la swap
  • Aggiungere altri filesystem

Creazione del rootfile

  • Avviamo Windows e prendiamo una shell (Start -> Esegui -> cmd) poi diamo i seguenti comandi:
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

Installazione

  • Inseriamo il DVD di Slackware e facciamo il boot e montiamo la partizione di Windows
# 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.
  • Prepariamo il rootfilesystem
# 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.

Configurare il sistema per il boot

  • "Entriamo" dentro la nostra nuova installazione e modifichiamo qualche file quà e là
# 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

Preparazione del bootloader

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)

  • avviare con knoppix. Consiglio la modalità testo
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

Scelta della posizione per il bootloader

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.

  • MBR

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
  • Floppy

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
  • Pendrive

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
  • Cdrom

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.

  • Ntfs

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

Installazione del bootloader

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 *

Riavvio

  • Ora riavviamo il sistema
# umount /slak
# umount /xp
# reboot
  • Prima abbiamo forzato il mount, quindi è buono riavviare windows per forzare un check
  • Vi rimando ai vostri vecchi libri di catechismo per la scelta della preghiera da fare.

Fase di Boot

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.


Prossimi Passi

Il tutorial non è ancora terminato. I prossimi passi, dopo la correzione di questo bug, saranno:

  • mettere la swap
  • installare ntfs-3g e ntfsprogs (d'obbligo, visto che abbiamo un ntfs come padre)
  • aggiunta di altri filesystem
Strumenti personali
Namespace

Varianti