일부 파일이 포함된 폴더가 있습니다. /
특정 디렉토리의 내용이 해당 위치에 나타나도록 마운트하는 방법이 있습니까 /
?
내 경우에는 디렉토리에 애플리케이션 관련 파일이 포함되어 있었지만 /dev
및 /proc
.
다음을 통해 바인드 마운트를 생성해 보았습니다.
mount --bind ~/applications/firefox /
그러나 이는 전혀 효과가 없습니다. 댓글의 추측과 달리 부작용도 없습니다.
이에 대한 동기는 미션 크리티컬 시스템에 깔끔하게 설치하고 싶은 맞춤형 애플리케이션이 많기 때문입니다. 당연히 관리에 대한 개입을 최소화하고 싶습니다. 다음 명령을 사용하여 애플리케이션 설치의 파일 시스템 레이아웃을 가져옵니다.Unionfs-fuse + chroot 방법, 하지만 여전히 시스템 파일과 섞이는 응용 프로그램 파일을 처리해야 합니다. 특정 디렉터리를 마운트하면 /
파일 시스템을 깔끔하게 유지하는 데 도움이 됩니다.
이 소프트웨어 설치 방법은 직관적이지 않은 것처럼 보일 수 있지만, 정확히 이 방식(같은 이유로)으로 소프트웨어를 설치하는 "Porteus"라는 배포판이 있지만 aufs 패치 커널과 함께 작동하는 것으로 알려져 있습니다. 그러나 내 시스템에서는 사용자 정의 커널을 사용할 수 없습니다.
답변1
당신이 요청하는 작업은 일반적으로 구성된 거의 모든 Linux 시스템에서 적어도 한 번 수행되었습니다. 대부분의 사람들은 busybox
소위 말하는 것을 사용합니다.switch_root
:
switch_root
모든 파일 삭제란 무엇 입니까?루트 파일 시스템 (메모리 해제)그런 다음chroot
새 파일 시스템을 입력하고 새 파일 시스템에서 새 init 프로세스를 실행합니다.
이는 시스템 초기화 중에 발생합니다. Linux 시스템이 시작되면 커널은 시스템을 단계적으로 시작합니다. 처음에 커널은 다른 시스템(예: 부트로더 또는 펌웨어)에 의해 메모리에서 실행되며, 이 시점에서 커널은 스스로 보호하도록 남겨집니다. 방금 실행한 시스템에 대한 실제 참조 프레임이 없습니다.
이는 initramfs
이미지가 일반적으로 메모리 공간에 첨부한 것 입니다.(그러나 커널에 직접 컴파일할 수도 있습니다)처리할 수 있도록 설계되었습니다. initramfs는 실제 리눅스 루트입니다(완전히 포함되어 있으며 /dev
무엇 /proc
을 가지고 있습니까)파일 시스템 이미지 - Linux 커널에 의해 마운트된 첫 번째 루트 파일 시스템입니다. 여기에는 커널을 시작하는 데 필요한 모든 시스템별 모듈/구성 파일이 포함된 루트 파일 시스템 아카이브가 포함되어 있습니다.
어쨌든 커널은 다음과 같이 아카이브를 설치합니다.루트 파일 시스템 (기본적으로임시 파일 시스템)그런 다음 찾기 위해 필요한 모든 작업을 수행합니다.다른/
그리고 그 위에 설치하세요. 시스템이 시작될 때마다 이 작업을 수행합니다. 다음과 같은 불필요한 해킹에 의존하지 않고도 이 작업을 다시 수행할 수 있습니다.동맹또는오브- 둘 다 구현별로 다양한 복잡성과 구성 세부 사항이 발생할 수 있습니다.(불안정한 것은 말할 것도 없고).
switch_root
위에 인용된 설명 에서 문구를 발견할 수 있습니다.rootfs의 모든 파일 삭제. 분명히 이것은 디스크 기반 rootfs를 전환할 때 이상적인 동작이 아닙니다. 그러나 어쨌든 switch_root
이는 RAM 기반 파일 시스템의 메모리가 해제된 경우에만 발생하며 이는 전혀 필요하지 않습니다. 이전에 인용된 기사의 자세한 내용은 다음과 같습니다.
다음 셸 스크립트 조각은 switch_root를 사용하는 방법을 보여줍니다.
# First, find and mount the new filesystem. mkdir /newroot mount /dev/whatever /newroot # Unmount everything else you've attached to rootfs. (Moving the filesystems # into newroot is something useful to do with them.) mount --move /sys /newroot/sys mount --move /proc /newroot/proc mount --move /dev /newroot/dev # Now switch to the new filesystem, and run /sbin/init out of it. Don't # forget the "exec" here, because you want the new init program to inherit # PID 1. exec switch_root /newroot /sbin/init
위에서 볼 수 있듯이 /dev
, /proc
, 및 /sys
관련 문제를 처리하는 것은 매우 간단하게 수행할 수 있습니다. 그건 그렇고, D-마운트를 레이어링하려는 경우 mount --move
레이어링 시스템으로 인해 발생하는 다른 복잡성을 처리해야 하는 것은 아닙니다. 질문에 설명했듯이 이렇게 하는 것이 더 쉽습니다. 다른 곳에서 루트를 마운트하세요.mtab
mount
기본적으로 일반적인 initramfs 구성에서 발생하는 모든 작업을 수행해야 하며 그 밖의 작업은 거의 수행하지 않습니다.(이것은 포함한다는 의미는 아닙니다.더반또는빨간 모자initramfs 이미지 - 둘 다방법과도한 엔지니어링). 당신이 겪을 수 있는 유일한 실제 문제는 PID1을 따라가게 하는 것입니다. 시스템의 init가 일부 고아 rootfs에서 정체되도록 방치하면 매우 이상한 일이 시스템에서 매우 빠르게 일어나기 시작할 것입니다. 이 문제를 처리하는 확실한 방법은 initramfs부터 시작하는 것입니다. 나중에 루트를 전환하려면 하드 드라이브 init
프로세스가 다른 프로세스를 위해 준비되어 있는지 확인하세요 . exec
다음을 사용하는 경우 systemd
init
이 문제는 이미 해결되었습니다.
systemctl --help
...
switch-root ROOT [INIT] Change to a different root file system
...
systemd
- 기반을 사용하는 경우 일반적인 스크립트 루트 전환 상황 에 대해 init
해당 유닛 파일을 연구해야 합니다 ./usr/lib/systemd/system/initrd*
systemd
busybox
또 다른 접근 방식은 initramfs의 '를 모방하는 것입니다 switch_root
. 그러나 모든 초기 루트 파일을 삭제하는 부분은 생략합니다. systemd
initramfs에 구성된 Arch Linux 시스템이 이를 수행할 수 있습니다. 여기서 initramfs 루트 디렉토리는 switch-root를 실행하기 전에 /newroot
's' 에 마운트되며 /run/initramfs
시스템이 종료 시 절전/일시 중단 등을 깔끔하게 처리하기 위해 대체되는 디렉토리입니다. 실제로 이것은 아마도 상황에 가장 적합한 접근 방식일 것입니다. 다양한 개별 루트 응용 프로그램에 대해 핑퐁을 할 수 있는 작고 메모리 지속 루트 시스템일 뿐입니다.
답변2
mount 를 시도하지 말고 /
자신을 "새"(가짜, 읽기 전용)로 만드십시오.
나는 비슷한 일을했습니다. 당시에는 AUFS를 사용하고 있었지만 이는 overlayfs 및/또는 Unionfs-fuse에서도 작동해야 합니다.
- 폴더 만들기(예:)
~/apps/_App1_FakeRoot
/
Unionfs는 ~/apps/_App1_FakeRoot (루트) 읽기 전용 마운트 지점에 읽기-쓰기로 마운트됩니다 .~/apps/_App1
- FakeRoot로 루트를 변경하고 애플리케이션을 실행하세요.
나의 특별한 경우에는 (임시) 쓰기를 위한 (램) 디스크를 포함하여 여러 레이어를 통합하기 위해 위와 같은 것을 사용했습니다.
정확한 구문은 사용할 수 있는 연합 FS 구현에 따라 달라집니다. 응용 프로그램의 필요에 따라 chroot에 다른 /proc /sys /dev/pts를 마운트해야 할 수도 있습니다. 하드웨어 수준 작업을 수행하려는 경우 특정 유형의 프로그램이 그러한 chroot에서 실행되지 않을 수도 있습니다.
(특정 Unionfs 구현이 /를 읽기 전용 기반으로 사용하지 않으려는 경우 먼저 응용 프로그램의 기반으로 사용하기 위해 "루트 파일 시스템"으로 자체 읽기 전용 바인드 마운트를 수행하여 이를 우회할 수 있습니다.)
답변3
mount --bind ~/applications/firefox /
등을 포함한 전체 디렉토리 트리를 숨깁니다 /dev
. /proc
이렇게 하면 가려진 모든 것에 접근할 수 없게 됩니다. 자체 디렉토리를 숨기는 바인드 마운트를 할 수 없기 때문에 작동하지 않습니다.
당신이 원하는혼합귀하의 디렉토리 트리와 다른 디렉토리 트리에 이미 무엇이 있습니까? 이것은 ... 불리운다공동 설치. Linux에는 사용 가능한 여러 통합 파일 시스템이 있습니다.오브비구식 코어에 존재합니다.UnionFS 퓨즈FUSE는 어디에 있든 사용할 수 있습니다. Aufs는 루트 디렉토리를 마운트 지점으로 지원하지만 Unionfs-fuse. 귀하의 사용 사례에서는 연합 설치로 /usr
충분합니다.