创建或检查文件系统(mkfs和fsck)

Last Updated: 2023-09-06 03:11:03 Wednesday

-- TOC --

创建文件系统,其实就是我们常说的(高级)格式化,formatting!只有创建了文件系统的分区,才具备了保存数据的能力。

Linux下有好些个mkfs命令,分别用来创建不同的文件系统:

$ sudo ls -l /usr/sbin/mkfs*
-rwxr-xr-x. 1 root root  16296 Jun  1  2022 /usr/sbin/mkfs
-rwxr-xr-x. 1 root root 576768 Mar 26 08:51 /usr/sbin/mkfs.btrfs
-rwxr-xr-x. 1 root root  36992 Jun  1  2022 /usr/sbin/mkfs.cramfs
-rwxr-xr-x. 1 root root  36872 Oct 28  2022 /usr/sbin/mkfs.exfat
-rwxr-xr-x. 4 root root 136896 Jan 20  2022 /usr/sbin/mkfs.ext2
-rwxr-xr-x. 4 root root 136896 Jan 20  2022 /usr/sbin/mkfs.ext3
-rwxr-xr-x. 4 root root 136896 Jan 20  2022 /usr/sbin/mkfs.ext4
-rwxr-xr-x. 1 root root  53832 Jan 20  2022 /usr/sbin/mkfs.fat
-rwxr-xr-x. 1 root root  37824 Jan 20  2022 /usr/sbin/mkfs.hfsplus
-rwxr-xr-x. 1 root root  45344 Jun  1  2022 /usr/sbin/mkfs.minix
lrwxrwxrwx. 1 root root      8 Jan 20  2022 /usr/sbin/mkfs.msdos -> mkfs.fat
lrwxrwxrwx. 1 root root     16 Nov 15  2022 /usr/sbin/mkfs.ntfs -> /usr/sbin/mkntfs
lrwxrwxrwx. 1 root root      8 Jan 20  2022 /usr/sbin/mkfs.vfat -> mkfs.fat
-rwxr-xr-x. 1 root root 404232 Jan 22  2022 /usr/sbin/mkfs.xfs

mkfs命令

mkfs命令只是个前端,它根据-t参数指定类型,调用下面更具体的命令。

mkfs.fat

FAT32格式兼容性很好,但不支持超过4G的大文件。

mkfs.fat与mkfs.dos,mkfs.vfat,这三个命令是一样的。

看到有些命令显示文件系统类型为vfat(可能various fat,各种fat),版本列会显示FAT32。Qemu下还有个vvfat,应该是指virtual vfat

$ sudo mkfs.fat -s8 -F32 -v /dev/sdd1
mkfs.fat 4.2 (2021-01-31)
/dev/sdd1 has 64 heads and 32 sectors per track,
hidden sectors 0x0800;
logical sector size is 512,
using 0xf8 media descriptor, with 60084224 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 8 sectors per cluster.
FAT size is 58568 sectors, and provides 7495882 clusters.
There are 32 reserved sectors.
Volume ID is ff52bb9e, no volume label.

-s8,指定每个cluster的大小为8扇区,8*512=4KB,4K对齐。如不指定此参数,mkfs.fat有可能使用32。

-F32,指定使用FAT32文件系统,如果不指定,对于容量小的分区,mkfs.fat有可能使用FAT12或16。

-h,设置所谓的hidden sector数量,默认是2048,即FAT表前的扇区数。(也可称为reserved sector,hidden sector还指硬盘初始到分区初始的这一段)

-f,设置FAT表数量,默认2。

-b,设置backup boot sector的位置,默认是6,info sector的备份扇区就是7。

-v,verbose

Github.com上有mkfs.fat项目源码!

mkfs.exfat

-b,设置FAT表和cluster heap开始地址的boundary,这个参数有点专业,建议默认。

-c,设置cluster size,power of 2。默认值挺大的。

-f,full format,在创建exFAT文件系统前将整个分区清0。

-L,这是volume label,默认为空。

-v,verbose

mke2fs

这个命令是mkfs.ext2mkfs.ext3mkfs.ext4的后台。

If mke2fs is run as mkfs.XXX (i.e., mkfs.ext2, mkfs.ext3, or mkfs.ext4) the option -t XXX is implied; so mkfs.ext3 will create a file system for use with ext3, mkfs.ext4 will create a file system for use with ext4, and so on.

-b,指定block size in bytes。最小1KiB,2的幂次,默认一般就是4KiB。

-I,指定inode size,最小128Bytes,建议256Bytes。

File systems with an inode size of 128 bytes do not support timestamps beyond January 19, 2038. Inodes which are 256 bytes or larger will support extended timestamps, project id's, and the ability to store some extended attributes in the inode table for improved performance.

