
내 컴퓨터에 여러 개의 Linux가 별도로 설치되어 있고 적절한 것으로 재부팅합니다. 새 설치용 파티션이 나열된 fstab을 복사한 다음 mount -a
.
분명히 커널은 변경되지 않지만 괜찮습니다. 작업 파티션만 변경하고 싶습니다. 나는 또한 이 작업이 아무것도 실행되지 않은 상태에서 명령줄에서 수행되어야 한다는 점을 명백하게 생각합니다(가능하다면). 아니면 그 아이디어가 처음부터 헛되고 공허하며 순전히 광기적인 것입니까?
그 이유는 나는 일반적으로 별도의 '실험' 설치에서 급격한 변화(데비안에서 'amd64' 커널로 이동하는 것과 같은)를 실험하기 때문입니다. 재부팅하여 시작하는 것은 물론 괜찮지만 전체 재부팅 없이 해당 설치로 바로 이동할 수 있다면 멋질 것입니다. 이를 루트 파티션을 즉석에서 변경하는 것으로 생각할 수도 있지만 전혀 불가능할 수도 있습니다.
네, 가능합니다. 아래에서 배우겠습니다. 커널 자체를 교체할 필요가 없다면 'chroot'를 사용하십시오. 완전한 재부팅을 시뮬레이션하려면 'kexec'를 사용하십시오.
답변1
나는 이것이 가능하다고 생각하지 않습니다.
이론적으로 당신이 하고 싶은 일은 다음과 같습니다:
- 를 사용하여 시스템을 "단일" 실행 수준으로 이동합니다
init 1
. 여기서는 이론적으로 init 및 bash만 실행됩니다. - / 를 제외한 모든 파티션을 마운트 해제합니다. 이 시점에서 /usr이 루트 파티션에 있는지 여부에 따라 시스템 작동이 중지될 수 있습니다.
- 다른 OS의 루트를 어딘가에 마운트하십시오.
- ivot_root는 루트를 새 파티션으로 변경합니다.
init 5
init에게 실행 (또는 2 또는 적절한 것)을 통해 새 시스템을 시작하도록 지시합니다 .
문제는ivot_root가 현재 프로세스의 루트 파티션만 변경한다는 것입니다. 이는 init에 영향을 미치지 않으며 init에게 시스템을 시작하라고 지시하면 이전 프로세스가 시작된다는 것을 의미합니다. init에게 Pivot_root를 수행하도록 지시하는 방법이 필요합니다. 제 생각에는 불가능합니다.
아, 그리고 다른 OS가 다른 초기화 서비스를 사용할 때 무슨 일이 일어나는지는 다루지 않겠습니다(예: Ubuntu가 시작되는 동안 Fedora는 systemd를 사용합니다). 커널 아래의 init 프로세스(pid 1)를 교체해야 하는데 이는 실제로는 불가능합니다.
답변2
다른 커널을 실험하려면 재부팅하거나 가상 머신에서 실행해야 합니다. 가상 머신이 더 편리하지만 실제 하드웨어에서 커널을 테스트할 수는 없습니다.
서로 다른 설치된 프로그램 세트로 서로 다른 설정을 원하는 경우 가상 머신을 사용할 수도 있습니다. 가상 머신의 오버헤드를 피하려면 다음 위치에 배포판을 설치할 수 있습니다.chroot. 나는 종종 64비트 설치에서 32비트 프로그램에 쉽게 액세스하거나 안정적인 릴리스(예: Debian stable) 외에 최신 항목(예: Debian 불안정)을 갖기 위해 그렇게 합니다. 나는 썼다대체 Debian/Ubuntu 릴리스에 대한 chroot 설정 가이드. 또한보십시오경량의 격리된 Linux 환경
답변3
만약 너라면~하지 않다커널을 변경하고 싶거나 필요하지만 여기에 표시된 것처럼 다른 파일 시스템을 사용하고 싶습니다.
분명히 커널은 변경되지 않지만 괜찮습니다. 작업 파티션만 변경하고 싶습니다.
그렇다면 아마도 (마운트 및) chroot가 필요할 것입니다.
이는 루트 파티션을 즉석에서 변경하는 것으로 생각할 수 있습니다.
나는 일반적으로 다른 커널로 사용되는 파일 시스템과 상호 작용하기 위해 복구 시스템(예: clonezilla)에서 항상 chroot를 사용합니다. 새 커널 모듈을 로드하는 것과 같은 작업을 수행할 수 있을 것으로 기대하지는 않지만 파일을 읽고 쓰는 데는 괜찮습니다(fstab 수정, grub.conf 조정 등).
바인드 마운트를 사용하여 chroot 환경을 더욱 유용하게 만들 수 있습니다. 나는 chroot 대상 내부에 마운트된 파일 시스템을 복제하기 위해 항상 이것을 사용합니다:
mount /dev/sda1 /mnt
for d in dev sys proc; do mount -obind /$d /mnt/$d; done
chroot /mnt