Una delle differenze che colpiscono subito chi si trova a usare per la prima volta uno Unix provenendo da sistemi operativi di casa Microsoft è senz'altro il diverso approccio che si ha con i filesystem e con tutti i dispositivi di memorizzazione (hard disk, cdrom, floppy, ecc).
Nello stesso albero delle directory di Linux (e più in generale di tutti gli Unix) i file sono disposti e ordinati in base alla loro funzione (in /boot vi sono i file necessari per il boot, in /home le directory personali dei vari utenti, in /etc i file di configurazione, in /usr i file relativi ai programmi, ecc.). In questo modo ogni supporto non viene visto come un'unità a sé stante (come gli identificativi di unità di Windows), ma si integra col preesistente albero delle directory. E così troveremo per esempio i file contenuti nel floppy in /mnt/floppy, nel cdrom in /mnt/cdrom.
Ma come poter accedere a queste risorse? Lo strumento che ci viene incontro e ci permette di "agganciare" i contenuti di un dispositivo in una directory già esistente di Linux (di solito /mnt) è mount.
I Filesystem in Linux
Linux, al contrario di molti altri OS, è in grado di gestire tutti i tipi di filesystem più comuni, dalla tradizionale FAT di Windows 9x a NTFS di Windows NT, dalle partizioni BSD a quella di Solaris, ecc. Affinché siano utilizzabili da Linux, però, è necessario che il kernel sia compilato con il supporto per il tipo di fs che vorremo montare (traduzione dell'inglese to mount cioè montare, posizionare). Un kernel standard presente nelle distribuzioni in genere ha già compilato il supporto per i filesystem più utilizzati. Per maggiori dettagli riguardo alla moltitudine di partizioni che sono supportati dal Pinguino fate riferimento alla sezione "File Systems" del menu per la compilazione del kernel e alla directory /usr/src/linux/fs.
A questo punto non ci rimane altro che cercare di far riconoscere a mount quello che abbiamo sui nostri dischi (per esempio la partizione di un altro OS installato, o un cdrom), e farglielo montare.
A questo proposito ricordo che tutti i device di Linux sono identificabili tramite una voce nella directory /dev.
Gli hard disk EIDE si indicano con /dev/hdxy dove al posto della x c'è una lettera che indica il canale e se è master o slave (ad esempio /dev/hda indica il Primary Master, /dev/hdd il Secondary Slave), al posto della y c'è un numero che indica la partizione da 1 a 4 per le primarie o estese, da 4 in poi per le logiche (/dev/hda1 indica la prima partizione primaria sul Primary Master, /dev/hda5 la prima partizione logica sul Primary Master, ecc.). Per avere le idee più chiare sulla situazione dei nostri hd può risultarci comodo l'uso del comando dmesg | grep hd. Andiamo a cercare un output del tipo hda: hda1 hda2 hda3 < hda5 hda6 hda7 hda8 hda9 >
dove hda1 hda2 sono partizioni primarie e hda3 una estesa contenente 5 logiche (hda5, hda6, ecc.).
Per quel che riguarda i dispositivi SCSI, gli hard disk vengono indicati da /dev/sdxy, con discorso analogo a xy dei dischi EIDE, mentre i cdrom da /dev/srx dove x è numero.
Floppy disk invece vengono indicati con /dev/fdx, dove x è sempre un numero.
È anche possibile che in fase di installazione siano state impostate le partizioni da montare al boot (per esempio una FAT). Per controllare che partizioni sono montate sulla nostra Linux Box diamo il comando mount senza opzioni:
lnxbox1:~# mount
/dev/hda5 on / type ext2 (rw,errors=remount-ro,errors=remount-ro)
proc on /proc type proc (rw)
/dev/hda2 on /boot type ext2 (rw)
/dev/hda7 on /home type ext2 (rw)
/dev/hda8 on /usr type ext2 (rw)
/dev/hda9 on /var type ext2 (rw)
Come si può vedere sono montate 5 partizioni. A parte proc che è un filesystem virtuale (al suo interno sono contenuti dei file creati dal kernel), le altre sono tutte delle ext2 (partizioni Linux).
Vediamo ora come usare mount per rendere attivi i filesystem che desideriamo.
Usare Linux Mount
La sintassi di mount è semplice:
mount -t tipodifs -o opzione,altraopzione filesystem mountpoint
Se ad esempio volessimo montare un fs di tipo FAT32 presente sulla partizione /dev/hda1 in /mnt/windows scriveremo (da root):
lnxbox1:~# mount /dev/hda1 /mnt/windows
Per "smontare" il nuovo filesystem possiamo usare il comando umount:
lnxbox1:~# umount /dev/hda1
Potendo mettere come parametro o il device o il mount point. È bene precisare che la directory /mnt/windows deve essere già esistente.
In questo caso mount è riuscito a determinare da solo di che filesystem (fs) si tratti. È buona cosa però passare come parametro il tipo di fs tramite l'opzione -t tipo_di_fs (ext2 per una ext2 (Linux), reiserfs per reiserfs (Linux), ext3 per ext3 (Linux), vfat per FAT (Windows 9x), msdos per MS-DOS (DOS), ntfs per NTFS (Windows NT), iso9660 per ISO9660 (CDROM), hpfs per hpfs (OS/2), hfs per HFS (Macintosh), ecc.). Per ulteriori dettagli sulla moltitudine di filesystem supportati dal Pinguino potete consultare l'ottimo Filesystems-HOWTO.
Vi sono alcune opzioni che sono comuni a tutti i fs, altre invece più specifiche. Andiamo ad analizzare quelle più importanti.
Opzioni comuni
Queste opzioni vanno espresse antecedendole con un -o e separandole con una virgola. Vediamo quelle più significative:
- rw Monta il filesystem in lettura e scrittura (Opzione messa di default) - ro Monta il filesystem in sola lettura
- exec Permette l'esecuzione di file
- noexec Non permette l'esecuzione di file
- remount Rimonta un fs (Normalmente utilizzato per cambiare delle opzioni a un filesystem già montato).
Opzioni specifiche di un Filesystem
Per quel che riguarda ext2 (e ext3 che è una sua evoluzione) è da segnalare:
- errors=remount-ro. In caso di errore rimonta il filesystem in sola lettura (in modo da dare l'opportunità di correggere gli errori).A differenza di ext2, l'fs di tipo FAT (comprendente vfat, msdos e umsdos), non dispone di una serie di caratteristiche che permettono di impostare tra le altre cose l'owner, il gruppo e i permessi dei file. Per permettere di impostare questi parametri anche per questo tipo di partizioni ci vengono incontro delle opzioni di mount. Le opzioni che seguono valgono anche per ntfs.
- umask Con umask=valore potremo impostare quali permessi NON attribuire a tutti i file. I permessi vanno indicati nella forma ottale. Ad esempio umask=000 assegnerà a tutti i file i permessi di scrittura, lettura ed esecuzione per tutti gli utenti. Se viene utilizzata questa opzione, l'opzione noexec o exec viene ignorata
- uid Con uid=valore è possibile impostare il proprietario dei file e delle directory. Di default viene impostato l'utente root. - gid Equivalente a uid per quel che riguarda il gruppo (anzicchè il proprietario). Di default viene utilizzato il gruppo con gid=0 (di solito root).
Usi Particolari di mount
Tramite mount è possibile anche accedere da remoto a share di Windows (tramite SAMBA/NetBIOS), oppure controllare il contenuto di un'immagine di un cd.
Per accedere a delle condivisioni sono necessarie tre cose: aver configurato Windows per condividere dei file, aver il supporto per smbfs ed installato smbmount sul vostro Linux (entrambi dovrebbero essere presenti di default). A questo punto se volessimo montare in /mnt/share la condivisione di Windows chiamata "condivisa1" situata sul pc Windows chiamato "pcwin" dovremmo scrivere:
mount -t smbfs -o username=utentewinnt, password=tuapassword //pcwin/condivisa1 /mnt/share
In caso utilizziate Windows 9x o ME, potrete anche togliere l'opzione username. L'opzione password può anche essere omessa, in tal caso verrà richiesta interattivamente. È possibile specificare come opzioni anche gid e uid, con lo stesso significato e sintassi che avevano per le partizioni fat.
Come già accennato mount può essere usato per esplorare il contenuto di un'immagine iso. Può risultare molto utile se abbiamo la necessità di estrarre solo alcuni file da un'immagine di un CD, risparmiandoci la masterizzazzione. Se per esempio volessimo montare l'immagine /home/utente/Mandrake90-inst.iso in /mnt/loop potremmo usare il seguente comando:
mount /home/utente/Mandrake90-inst.iso /mnt/loop -t iso9660 -o loop=/dev/loop0
dove iso9660 è il tipo di filesystem dell'immagine (in questo caso un cd quindi iso9660), se fosse stata l'immagine di un floppy MS-DOS avremmo dovuto sostituire iso9660 con msdos.
FSTAB
È anche possibile impostare quali filesystem il sistema dovrà montare all'avvio del sistema. Per far questo dovremo editare il file /etc/fstab, file che contiene le informazioni dei filesystem presenti sul sistema.
Questa è la sintassi del file fstab:
<file system> <mount point> <tipo di partizione> <opzioni> <dump> <ordine per fsck>
Dove al posto di <file system> dovremo mettere il device della partizione da montare, sostituendo <mount point> con la directory dove verrà innestato il nuovo fs, <tipo di partizione> con il tipo di partizione (ext2, ext3, vfat, iso9660, ecc.), <opzioni> con le opzioni (quelle di mount) che vorremo mettere.
Come <dump>, senza soffermarci troppo nei dettagli, una buona scelta è mettere 0. Il campo <ordine per fsck> indica l'ordine con cui verrà eseguito fsck (per il controllo di settori danneggiati o di filesystem inconsistente) al boot. È bene mettere 1 per il filesystem con / come mount point 2 per le altre partizioni Linux (ext3, ext2 o reiserfs), 0 per tutti gli altri filesystem (partizioni di Windows, floppy, cdrom, ecc).
Ecco alcune opzioni che può essere utile mettere in /etc/fstab sono:
- noauto per non montare il dispositivo (ad esempio un cdrom) al boot ma per rendere immediato il mount con mount /mountpoint oppure mount /dev/device,
- users per permettere a ogni utente di montare o smontare un dispositivo
- user per permettere a ogni utente di montare (ma non smontare) un dispositivo (può smontarlo solo chi lo ha montato)
Infine può risultare comodo mettere come tipo di filesystem per il floppy auto, in tal caso verrà riconosciuto automaticamente.
Per concludere ecco una nuova feature abbastanza curiosa del kernel 2.4. È possibile tramite l'opzione --bind montare un pezzo di un filesystem in un altro punto. Per esempio se eseguiamo il comando:
lnxbox1:~# mount --bind /home/utente /data/nuovadirutente
"sposteremo" (non a livello fisico però) il contenuto della directory /home/utente in /data/nuovadirutente.