![/sbin/mkfs.fs 的行为类似于二进制文件,即使它是符号链接文件](https://linux22.com/image/115798/%2Fsbin%2Fmkfs.fs%20%E7%9A%84%E8%A1%8C%E4%B8%BA%E7%B1%BB%E4%BC%BC%E4%BA%8E%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%AE%83%E6%98%AF%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6.png)
考虑命令的输出ls
:
$ ls -l /sbin/mkfs.ext4
lrwxrwxrwx 1 root root 6 Aug 4 00:10 /sbin/mkfs.ext4 -> mke2fs
$ type mkfs.ext4
mkfs.ext4 is hashed (/sbin/mkfs.ext4)
mkfs.ext4
是指向mke2fs
命令的符号链接。没什么奇怪的,一切都很好。因此,跑步mkfs.ext4
与跑步是一样的mke2fs
。请注意我在以下命令的输出中添加的大括号:
$ mke2fs
Usage: {mke2fs} [-c|-l filename] [-b block-size] [-C cluster-size]
--sinp--
$ mkfs.ext4
Usage: {mkfs.ext4} [-c|-l filename] [-b block-size] [-C cluster-size]
--sinp--
显然,mke2fs
使用文件名来确定要创建的适当文件系统类型,甚至自定义其选项列表:
$ ln -s /sbin/mke2fs mkmk
$ ls -l mkmk
lrwxrwxrwx 1 direprobs direprobs 12 Aug 8 14:25 mkmk -> /sbin/mke2fs
$ ./mkmk
Usage: mkmk [-c|-l filename] [-b block-size] [-C cluster-size]
--sinp--
我设法使用 制作了一个 ext2 文件系统mkmk
,这是我用 制作的符号链接ln
。是什么mkmk
意思mke2fs
,应该没什么吧!
如何mke2fs
使用运行它的文件名来确定要创建的文件系统类型?
答案1
请参阅parse_fs_type
中的函数mke2fs.c
:
- 如果显式指定文件系统类型(使用
-t
),则使用该类型 - 如果该工具在 Hurd 上运行,请使用“ext2”;
- 如果程序名为
mke3fs
,则使用“ext3”; - 如果程序名为
mke4fs
,则使用“ext4”; - 如果程序名称以 开头
mkfs.
,则使用后缀; - 否则,使用 中定义的默认值(
/etc/mke2fs.conf
如果有); - 否则,使用“ext2”,除非默认启用日志,在这种情况下使用“ext3”。
生成的文本字符串用于查找文件系统定义/etc/mke2fs.conf
(除了内部处理的“ext2”)。
因此您mkmk
最终将使用 ext2 文件系统类型。
答案2
- 该
-t
选项无条件设置文件系统类型,并且使用该选项的唯一效果任何程序名称是更改程序运行时在诊断消息中打印的程序名称。 - 在 Hurd 上,无论程序以何种名称调用,都使用 ext2 作为文件系统类型,这同样只会影响诊断消息。
- 否则,将检查进程的第零个参数的基本名称:
mke3fs
如果以基本名称调用,它将创建一个ext3
文件系统,其中包含一个日志,就像-j
已指定一样。- 如果以基本名称调用,
mke4fs
它将创建一个ext4
文件系统。 - 如果基本名称以 5 个字符开头,
mkfs.
它将无条件使用其余字符作为文件系统类型。如果基本名称也恰好是,mkfs.ext3
它会创建一个日志,就像-j
已指定一样。 - 否则,对于任何其他名称,它都只是充当普通的 old
mke2fs
,从配置文件中获取文件系统类型,并从 ext2 更改为 ext3 (如果-j
提供了该选项)。
其中大部分内容可以在mke2fs
和mke2fs.conf
手册中找到。参见解释文件系统类型在后者和描述前者的部分。手册中唯一缺少的部分是无法识别的名称实际上是mke2fs
.