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命令只是个前端,它根据-t
参数指定类型,调用下面更具体的命令。
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项目源码!
-b
,设置FAT表和cluster heap开始地址的boundary,这个参数有点专业,建议默认。
-c
,设置cluster size,power of 2。默认值挺大的。
-f
,full format,在创建exFAT文件系统前将整个分区清0。
-L
,这是volume label,默认为空。
-v
,verbose
这个命令是mkfs.ext2
,mkfs.ext3
和mkfs.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
。
检查并修复文件系统,这个命令与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 --