대규모 ext4 볼륨을 축소해야 하는데 가동 중지 시간을 최대한 줄이고 싶습니다. 지금까지 수행한 테스트에 따르면 최대 일주일 동안 크기 조정을 위해 제거할 수 있는 것으로 보입니다. 크기를 조정할 때 너무 많은 블록을 이동할 필요가 없도록 미리 온라인으로 파일 시스템 조각 모음을 수행할 수 있는 방법이 있습니까?
고쳐 쓰다: 이 지점에 도달하는 데 시간이 좀 걸렸고, 축소에 대비하여 꽤 많은 테라바이트의 데이터를 이동했으며, 아래 답변의 정보를 활용하려고 노력했습니다. 나는 약간의 수정을 가하면 비슷한 상황에 있는 다른 사람들에게 유용할 수 있는 다음 명령줄을 생각해 냈습니다. 또한 filefrag 및 e4defrag 명령이 제대로 작동하려면 루트로 실행해야 합니다. 이는 파일 소유권에 영향을 미치지 않습니다. 여러 하드 링크가 있는 파일에서도 잘 작동합니다. 하드 링크가 많이 있습니다.
find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag
다른 사람이 쉽게 수정/사용할 수 있도록 하는 빠른 설명:
첫 번째 Find 명령은 사용할 파일 목록을 작성합니다. 이제 이 작업은 중복되거나 더 나은 방법으로 수행될 수 있지만 테스트 당시에는 다른 필터가 있었고 명령의 나머지 범위를 수정하기 위한 편리한 장소로 유지했습니다.
다음으로 각 파일을 "filefrag -v"에 전달하여 각 파일이 사용하는 모든 물리적 블록 목록을 가져옵니다.
grep은 각 파일이 사용하는 마지막 블록("eof"로 끝나는 줄)을 찾습니다. 이 블록은 3 또는 4로 시작하는 10자리 숫자입니다. 내 경우 새 파일 시스템 크기는 2980024320 블록 길이가 되므로 삭제하려는 디스크 영역의 파일만 처리하면 충분합니다. grep에 다음 줄("-A 1")도 포함하면 출력의 다음 섹션에 파일 이름도 포함됩니다. 이 작업을 수행하는 다른 사람들은 파일 시스템의 크기에 따라 명령을 수정해야 합니다. 더 나은 방법으로 할 수도 있지만 지금은 이것이 효과가 있고 나는 게으르다.
awk는 filefrag 출력에 남아 있는 다른 모든 쓰레기 grep에서 파일 이름을 추출합니다.
마지막으로 e4defrag를 호출합니다. 실제 조각화 수는 신경 쓰지 않지만 물리적 블록을 이동하는 부작용이 있으며(드라이브의 이전 부분으로 이동하길 바랍니다) 추가 노력 없이 여러 하드 링크가 있는 파일에 대해 작동합니다.
실제로 데이터를 이동하지 않고 조각 모음을 수행할 파일을 알고 싶다면 명령의 마지막 부분을 끄면 됩니다.
find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'
답변1
내가 아는 한,ext4fs는 온라인 조각 모음을 지원합니다('완료' 아래에 나열되어 있지만 상태 필드는 비어 있습니다.원래 패치2006년 말부터) ~Linux 2.6.28 이상에서 실행 시 e2fsprogs 1.42 이상의 e4defrag디렉터리 또는 파일 시스템의 상태를 쿼리하고 최소한 개별 파일의 조각 모음을 수행할 수 있습니다.e2fsprogs현재 버전은 1.42.8입니다.
하지만 하고 싶은 일이 별로 없는 것 같아서 이것이 도움이 될지 모르겠습니다.조각 모음데이터는통합하다디스크의 데이터. 이 둘은 함께 수행되는 경우가 많지만 별개의 작업입니다.
데이터를 통합하는 간단한 방법가능한적당한 여유 공간이 있다고 가정하면 작업은 각 파일을 동일한 파일 시스템의 다른 로직에 복사한 다음 mv를 사용하여 inode가 가리키는 데이터를 새 복사본으로 바꾸는 것입니다. 이는 ext4 할당자가 정확히 어떻게 작동하는지에 따라 많이 다르지만 시도해 볼 가치가 있을 수 있으며 스크립트 작성이 상당히 쉬울 것입니다. 여러 위치에서 하드 링크된 파일을 주의 깊게 살펴보세요(이와 같은 시나리오에서 가장 쉬운 방법은 아마도 링크 수가 1보다 큰 파일을 무시하고 resizefs가 이를 처리하도록 하는 것입니다).