File systems (Italiano)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Da Wikipedia:

Un file system (in acronimo FS), in informatica, indica informalmente un meccanismo con il quale i file sono posizionati e organizzati su dispositivi informatici utilizzati per l'archiviazione dei dati ad esempio unità di memoria di massa (come unità a nastro magnetico, dischi rigidi, dischi ottici, unità di memoria a stato solido - o in casi particolari anche nella RAM) o su dispositivi remoti tramite protocolli di rete.

Ogni singola partizione del disco può essere configurata utilizzando uno dei tanti file system disponibili. Ognuno ha i propri vantaggi, svantaggi, e idiosincrasie uniche. Segue una breve panoramica dei filesystem supportati, i link puntano alle pagine di wikipedia che forniscono molte più informazioni:

Prima di essere formattato, un disco deve essere partizionato.

Tipi di filesystem

Vedere filesystems(5) per una carrellata generale e l'articolo Comparazione tra file system per una comparativa dettagliata.

File system in-tree e FUSE
File system Comando per creazione Utility userspace Archiso [1] Documentazione kernel[2] Note
Btrfs mkfs.btrfs(8) btrfs-progs Si btrfs.html Stato stabilità
VFAT mkfs.fat(8) dosfstools Si vfat.html File system Windows 9x
exFAT mkfs.exfat(8) exfatprogs No File system nativi in Linux 5.4. [3]
mkexfatfs(8) exfat-utils Si N/A (FUSE-based)
F2FS mkfs.f2fs(8) f2fs-tools Si f2fs.html Device basati su flash
ext3 mke2fs(8) e2fsprogs Si ext3.html
ext4 mke2fs(8) e2fsprogs Si ext4.html
HFS (File system gerarchici) mkfs.hfsplus(8) hfsprogsAUR No hfs.html File system Classic Mac OS
HFS+ mkfs.hfsplus(8) hfsprogsAUR No hfsplus.html File system macOS (8–10.12)
JFS mkfs.jfs(8) jfsutils Si jfs.html
NILFS2 mkfs.nilfs2(8) nilfs-utils Si nilfs2.html
NTFS mkfs.ntfs(8) ntfs-3g Si N/A (FUSE-based) File system Windows NT
ReiserFS mkfs.reiserfs(8) reiserfsprogs Si
UDF mkfs.udf(8) udftools Opzionale udf.html
XFS mkfs.xfs(8) xfsprogs Si

xfs.html
xfs-delayed-logging-design.html
xfs-self-describing-metadata.html

Nota: Il kernel ha il proprio drivern NTFS (vedere ntfs.html), ma ha un supporto limitato per la scrittura dei file.
Filesystem out-of-tree
File system Comando di creazione Patchset del kernel Utility userspace Note
APFS mkapfs(8) linux-apfs-dkms-gitAUR[broken link: package not found] apfsprogs-gitAUR macOS (10.13 and newer) file system. Read only, experimental.
Bcachefs bcachefs(8) linux-bcachefs-gitAUR bcachefs-tools-gitAUR
Reiser4 mkfs.reiser4(8) reiser4progsAUR
ZFS zfs-linuxAUR, zfs-dkmsAUR zfs-utilsAUR Esiste un suo porting: OpenZFS

Journaling

Tutti i filesytem citati sopra, con le eccezioni di exFAT, FAT16/32, Reiser4 (opzionale), Btrfs e ZFS, usano il journaling. Questo, loggando i cambiamenti prima che siano scritti effettivamente su filesystem, garantisce la fault-resilience. In caso di un crash di sistema o della mancanza improvvisa di corrente elettrice, questo tipo di filesystem sono più veloci a tornare online e si corrompono con meno facilità. Il logging viene salvato in un'area dedicata del filesystem.

