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では、標準入力端末に接続されているが接続されていない場合は応答がないと仮定し、とにかく続行します。これは、さまざまなレイアウトを同様に出力する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

おすすめ記事