squashfs 파일 내의 하위 디렉터리에 추가

squashfs 파일 내의 하위 디렉터리에 추가

가 있다고 가정하면 filesystem.squashfs다음을 통해 연결할 수 있습니다.

mksquashfs somefile filesystem.squashfs

somefile이는 squashfs 파일의 루트 디렉토리에 추가됩니다 . 디렉터리 추가:

mksquashfs somedir/ filesystem.squashfs

그 안의 파일과 디렉터리는 somedir/squashfs 파일의 루트 디렉터리에 추가됩니다. squashfs 트리에 디렉터리나 파일이 있으면 mksquashfs이전 파일과 디렉터리를 변경하지 않고 새 파일의 이름이 변경됩니다. 그렇다면 "추가"라는 문구가 의미가 있습니다.

나는 unsquashfssquashfs의 압축을 풀 수 있는 방법을 알고 있지만, 압축을 풀지 않고 squashfs 트리 내의 기존 하위 디렉터리에 새 파일이나 디렉터리를 추가할 수 있는 방법이 있는지 궁금합니다.

답변1

물론, 디렉토리나 파일을 squashfs_file에 추가할 수 있습니다.

mksquashfs의 작동 방식을 이해해야 합니다. 대략적으로 말하면 Growthisofs가 DVD에 기록하는 방식과 유사한 방식으로 데이터 압축 블록을 점진적으로 추가하고 최종적으로 이미지의 표 형식 내용인 TOC를 업데이트합니다. 물론 이전 디렉토리를 "삭제"할 수는 없습니다. 왜냐하면 증분 쓰기는 과거가 아닌 미래에만 관심이 있기 때문입니다! ! ! !

그러나 전체 이미지를 dequashfs하지 않고도 squashfs 파일을 수정할 수 있는 매우 쉬운 방법이 있습니다(이는 RAM이나 저장 장치에서 많은 공간을 차지할 수 있습니다... dvd_iso 3-5GB 이미지를 생각해 보세요!). 지도 이념은 다음과 같습니다.

1squashfs_file /mnt 마운트(마운트는 unsquashfs보다 훨씬 적은 저장 공간을 사용합니다.)

2 수정하려는 디렉터리를 제외하여 squashfs_file을 다시 빌드한 다음 원하는 새 디렉터리를 추가합니다.

다음과 같은 세부정보:

  • cp /mnt/specific_dir $home ##modify $home/specific_dir as needed
  • mksquashfs /mnt new_squashfs_file -wildcards -e specific_dir
  • mksquashfs $home/specific_dir new_squashfs_file -keep-as-directory
  • umount /mnt # cleanup

물론, mksquashfs에 대한 다른 모든 옵션은 평소대로 추가할 수 있습니다(블록 크기, 압축 방식.... -b 1048576 -comp xz....)

설명을 위해 예제에서는 디렉토리 수정을 보여주지만 rootfs에서는 etc usr....을 제외하고 수정된 etc usr을 두 번째 줄 추가 메커니즘에 추가할 수 있습니다.

ntfs 원시 파티션을 사용하지 않고 4GB RAM "windows10 노트북"에서 전체 livecd 우분투를 다시 관리해야 하는 경우 이 방법을 사용합니다.

도움이 되었기를 바랍니다, Wang Ji.

답변2

Live-CD를 다시 만들려고 할 때 폴더를 복사하고 제외하는 것은 지금까지만 가능합니다(제 경우에는 /etc, /lib 및 /usr을 터치해야 했는데, 이는 거의 모든 내용의 압축을 푸는 것과 같았습니다).

그러나 압축을 풀지 않고 재압축한다는 아이디어에 overlayfs의 이점을 추가하여 다음과 같은 결과를 얻었습니다.

SQFS=/path/to/my.sqfs
ADD=/path/to/additional/files/

mkdir /tmp/lower /tmp/upper /tmp/work /tmp/joined
mount $SQFS /tmp/lower
mount -t overlay none -olowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work  /tmp/joined
rsync -a $ADD /tmp/joined
mksquashfs /tmp/joined ${SQFS}_new -comp xz -b 1M -noappend
umount /tmp/joined /tmp/lower
rm -rf /tmp/lower /tmp/upper /tmp/work /tmp/joined
mv ${SQFS}_new $SQFS

여전히 새 SQFS를 생성해야 하지만 이전 SQFS의 콘텐츠 압축을 풀 필요가 없으며 오버레이는 이전 디렉터리 등의 새 파일을 처리합니다.

PS 나는 SQFS를 먼저 압축 해제한 다음 다시 압축하는 것보다 속도가 더 빠르기를 바랐지만 그렇지 않습니다. 결국, 새 SQFS를 생성하려면 이전 SQFS 전체를 읽어야 합니다.

관련 정보