Non tutte le tecniche di journaling sono uguali: ext3 e ext4 usano il journaling data-mode, il quale logga sia i dati che i metadati, ma può eventualmente loggare solo i metadati. Il journaling data-mode comporta una perdita di velocità e non è attivo di default. Allo stesso modo Reiser4 offre i cosiddetti "transaction models" che modificano sis le features che fornisce e pure il journaling. Usa una diversa tecnica di journaling, un modello speciale chiamato wandering logs che elimina la necessità di scrivere su disco due volte, write-anywhere un puro approccio copy-on-write (pressoché equivalente a quello di default di btrfs, ma con una differenza sostanziale nel design dell'"albero") e un approccio combinato chiamato ibrido, che si alterna euristicamente con i due precedenti.

Nota: Reiser4 fornisce un comportamento molto simile a quello del journaling di default di ext4 (meta-data only) con l'uso del plugin node41 che presenta anche metadati e checksum on-line, opzionalmente combinati con il comportamento dei wandering logs che fornisce a seconda del transaction model scelto al momento del mount.

Gli altri filesystem utilizzano un journaling ordered-mode, il quale logga solo i metadati: tutti i filesystem sono in grado di tornare online in uno stato consistente dopo un crash, ma il journaling data-mode fornisce una migliore protezione contro la corruzione e la perdita dei dati. Tuttavia con il journaling data-mode si ha una perdita di prestazioni perché vendono eseguite due operazioni di scrittura, una sul journal e una sul disco (cosa che viene evitata da Reiser4 con il "wandering logs"). Quando si sceglie un filesystem bisogna tener conto del compromesso tra prestazioni e integrità dei dati. Reiser4 è l'unico filesystem opera con piena atomicità e fornisce i checksum sia per i metadati che per i dati (un'operazione può verificarsi o non verificarsi e avvengono corruzioni di dati a causa di operazioni che si verificano a metà), per cui è molto meno incline alla perdita di dati rispetto ad altri file system come Btrfs.

I filesystem basati sul copy-on-write (conosciuto anche come write-anywhere), come as Reiser4, Btrfs and ZFS, non hanno bisogno di utilizzare il classico journal per proteggere i metadati, perché non vengono mai fatti update. Sebbenbe Btrfs un albero di log simile a un journal, viene utilizzato solo per velocizzare le operazioni di fdatasync e fsync.

Filesystem basati su FUSE

Vedere FUSE.

Filesystem stackable

  • overlayfs — OverlayFS è uin servizio filesystem per Linux che implementa un mount union per altri filesystem.
https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html || linux
  • Unionfs — Unionfs è un servizio filesystem per Linux, FreeBSD and NetBSD che implementa un mount union per altri filesystem.
https://unionfs.filesystems.org/ || not packaged? search in AUR
  • aufs — Advanced Multi-layered Unification Filesystem, un filesystem union basato su FUSE, riscrittura completa di Unionfs, non è stato inserito nella mainline del kernel Linux come invece è stato fatto con OverlayFS.
http://aufs.sourceforge.net || linux-aufsAUR
  • eCryptfs — The Enterprise Cryptographic Filesystem è un insieme di software per la cifratura dei dischi per Linux. Implementato come un layer di cifratura di a livello di filestyem conforme a POSIX, con l'obiettivo di offrire funzionalità simili a quelle di GnuPG a livello di sistema operativo.
https://ecryptfs.org || ecryptfs-utils
  • mergerfs — un filesystem union basato su FUSE.
https://github.com/trapexit/mergerfs || mergerfsAUR
  • mhddfs — Filesystem FUSE Multi-HDD, un filesystem union basato su FUSE.
http://mhddfs.uvw.ru || mhddfsAUR
  • unionfs-fuse — Un'implementazione di Unionfs a livello userspace.
https://github.com/rpodgorny/unionfs-fuse || unionfs-fuse

File systems sola lettura

  • EROFS — Enhanced Read-Only File System è un filesystem di sola lattura leggero, ha lo scopo di migliorare le prestazioni e avere storage con compressione.