-L,指定Volume Label,最长16字节。

将文件虚拟为硬盘(分区)

在Linux中,可以把一个普通文件当做一个虚拟硬盘分区来使用,对其进行formatting操作,mount之后,可在其中进行各种文件操作。

先用dd命令创建一个大文件来作为虚拟分区:

$ dd if=/dev/zero of=mpart.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.37448 s, 781 MB/s

然后格式化和挂载:

$ mkfs.ext4 mpart.img
$ sudo mkdir -p /mnt/loop
$ sudo mount mpart.img /mnt/loop

这个过程不需要使用losetup命令,系统自动创建一个loop device。这个过程将文件当做一块分区,而不是整个硬盘。如果希望将文件虚拟为整个硬盘,对其进行任意分区和格式化,情况稍微复杂一点点:

# 创建文件,并按照分区硬盘的方式,对其进行分区。
# 假设我们只分了一个区,MBR风格。
$ dd if=/dev/zero of=./disk.img bs=1M count=1024
$ sudo fdisk disk.img
$ printf "o\nn\np\n1\n\n\nw\n" | sudo fdisk disk.img

# 通过losetup命令,先找出一个可用的device path,/dev/loop0。
# 然后将disk.img文件与/dev/loop0绑定。
# 必须要使用-P参数,这样可以得到/dev/loop0p1,
# 对应虚拟硬盘里面的那个分区。
$ losetup -f
/dev/loop0
$ sudo losetup -P /dev/loop0 disk.img

# 有了/dev/loop0p1,我们就可以直接对这块虚拟硬盘内的一个
# 分区进行格式化。
$ sudo mkfs.fat -s8 -F32 /dev/loop0p1

# 然后想干什么就干什么.....

# 查看loop设备绑定关系
$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE         DIO LOG-SEC
/dev/loop0         0      0         1  0 /root/disk.img   0     512

# 解除绑定
$ sudo losetup -d /dev/loop0
$ sudo losetup -D  # unbind all loop devices

能mount的是分区,不是整块硬盘!

已经mount的loop分区,在解除绑定后还存在,需要正常执行umount操作。如果先umount,那个/dev/loop0的绑定也没有了(可能是因为只有一块分区mount)。如果绑定时,不带-P参数,此时能看到/dev/loop0设备,但是/dev下没有分区,依然可以将/dev/loop0当做一整块没有mount分区的硬盘。

个人体验:直接查看/dev/loop*是不准的,需要使用losetup -f

fsck命令

检查并修复文件系统,这个命令与mkfs相互,也是一个壳:

$ ll /usr/sbin/fsck*
-rwxr-xr-x. 1 root root  45K Jun  1  2022 /usr/sbin/fsck
-rwxr-xr-x. 1 root root 1.2K Mar 26 02:41 /usr/sbin/fsck.btrfs
-rwxr-xr-x. 1 root root  33K Jun  1  2022 /usr/sbin/fsck.cramfs
-rwxr-xr-x. 1 root root  58K Oct 28  2022 /usr/sbin/fsck.exfat
-rwxr-xr-x. 4 root root 362K Jan 20  2022 /usr/sbin/fsck.ext2
-rwxr-xr-x. 4 root root 362K Jan 20  2022 /usr/sbin/fsck.ext3
-rwxr-xr-x. 4 root root 362K Jan 20  2022 /usr/sbin/fsck.ext4
-rwxr-xr-x. 1 root root  85K Jan 20  2022 /usr/sbin/fsck.fat
lrwxrwxrwx. 1 root root   12 Jan 20  2022 /usr/sbin/fsck.hfs -> fsck.hfsplus
-rwxr-xr-x. 1 root root 280K Jan 20  2022 /usr/sbin/fsck.hfsplus
-rwxr-xr-x. 1 root root  57K Jun  1  2022 /usr/sbin/fsck.minix
lrwxrwxrwx. 1 root root    8 Jan 20  2022 /usr/sbin/fsck.msdos -> fsck.fat
lrwxrwxrwx. 1 root root   13 Nov 15  2022 /usr/sbin/fsck.ntfs -> ../bin/ntfsck
lrwxrwxrwx. 1 root root    8 Jan 20  2022 /usr/sbin/fsck.vfat -> fsck.fat
-rwxr-xr-x. 1 root root 2.0K Jan 22  2022 /usr/sbin/fsck.xfs

数据无价,根据网友提供的经验,当有重要数据的分区出现数据错误后,千万不要随便使用fsck修复,先用dd备份所有数据。fsck的自动修复不是万能,先查清楚问题做好备份再行动。

本文链接:https://cs.pynote.net/hd/hdisk/202112312/

-- EOF --

-- MORE --