ユーティリティを使用して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
では、標準入力端末に接続されているが接続されていない場合は応答がないと仮定し、とにかく続行します。これは、さまざまなレイアウトを同様に出力するls
合理的な方法です。ls | 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/zero
またはを使用できますが、dd 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