mke2fs - 回答脚本中的“覆盖”问题

mke2fs - 回答脚本中的“覆盖”问题

我使用mke2fs实用程序来创建文件系统。如果文件系统已经存在,我会收到确认提示:

~# mkfs.ext4 /dev/xvdf 
mke2fs 1.46.2 (28-Feb-2021)
/dev/xvdf contains a ext4 file system labelled 'Data'
        created on Sun Oct 10 22:06:41 2021
Proceed anyway? (y,N) n

到目前为止,一切都很好。现在我想将此命令放入脚本中,并使其no在这种情况下静默选择:

~# echo 'n' | mkfs.ext4 /dev/xvdf 
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: c3136577-5ef3-435c-a02c-ebae8d1f4e32
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

???在这种情况下没有交互式提示,它只是继续执行作业。还尝试了expect, 并yes n按照 @kjensenxz 稍后的建议 - 也没有提示。它不会卡住等待输入 - 根本没有问题,就好像mke2fs神奇地检测到它是使用管道输入运行的,然后它甚至不尝试读取它。

-q标志对此没有影响。

如果重要的话,该脚本可以在 alpine linux 上运行。

答案1

mkfs.ext4如果发现文件系统,则没有选项告诉它中止。相反,您需要自己执行该检查。 (我想mkfs.ext4如果标准输入已连接到终端,如果没有连接,则认为不会得到答案,因此无论如何都会继续。这将是一种类似于lsls | cat输出不同布局的合理方法。)

以下是 Pi 上设备文件系统查询的示例,

file -s /dev/mmcblk0p1
/dev/mmcblk0p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 16, root entries 512, Media descriptor 0xf8, sectors/FAT 32, sectors/track 63, heads 255, sectors 129024 (volumes > 32 MB), reserved 0x1, serial number 0x22e0c711, label: "boot       ", FAT (16 bit)

file -s /dev/mmcblk0p2
/dev/mmcblk0p2: Linux rev 1.0 ext4 filesystem data, UUID=202638e1-4ce4-45df-9a00-ad725c2537bb (needs journal recovery) (extents) (large files)

file -s /dev/mmcblk0p3
/dev/mmcblk0p3: LVM2 PV (Linux Logical Volume Manager), UUID: 40t385-3Q2C-u3Qz-TN5b-1fI1-0oYC-PsMQ3c, size: 27618967552

有相当多的可能选项 - 比我在这里显示的要多得多 - 因此查找“空”案例可能更容易,并且仅当预期设备与此匹配时才继续。对于实验,您可以使用dd if=/dev/zerodd if=/dev/urandom,但两者都file -s返回data文件类型:

dd if=/dev/zero bs=1M count=100 of=/tmp/100M.dat
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.487274 s, 215 MB/s

lodev=$(losetup --find --show /tmp/100M.dat ); echo $lodev
/dev/loop0

file -s $lodev
/dev/loop0: data

losetup -d $lodev
rm /tmp/100M.dat

代码可能是这样的,

#!/bin/sh
device=/dev/xvdf

magic=$(file -s "$device" 2>&1)
if [ "$magic" = "$device: data" ]
then
    # It isn't an obvious filesystem
    mkfs.ext4 ... "$device"
else
    # Uh oh
    printf "%s\n" "Cowardly refusing to create a filesystem on ${magic%%,*}" >&2
    exit 1
fi

答案2

yes n | mkfs.ext4 /dev/sdXY

yes(1)

相关内容