Skip to content

创建文件系统

文件系统控制数据的读写,他类似与编码和解码系统。如果没有文件系统,存储介质中的信息就是 1 0 这样无意义的数据,而文件系统就是让他们有意义。

文件系统允许用户在保存数据时不必关心数据实际保存在硬盘的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上哪个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型

文件系统类型

文件系统有众多的类型,在不同的操作系统和应用下使用的文件系统也有所区别。

  • 磁盘文件系统(disk file system): 传统意义上的文件系统,像 ext btrfs NTFS FAT exFAT 等都是这类系统
  • 光盘(Optical discs): 目前主流的是 ISO 9660 和 UDF(Universal Disk Format)
  • 数据库文件系统(Database file system): 像 SQLite 这样的就是,他是二进制安全的,也就是说在 SQLite 文件复制到不同的文件系统中都是可用的
  • 网络文件系统(Network file system): 目前主流的是 NFS SMB 和 AFS,FTP 和 WebDAV 也算是
  • 其他: 例如 procfs,他在 Linux 的内存映射

文件系统是非常宽泛的,只要是能够存储和访问数据都算是一个文件系统。例如 git 内部就实现了一个小型的文件系统。

文件系统支持库

磁盘文件系统:

文件系统 创建命令 工具 说明
btrfs mkfs.btrfs btrfs-progs 可靠性高
vfat mkfs.fat dosfstools 兼容性非常好,不过有最大 4G 文件限制
exfat mkfs.exfat exfatprogs fat的扩展,支持大于 4G 文件
ext4 mkfs.ext4 e2fsprogs Linux 标准文件系统
NTFS mkfs.ntfs ntfs-3g Windows 的标准文件系统
xfs mkfs.xfs xfsprogs

网络文件系统:

网络文件系统 工具 说明
NFS nfs-common Windows 中由于 utf-8 的问题兼容性不太好
SMB cifs-utils 兼容性比较好的网络文件系统

创建文件系统

使用mkfs命令来创建文件系统,它实际上是一个前端命令,文件系统支持包都会为该命令提供真正可用的后端程序。该命令有两种使用方式:

Bash
mkfs.ext4 /dev/sda1

mkfs -t ext4 /dev/sda1

查看文件系统

可以使用blkid检测所有块设备的文件系统,以及 LABEL 或 UUID 数据:

Bash
yangguodong@debian:~$ sudo blkid
/dev/nvme0n1p3: UUID="afe0602b-2ea5-42be-a705-aec0afa09a93" TYPE="swap" PARTUUID="113563b3-32d4-44c5-a1be-e0130328cf85"
/dev/nvme0n1p1: UUID="CE8B-3F07" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="215779ee-6e43-4de5-87be-ca2765d536e7"
/dev/nvme0n1p4: UUID="ee997c25-faa9-44f8-8f98-374f78013721" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="721b3ced-5d9f-4b9c-8c74-affeb50c5a97"
/dev/nvme0n1p2: UUID="7b0f2541-3a8f-4e50-a970-8943656621af" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4dd72d5c-8dbd-433e-a6d0-670d17e16adf"
/dev/nvme1n1p1: UUID="97d521c1-b5b7-4650-8897-3c304deb8227" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="duckdb" PARTUUID="0be997ae-f5c9-442f-8c27-e504f8e8dd3f"

如果想要获取某一个块设备的信息,可以使用lsblk来实现,使用 lsblk --fs 来查看文件系统预览(比 blkid 直观些):

Bash
(own) yangguodong@debian:~$ sudo lsblk -fs /dev/nvme0n1p4
NAME      FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1p4 ext4   1.0         ee997c25-faa9-44f8-8f98-374f78013721    510G     1% /home
└─nvme0n1

如果不跟设备就是整个系统范围的

还有就是findmnt能够搜索所有已经挂载的文件系统:

Bash
yangguodong@debian:~$ sudo findmnt
TARGET                         SOURCE         FSTYPE    OPTIONS
/                              /dev/nvme0n1p2 ext4      rw,relatime,errors=remount-ro
├─/sys                         sysfs          sysfs     rw,nosuid,nodev,noexec,relatime
 ├─/sys/kernel/security       securityfs     securityf rw,nosuid,nodev,noexec,relatime
 ├─/sys/fs/cgroup             cgroup2        cgroup2   rw,nosuid,nodev,noexec,relatime,nsdelegate,me
 ├─/sys/fs/pstore             pstore         pstore    rw,nosuid,nodev,noexec,relatime
 ├─/sys/firmware/efi/efivars  efivarfs       efivarfs  rw,nosuid,nodev,noexec,relatime
 ├─/sys/fs/bpf                bpf            bpf       rw,nosuid,nodev,noexec,relatime,mode=700
 ├─/sys/kernel/debug          debugfs        debugfs   rw,nosuid,nodev,noexec,relatime
 ├─/sys/kernel/tracing        tracefs        tracefs   rw,nosuid,nodev,noexec,relatime
 ├─/sys/kernel/config         configfs       configfs  rw,nosuid,nodev,noexec,relatime
 └─/sys/fs/fuse/connections   fusectl        fusectl   rw,nosuid,nodev,noexec,relatime
├─/proc                        proc           proc      rw,nosuid,nodev,noexec,relatime
 └─/proc/sys/fs/binfmt_misc   systemd-1      autofs    rw,relatime,fd=29,pgrp=1,timeout=0,minproto=5
   └─/proc/sys/fs/binfmt_misc binfmt_misc    binfmt_mi rw,nosuid,nodev,noexec,relatime
├─/dev                         udev           devtmpfs  rw,nosuid,relatime,size=65887268k,nr_inodes=1
 ├─/dev/pts                   devpts         devpts    rw,nosuid,noexec,relatime,gid=5,mode=620,ptmx
 ├─/dev/shm                   tmpfs          tmpfs     rw,nosuid,nodev,inode64
 ├─/dev/mqueue                mqueue         mqueue    rw,nosuid,nodev,noexec,relatime
 └─/dev/hugepages             hugetlbfs      hugetlbfs rw,relatime,pagesize=2M
├─/run                         tmpfs          tmpfs     rw,nosuid,nodev,noexec,relatime,size=13184200
 ├─/run/lock                  tmpfs          tmpfs     rw,nosuid,nodev,noexec,relatime,size=5120k,in
 ├─/run/credentials/systemd-sysusers.service
                             ramfs          ramfs     ro,nosuid,nodev,noexec,relatime,mode=700
 ├─/run/credentials/systemd-tmpfiles-setup-dev.service
                             ramfs          ramfs     ro,nosuid,nodev,noexec,relatime,mode=700
 ├─/run/rpc_pipefs            sunrpc         rpc_pipef rw,relatime
 ├─/run/credentials/systemd-tmpfiles-setup.service
                             ramfs          ramfs     ro,nosuid,nodev,noexec,relatime,mode=700
 ├─/run/credentials/systemd-sysctl.service
                             ramfs          ramfs     ro,nosuid,nodev,noexec,relatime,mode=700
 └─/run/user/1000             tmpfs          tmpfs     rw,nosuid,nodev,relatime,size=13184200k,nr_in
   ├─/run/user/1000/gnome-remote-desktop/cliprdr-LE69dA
                             /dev/fuse      fuse      rw,nosuid,nodev,relatime,user_id=1000,group_i
   ├─/run/user/1000/gvfs      gvfsd-fuse     fuse.gvfs rw,nosuid,nodev,relatime,user_id=1000,group_i
   └─/run/user/1000/doc       portal         fuse.port rw,nosuid,nodev,relatime,user_id=1000,group_i
├─/home                        /dev/nvme0n1p4 ext4      rw,relatime
├─/boot/efi                    /dev/nvme0n1p1 vfat      rw,relatime,fmask=0077,dmask=0077,codepage=43
└─/mnt                         192.168.1.200:/volume1
                                              nfs4      rw,relatime,vers=4.1,rsize=131072,wsize=13107
  └─/mnt/duckdb-data           192.168.1.200:/volume1/duckdb-data
                                              nfs4      rw,relatime,vers=4.1,rsize=131072,wsize=13107