ext4lazyinit의 진행 상황을 측정할 수 있는 방법이 있나요?

ext4lazyinit의 진행 상황을 측정할 수 있는 방법이 있나요?

ext4lazyinit에 대해 질문했습니다.여기. 내가 읽고 이해한 바에 따르면 파일 시스템에 대한 모든 inode를 생성하지 않고도 하드 드라이브 사용을 시작할 수 있습니다.

알고 있거나 측정할 수 있는 유일한 방법은 ext4lazyinit모니터링하는 것 입니다 iotop. 진행률을 백분율로 확인할 수 있는 방법이 있나요?

답변1

ext4lazyinit의 진행 상황을 대략적으로 파악하는 방법을 찾은 것 같습니다.

간단히 말해서: 참조스크립트다음과 같은.

이 방법은 파티션이 처음 마운트된 이후 디스크 연결이 끊어진 적이 없으며(시스템이 재부팅되지도 않음) 파티션이 사용하는 것과 정확히 동일한 양의 데이터를 파티션에 쓴다고 가정합니다. 파일을 수정하세요).

1 단계: fdisk의 파티션 크기(kiB로 변환)를 df에 표시된 1K 블록 수와 비교합니다. (파티션 크기(kiB))에서 (1K 블록 수)를 빼서 (inode 테이블의 대략적인 크기)를 얻습니다.

편집: 예, fdisk:

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

df:

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351 섹터 * 512바이트/섹터/1024 = 5860488175.5kiB(fdisk에 따르면 5.5TiB에 가깝습니다). 5813233164에서 df를 빼면 47255011.5kiB(약 45GiB)가 되며 이는 inode 테이블의 대략적인 크기입니다.

2 단계:get(파티션에 기록된 총 kiB):

awk '{ print $3"\t"$10 }' /proc/diskstats

파티션에 맞는 행을 선택하고 이를 kiB로 변환하세요.

편집: 예:

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

내 경우에는 sdd1을 사용하여 작성된 총 kiB = 2530108940 섹터 * 512바이트/섹터/1024 = 1265054470kiB(거의 1.2TiB)입니다.

3단계: 파일 시스템에 데이터를 쓴 경우에만 필요합니다. (파티션에 쓴 총 kiB)에서 (df에 표시된 사용된 1K 블록 수)를 빼서 (inode 테이블에 쓴 대략적인 kiB)를 얻습니다.

편집: 예: inode 테이블에 기록된 대략적인 kiB = 1265054470(2단계에서) - 1217095176(1단계의 df 출력 참조) = 47959294kiB(45.7GiB)

4단계: (inode 테이블에 작성된 대략적인 kiB)를 (inode 테이블의 대략적인 크기(kiB))로 나누고 100을 곱하여 진행률을 백분율로 얻습니다.

편집: 예: 대략적인 진행률 = 47959294 / 47255011.5 * 100% = 101.5%

스크립트

또는 부분 스크립트로 작성합니다(보안상의 이유로 fdisk 호출 스크립트를 거부합니다).

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

호출 $1 = "파티션 이름"(예: sdd1), $2 = "fdisk에 따른 파티션 섹터", $3 = "뒤에 슬래시가 없는 마운트 지점"

시험 결과

내 방법은 한 번만 테스트되었습니다. 설정:

  • 6TB 파티션

  • cryptsetup을 사용하여 암호화

  • -m 0 이외의 기본 매개변수를 사용하여 생성된 파일 시스템

  • ext4lazyinit가 완료되기 전에 279 GiB 파일이 파티션에 기록되었습니다.

결과:완료 후 99.7% 판독 :-)

편집: 동일한 디스크에 거의 또 다른 TiB의 데이터를 쓴 후 이제 예상 수율은 101.5%입니다. 유용할 만큼 정확하다고 생각합니다.

답변2

(알다시피 영어는 내 모국어가 아닙니다.)

적어도 Ubuntu 기반 시스템(저는 ZorinOS 15를 사용하고 있습니다)에서는 진행 상황을 다음과 같이 간접적으로 측정할 수 있습니다.

  1. ext4lazyinit에서 현재 처리 중인 장치 및 섹터에 대한 정보를 얻을 수 있습니다.

a) 따라서 /proc/sys/vm/block_dump에 "1"을 써야 합니다. (중요: 작동할 준비가 되면 block_dump를 다시 "0"으로 설정해야 합니다):

   echo 1 > /proc/sys/vm/block_dump

b) 그런 다음 다음을 통해 정보를 얻습니다.

tail -f /var/log/syslog | grep ext4

출력은 다음과 유사합니다(ext4lazyinit가 장치에 액세스할 때까지 기다려야 할 수도 있음).

May  7 13:19:59 xxx kernel: [ 1130.643118] ext4lazyinit(1070): WRITE block 9235888384 on md0 (2048 sectors)
May  7 13:20:01 xxx kernel: [ 1132.594961] ext4lazyinit(1070): WRITE block 9235890432 on md0 (2048 sectors)
May  7 13:20:01 xxx kernel: [ 1132.632755] ext4lazyinit(1070): WRITE block 9235892480 on md0 (2048 sectors)

ext4lazyinit가 실행 중인 현재 섹터(블록 9235892480)와 장치(md0)를 볼 수 있습니다.

  1. 장치의 섹터 수(내 경우에는 /dev/md0)에 대한 정보를 얻을 수 있습니다. 이는 예를 들어 그래픽 도구 "gparted"를 사용하거나 "fdisk -l" 명령을 통해 가능합니다. 나는:

     sudo fdisk -l /dev/md0
    

출력은 다음과 같습니다:

Festplatte /dev/md0: 5,5 TiB, 5990282952704 Bytes, 11699771392 Sektoren
...
  1. 이제 현재 처리 중인 섹터 수와 해당 섹터의 장치 크기를 알 수 있습니다.이 방법으로 ext4lazyinit의 진행 상황을 계산할 수 있습니다..

  2. block_dump를 다시 "0"으로 설정

    echo 0 > /proc/sys/vm/block_dump
    

당신은 또한 볼 수 있습니다

당신을 위해

답변3

이것을 확인하세요수리하다논의하다. Lazyinit 없이 시스템을 초기화할 수는 있지만 측정할 수는 없습니다. 기다릴 시간이 있으면 기다리십시오. 토론에서 패치를 시도해 볼 수 있지만 Patchwork에 따르면 "거부됨" 상태입니다.

관련 정보