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플래그는 이에 영향을 미치지 않습니다.

중요한 경우 스크립트는 알파인 리눅스에서 작동합니다.

답변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

답변2

yes n | mkfs.ext4 /dev/sdXY

바라보다yes(1).

관련 정보