대규모 ext4 볼륨을 축소해야 하는데 가동 중지 시간을 최소화하고 싶습니다. 지금까지 수행한 테스트에 따르면 최대 일주일 동안 크기 조정을 위해 마운트 해제할 수 있는 것처럼 보입니다. resizefs가 너무 많은 블록을 이동할 필요가 없도록 미리 온라인으로 파일 시스템 조각 모음을 수행할 수 있는 방법이 있습니까?
업데이트: 이 지점에 도달하는 데 약간의 시간이 걸렸고 축소를 준비하기 위해 꽤 많은 TB의 데이터를 옮겼으며 아래 답변의 정보를 사용하여 실험해 왔습니다. 나는 마침내 비슷한 상황에서 약간만 수정하면 다른 사람들에게 유용할 수 있는 다음 명령줄을 생각해 냈습니다. 또한 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는 grep이 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]}'
답변1
내가 알 수 있는 바에 따르면,ext4fs는 온라인 조각 모음을 지원합니다("완료" 아래에 나열되어 있지만 상태 필드는 비어 있습니다.원래 패치2006년 말부터)부터Linux 2.6.28 이상에서 실행되는 경우 e2fsprogs 1.42 이상의 e4defrag디렉터리나 파일 시스템의 상태를 쿼리하고 최소한 개별 파일의 조각 모음을 수행할 수 있습니다.e2fsprogs현재 버전은 1.42.8입니다.
하지만 이것이 당신에게 도움이 될지는 잘 모르겠습니다. 당신이 하고 싶은 일이 그다지 많지 않은 것 같으니까요.조각 모음데이터는통합하다디스크의 데이터. 이 둘은 함께 수행되는 경우가 많지만 분명히 다른 작업입니다.
데이터를 통합하는 간단한 방법~할 것 같다적절한 여유 공간이 있다고 가정할 때 작업은 각 파일을 동일한 파일 시스템의 다른 논리적 논리에 복사한 다음 mv를 사용하여 inode가 가리키는 데이터를 새 복사본으로 바꾸는 것입니다. 이는 ext4 할당자가 세부적으로 어떻게 작동하는지에 크게 좌우되지만 시도해 볼 가치가 있을 수 있으며 스크립트 작성이 상당히 쉬울 것입니다. 한 곳 이상의 위치에서 하드링크된 파일을 조심하세요. (이와 같은 체계를 사용하면 링크 수가 1보다 큰 파일을 무시하고 resizefs가 이를 처리하도록 하는 것이 가장 쉬울 수 있습니다.)