squashfs 이중 캐싱 문제

squashfs 이중 캐싱 문제

파일에 큰 squashfs 이미지가 있다고 가정합니다. 따라서 루프백 장치로 설치됩니다. 이제 내가 이해한 바에 따르면 커널 4.4 이상에서는 루프백 장치에서 이중 캐싱이 제거되었습니다. 그러나 불행히도 squashfs에서는 그렇지 않습니다.

마운트된 squashfs에서 무언가를 읽으면 Linux는 이미지의 압축된 부분을 읽고 캐시합니다. 액세스하는 압축이 풀린 데이터도 캐시되므로 데이터를 다시 읽는 속도가 매우 빠르며 다시 압축을 풀 필요가 없습니다.

두 번째 캐시는 빠른 액세스를 제공하므로 매우 좋습니다. 첫 번째 캐시는 거의 중복되고 완전히 쓸모가 없습니다. RAM 사용량을 오염시키고 다른 캐시 항목을 삭제합니다(또는 강제로 응용 프로그램을 스와핑).실제로 유용하다. 이는 기본적으로 이중 캐싱 문제입니다.

파일이 캐시되고 압축이 해제되는 한 파일의 캐시된 버전을 유지할 필요가 없습니다.데이터 압축.

커널이 나중에 이러한 캐시를 삭제해야 하는 경우 먼저 압축된 데이터 캐시(최근에 사용되지 않음)를 삭제한 다음 압축이 풀린 데이터를 삭제합니다. 드라이브에서 다시 읽어야 하기 때문에 읽은 후에야 이 사실을 알 수 있습니다.그리고다시 압축을 푼다. 하지만 압축된 데이터를 드라이브에 캐싱하는 것은 의미가 없습니다!

요약하면 다음과 같습니다.

  • 빠른 액세스를 위해 압축 해제된 데이터 캐시
  • "압축된" squashfs 데이터(파일)를 전혀 보존하지 마세요.

해당 옵션을 사용하여 설치를 시도했지만 sync아무 것도 수행하지 않았습니다.

패치워크에 더 가까운 솔루션이 있습니다. 기본적으로 다음 명령은 squashfs 압축 데이터(양호)의 캐시를 삭제하지만 압축 해제된 데이터(양호)의 캐시는 삭제하지 않습니다.

dd if=root.squashfs iflag=nocache count=0

마운트 지점을 건드리지 않습니다. 이렇게 하면 압축이 풀린 데이터가 손실되기 때문입니다(나쁘게 됩니다). 대신 루프 장치의 기본 파일을 터치합니다. 그 파일은 캐시하고 싶지 않기 때문입니다(말이 안 되기 때문입니다).

문제는 모든 애플리케이션이 언제든지 읽을 수 있기 때문에 명령을 계속해서 폴링해야 한다는 것입니다. 따라서 "kludge"는 위 명령이 매초마다 실행되도록 설정하고 있습니다.

분명히 이것은 우아하지 않고 완전히 해키입니다. 그러나 적어도 그것은 내가 추구하는 것이 무엇인지 정확히 보여줍니다. 파일 자체에 대한 파일 캐시만 삭제합니다(압축이 풀린 파일은 삭제하지 않음). 명령이 밀리초마다 실행된다고 상상해 보세요. 이것이 정확히 제가 원하는 것이지만 이와 같은 폴링은 없습니다. 더 좋은 방법이 있나요?

관련 정보