ext4 파일 시스템 구조뿐만 아니라 ext4 파일 시스템 구조가 존재하는 파티션의 모든 비트(슈퍼블록, 메타데이터, 로그 등)를 0으로 만들고 싶습니다 wipefs
.
유틸리티를 사용하면 파일 내용을 신속하게 지울 수 있지만 shred
메타데이터는 그렇지 않습니다. 지원되는 블록 장치에서는 전체 파티션에서 빠르게 실행할 TRIM/DISCARD
수 있으므로 쉽습니다 .blkdiscard
그러나 사용할 수 없는 대형 회전 HDD에서 TRIM/DISCARD
모든 비트를 0으로 설정하는 것은 시간이 많이 걸리는 프로세스가 되거나 디스크 암호화 키(자체 암호화 드라이브에서)를 파괴/재생성하는 것을 의미하며 이는 ext4 파티션뿐만 아니라 전체 드라이브를 잃는 것을 의미합니다.
mke2fs
코드를 읽고 이를 기반으로 가상의 도구를 만드는 것 외에 wipe2fs
모든 ext4 슈퍼블록/메타데이터를 빠르게 지울 수 있는 또 다른 방법이 있습니까?
답변1
나는 몇 년 전에 후속 mkfs가 무인 설치 중에 "정말로 이 작업을 하시겠습니까..."라는 질문을 묻지 않도록 모든 슈퍼블록을 제거하기 위한 스크립트 원격 설치의 일부로 이 기사를 썼습니다. 테스트는 2개의 파티션이 있는 단일 장치로 제한됩니다.
# Overwrite any existing superblocks for the filesystem on each partition
#
# Zero out the superblock where the filesystems will be. If we don't do this,
# when we reimage a disk mkfs will see the superblocks of the filesystem which
# may have previously been here and and ask for a y/n confirmation before
# proceeding which requires more manual intervention (see disk geometry below)
# This gets a little complicated since the mkfs scatters superblocks across the
# partition to protect against failure so you just can't just zero out the
# beginning of the partition.
# Note that fdisk reports in units of 512 byte blocks (-u) ($FD_BS) but
# the file system may have different blocksize ($FS_BS). When we dd seek to zero
# out the superblock, we need to seek X file system blocks (in FS_BS) from
# the beginning of the partition (in FD_BS) so we use the FS_MULT to help make
# the math more obvious.
overwriteAnySuperblocks() {
fdisk -u -l ${TGTDEV} | grep -v EFI |
sed -n '/^\//{ s/\*/ /; p}' | # only line that start with /, delete '*'
while read PART FIRST_BLOCK IGNORE_REST_OF_LINE
do
FD_BS=512 # fdisk reports in 512 byte blocks
echo "Partition $PART starts at $FIRST_BLOCK fdisk blocks" >&2
# get the file system block size - may be a 4k file system
FS_BS=$(dumpe2fs "${PART}" 2>/dev/null |
sed -n '/^Block size/s/^Block size: *\([0-9]*$\)/\1/p')
echo "File system block size from dumpe2fs - FS_BS=$FS_BS" >&2
[[ -z "${FS_BS}" ]] && continue # no filesystem on this partition
# file system block as a multiple of 512 byte blocks
FS_MULT=$(( FS_BS / FD_BS ))
echo "File system block size $FS_BS is $FS_MULT x $FD_BS fdisk blocks" >&2
# zero out the beginning of each partition
# zero out backup superblocks
dumpe2fs "${PART}" 2>/dev/null |
sed -n '/superblock/s/^.*block at \([0-9]*\).*/\1/p' |
while read SUPERBLOCK
do
echo "Zeroing superblock at FS $SUPERBLOCK" >&2
#echo dd if=/dev/zero of=${TGTDEV} bs=${FD_BS} \
# seek=$((${FIRST_BLOCK}+(${SUPERBLOCK}*${FS_MULT}))) \
# count=2048
dd if=/dev/zero of=${TGTDEV} bs=${FD_BS} \
seek=$(( FIRST_BLOCK + (SUPERBLOCK*FS_MULT) )) \
count=2048
done
done
}
답변2
우리는 단순히 파티션의 첫 번째 블록에 0을 추가하곤 했습니다.
dd if=/dev/zero bs=512 count=512 of=/dev/your_partition