12장. RHEL의 이미지 모드에서 파일 시스템 관리
이미지 모드는 OSTree를 백엔드로 사용하며 기본적으로 스토리지에 대해 composefs를 활성화합니다. 즉, /opt
및 /usr
로컬 경로가 일반 디렉터리이고 /var
에 대한 심볼릭 링크가 아니기 때문에 /opt
에 쓰는 파생 컨테이너 이미지에 타사 콘텐츠를 쉽게 설치할 수 있습니다.
타사 콘텐츠를 /opt
에 설치할 때 타사 구성 요소가 런타임 중에 /opt
내의 하위 디렉터리에 쓰기를 시도할 수도 있으며 잠재적인 충돌이 발생할 수 있습니다.
12.1. /sysroot를 사용하여 물리적 및 논리 루트 이해
부트c 시스템이 완전히 부팅되면 chroot
에서 생성한 환경, 즉 운영 체제가 현재 실행 중인 프로세스 및 해당 하위 프로세스에 대해 명확한 루트 디렉토리를 변경합니다. 물리적 호스트 루트 파일 시스템은 /sysroot
에 마운트됩니다. chroot
파일 시스템을 배포 루트라고 합니다.
나머지 파일 시스템 경로는 시스템 부팅의 최종 대상으로 사용되는 배포 루트의 일부입니다. 시스템은 ostree=kernel
인수를 사용하여 배포 루트를 찾습니다.
/usr
-
/usr
에 모든 운영 체제 콘텐츠를 유지하는 것이 좋지만 엄격하게 필요하지는 않습니다./bin
과 같은 디렉토리는/usr/bin
에 대한 심볼릭 링크로 작동합니다. 이 레이아웃은 운영 체제를 분리하고 호스트 특정 리소스를 생성합니다.
composefs
가 활성화되면 /usr
은 /
와 다릅니다. 두 디렉터리는 모두 동일한 변경 불가능한 이미지의 일부이므로 bootc 시스템으로 전체 Usr Cryostat
를 수행할 필요가 없습니다.
/usr/local
-
bootc 시스템을 사용하면 사용자 정의 컨테이너 이미지를 기본 진입점으로 생성할 수 있습니다. 이로 인해 기본 이미지는
/usr/local
을 일반 디렉터리(즉, 기본 디렉터리)로 구성합니다.
기본 파일 시스템 레이아웃에는 /opt
및 /usr/local
이 모두 일반 디렉터리로 있습니다. 즉, 빌드 시 쓰기 가능하며 런타임 시 변경할 수 없습니다. 예를 들어 이러한 심볼릭 링크를 /var
에 만드는 RHEL CoreOS와 다릅니다.
/etc
/etc
디렉토리에는 기본적으로 변경 가능한 영구 상태가 포함되어 있지만etc.transient 구성
옵션 활성화를 지원합니다. 디렉터리가 변경 가능한 영구 상태인 경우 업그레이드 간에 3방향 병합을 수행합니다.-
새 기본
/etc
를 기본으로 사용 -
현재와 이전
/etc
간의 diff를 새/etc
디렉토리에 적용 -
/etc
.에 있는 동일한 배포의 기본/usr/etc
와 다른 로컬 수정된 파일을 유지합니다.
-
새 기본
ostree-finalize-staged.service
는 새 부트 로더 항목을 생성하기 전에 종료 시 이러한 작업을 실행합니다.
이는 Linux 시스템의 많은 구성 요소가 /etc
디렉토리에 기본 구성 파일을 제공하기 때문에 발생합니다. 기본 패키지가 제공되지 않더라도 기본적으로 소프트웨어는 /etc
의 구성 파일만 확인합니다. 별도의 버전의 /etc
가 없는 bootc 이미지 기반 업데이트 시스템은 설치 시에만 채워지며 설치 후 언제든지 변경되지 않습니다. 이로 인해 /etc
시스템 상태가 초기 이미지 버전의 영향을 받으며 변경 사항을 /etc/sudoers.conf
에 적용할 수 있으며 외부 개입이 필요할 수 있습니다. 파일 구성에 대한 자세한 내용은 RHEL bootc 이미지 빌드 및 테스트를 참조하십시오.
/var
-
예를 들어
/var
디렉토리는 하나만 있습니다. 기본적으로/var
디렉터리에 배치된 파일과 데이터는 명시적으로 삭제될 때까지 지속되며 다른 세션과 시스템을 다시 시작할 때 사용할 수 있습니다./var
파티션 또는 해당 하위 디렉터리를 임시 파일 시스템(TMPFS) 또는 네트워크 마운트 지점과 같은 마운트 지점으로 전환할 수 있습니다./var
에 대해 별도의 파티션을 만들지 않으면 시스템은 바인드 마운트를 수행하고/var
디렉터리에 단일 공유 및 영구/ostree/deploy/$stateroot/var
를 생성하여 두 디렉터리가 배포 간에 동일한 데이터를 공유하도록 합니다.
기본적으로 /var
의 콘텐츠는 볼륨 역할을 합니다. 즉, 컨테이너 이미지의 콘텐츠가 초기 설치 시간 동안 복사되고 업데이트되지 않습니다.
/var
및 /etc
디렉토리는 다릅니다. /etc
를 비교적 작은 구성 파일에 사용할 수 있으며 예상되는 구성 파일은 종종 /usr
의 운영 체제 바이너리에 바인딩됩니다. /var
디렉터리에는 시스템 로그, 데이터베이스 등 임의로 대규모 데이터가 있으며 운영 체제 상태가 롤백되지 않은 경우 기본적으로 롤백하지 않습니다.
예를 들어 dnf downgrade postgresql
과 같은 업데이트를 수행하면 /var/lib/postgres
의 물리적 데이터베이스에 영향을 미치지 않습니다. 마찬가지로 bootc 업데이트 또는
을 수행하면 이 애플리케이션 데이터에 영향을 미치지 않습니다.
bootc
롤백
또한 /var
separate를 사용하면 새로운 운영 체제 업데이트를 적용하기 전에 새 운영 체제 업데이트를 스테이징합니다. 즉, 업데이트가 다운로드되고 준비되지만 재부팅에만 적용됩니다. Docker 볼륨에도 적용되므로 데이터에서 애플리케이션 코드를 분리합니다.
애플리케이션에 미리 생성된 디렉터리 구조(예: /var/lib/postgresql
)가 포함되도록 하려면 이 케이스를 사용할 수 있습니다. 이를 위해 systemd tmpfiles.d
를 사용합니다. 유닛에서 StateDirectory= <directory>를
사용할 수도 있습니다.
- 기타 디렉터리
-
컨테이너 이미지에
/run
,/proc
또는 기타 API 파일 시스템에 콘텐츠를 제공할 수 없습니다. 그 외에도/usr
및/opt
와 같은 기타 최상위 디렉터리는 컨테이너 이미지로 라이프사이클이 지정됩니다. /opt
-
bootc
는composefs
를 사용하므로/opt
디렉토리는/usr
과 같은 다른 최상위 디렉토리와 함께 읽기 전용입니다.
소프트웨어가 /opt/exampleapp
의 자체 디렉터리에 작성해야 하는 경우 일반적인 패턴은 심볼릭 링크를 사용하여 로그 파일과 같은 작업을 위해 /var
로 리디렉션하는 것입니다.
RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
선택적으로 이러한 마운트를 동적으로 수행하도록 서비스를 시작하도록 systemd 장치를 구성할 수 있습니다. 예를 들면 다음과 같습니다.
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
- 일시적인 루트 활성화
-
소프트웨어를 일시적으로(다음 재부팅)할 수 있도록
/usr
및/opt
를 포함한 모든 최상위 디렉토리에 쓰기 위해 유지되어야 하는 콘텐츠의 심볼릭 링크와 함께 임시 루트를 활성화할 수 있습니다.기본적으로 완전히 일시적인 쓰기 가능
rootfs
를 활성화하려면/usr/lib/ostree/prepare-root.conf
에서 다음 옵션을 설정합니다.
[root] transient = true
[root]
transient = true
이를 통해 소프트웨어가 유지되어야 하는 콘텐츠의 심볼릭 링크와 함께
에 일시적인 쓰기를 수행할 수 있습니다.
/
opt