https://www.kernel.org/doc/html/latest/filesystems/erofs.html || erofs-utils
  • SquashFS — SquashFS è un filesystem in sola lettura compresso. SquashFS comprime i file, inode e cartelle, e supporta blocchi fino a 1MB per una migliore compressione.
http://squashfs.sourceforge.net/ || squashfs-tools

Filesystem clustered

  • Ceph — Systema di archiviazion unificato e distribuito progettato per avere prestazioni eccellenti, affidabilità e scalabilità.
https://ceph.com/ || ceph
  • Glusterfs — Filesyste cluster capace di scalare fino a diversi petabyte.
https://www.gluster.org/ || glusterfs
  • IPFS — Un protocollo hypermedia peer-to-peer per rendere il web più veloce, più sicuro, e più aperto. IPFS ha lo scopo di rimpiazzare HTTP e costruire un web migliore per tutti nois. Usea blocchi per archiviare parti di un file, ogni nodo di rete archivia solo il contenuto di interesse, esegue deduplica e distribuzione. (attualmente è in fase alpha)
https://ipfs.io/ || go-ipfs
  • MooseFS — MooseFS è un filestyem fault tolerant, ad alta disponibilità e a elevate prestazioni di scalabilità distribuito sulla rete.
https://moosefs.com || moosefs
  • OpenAFS — Implementazione opensource del filesystem distribuito AFS
https://www.openafs.org || openafsAUR
  • OrangeFS — OrangeFS è un filestyem di rete scalabile progettato per l'accesso parallelo e trasparente a storage multi-server. Ha il supporto a MPI-IO ottimizzato per applicazioni parallele e distribuite. Semplifica l'utilizzo di storage parallelo non solo per i client Linux, ma anche per Windows, Hadoop, and WebDAV, e compatibile con POSIX ed è parte del kernel Linux dalla versione 4.6.
https://www.orangefs.org/ || not packaged? search in AUR
  • Sheepdog — Un sistema di archiviazione a oggetti distribuito per servizi a divolume e container, gestisce dischi e nodi in maniera intelligente.
https://sheepdog.github.io/sheepdog/ || sheepdogAUR
https://tahoe-lafs.org/ || tahoe-lafsAUR

Identificare i filesystem esistenti

Per identificare i filesystem esistenti si può usare lsblk:

$ lsblk -f
NAME   FSTYPE LABEL     UUID                                 MOUNTPOINT
sdb                                                          
└─sdb1 vfat   Transcend 4A3C-A9E9

Se è predente un filestyem sarà mostrato nella colonna FSTYPE. Se è già montato, apparirà nella colonna MOUNTPOINT.

Creare un filesystem

I filesystem generalmente vengono creati su una Partizione, all'interno di un container logico come LVM, RAID e dm-crypt, o su un file (vedere Wikipedia:it:Loop device). Questa sezione descrive come creare un filestyem su una partizione.

Nota: Un filesystem può essere scritto direttamente su un disco, conosciuto comes a superfloppy o disco senza partizioni. L'utilizzo di questo metodo comporta delle limitazioni, in particolare se il boot viene eseguito da un drive di questo tipo. Vedere Btrfs#Partitionless Btrfs disk per esempio.
Attenzione:
  • Dopo la creazione di un nuovo filesystem, è improbabile che i dati precedentemente presenti sulla partizione interessata possano essere recuperati. Creare un backup di tutti i dati che si vogliono mantenere.
  • L'utilizzo che si farà di una partizione può restringere il ventaglio dei filestyem che si possono scegliere. Per esempio, una partizione di sitema EFI può contenere un filestyem FAT32, e il filesystem che conterrà la cartella /boot deve essere supportato dal boot loader.

Prima di continuare, bisogna identificare il dispositivo dove verrà creato il filesystem and vedere se è montato o meno. Per esempio:

$ lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda
├─sda1                      C4DA-2C4D                            
├─sda2 ext4                 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 /mnt
└─sda3                      56adc99b-a61e-46af-aab7-a6d07e504652 

I filesystem montati devono essere smontati prima di procedere. Nell'esempio sopra un filestyem ext4 è presente sulla partizion /dev/sda2 ed è mountato su /mnt. Si dovrebbe smontarlo con:

# umount /dev/sda2

Per trovare solo i filestyem montati, vedere #Lista dei filesystem montati.

Pre creare un nuovo filestyem, usare mkfs(8). Vedere #Tipi di filesystem per travare quello giusto, così come le utility userspace da installare per un particolare filesystem.

Per esempio, per creare un nuovo filesystem di tipo ext4 (abituale per le partizioni dati Linux) su /dev/sda1, eseguire:

# mkfs.ext4 /dev/sda1
Suggerimento:
  • Utilizzare il flag -L di mkfs.ext4 per specificare un'etichetta di filesystem. e2label può essere usato per cambiare l'etichetta di un filesystem esistente.
  • I filesystem possono essere ridimensionati dopo la creazione, con alcune limitazioni. Per esempio, la dimensione di un filesystem XFS può essere aumentata, ma non diminuita. Vedere Wikipedia:Comparison of file systems#Resize capabilities e la documentazione dello specifico filesystem per i dettagli.

Il nuovo filestyem ora può essere montato in nella cartella che si preferisce.

Montare un filesystem

Per montare manualmente un filesystem collocato su un dispositivi (es., una partizione) su una cartella, usare mount(8). Questo esempio mounta /dev/sda1 su /mnt.

# mount /dev/sda1 /mnt

Questo comando collega il filesystem su /dev/sda1 alla cartella /mnt, rendendone visibile il contenuto. Tutti i dati precedentemente esistenti sulla cartella /mnt prima del comando saranno invisibili fino a quando il filesystem sarà montato.

fstab contiene le informazioni su come i dispositivi dovrebbero essere montati automaticamente se presenti. Vedere l'articolo fstab per maggiori informazioni su come modificare questo comportamento.

Se un dispositivo è specificato all'interno di /etc/fstab e si passa al comnado mount solo il dispositivo o il punto di mount, questa informazione verrà utilizzata per il mount. Per esempio, se /etc/fstab contenesse una linea che indica che /dev/sda1 deve essere montato su /mnt, il comando seguente monterà automaticamente il dispositivo su quella cartella:

# mount /dev/sda1

o

# mount /mnt

mount contiene diverse opzioni, che dipendono dallo specifico filestyem. Le opzioni posso essere cambiate nei seguenti modi:

Consultare questi articoli e l'articolo inerente al filestyem di interesse per maggiori informazioni.

Suggerimento: I filestyem si possono montare anche con systemd-mount al posto di mount. Se il punto di mount non è specificato, il filesystem sarà mountato su /run/media/system/device_identifier/. Ciò permette di montare facilmente un filesystem senza bisogno di decidere dove. Vedere systemd-mount(1) per il suo utilizzo e per maggior dettagli.

Lista dei filesystem montati

Per visualizzare la lista di tutti i filesystems montati, usare findmnt(8):

$ findmnt

findmnt prende in ingresso tutta una serie di argomenti per filtrare l'output o per mostrare informazioni aggiuntive. Per esempio, si può passare come argomento un dispositivo o un punto di mount per visualizzare solo l'informazione che è specificata:

$ findmnt /dev/sda1

findmnt raccoglie le informazioni da /etc/fstab, /etc/mtab, e /proc/self/mounts.

Smontare un filesystem

Per smontare un filesyste usare umount(8). Si può specificare sia il dispositivo che lo contiene (es., /dev/sda1) o il punto di mount (es., /mnt):

# umount /dev/sda1

o

# umount /mnt

Approfondimenti