CentOS를 실행하는 가상 머신이 있습니다.
기존 CentOS VM에 새 가상 디스크를 연결했으며 이제 새로 연결된 이 디스크에 GRUB를 설치하려고 합니다.
나중에 새로 준비된 부팅 가능한 하드 드라이브와 사용자 정의 루트 파일 시스템 및 커널을 사용하여 두 번째 가상 머신을 시작하겠습니다.
다음 단계를 시도했습니다.
- 기존 작동 중인 CentOS 머신에 새 가상 디스크를 연결합니다.
- 새로운 파티션이 생성됩니다
fdisk /dev/sdb
. 파티션을 나눌 때 옵션 기본 파티션 및 파티션 번호 1과 같은 기본 옵션을 선택했습니다. - 디스크 포맷을 사용하세요
mkfs.ext3 /dev/sdb1
. - 디스크를 에 마운트합니다
/media/new_drive
. - GRUB이 설치되었습니다
grub-install /dev/sdb1 --root-directory=/media/new_drive/
.
그 후 새로 준비된 하드 드라이브가 있는 두 번째 가상 머신이 부팅되지 않습니다. 오류가 발생합니다 could not read from the boot medium
. MBR이 업데이트되지 않은 것 같지만 새 드라이브에 grub-install
GRUB가 설치된 것을 볼 수 있습니다 ./boot/grub
하지만 무엇보다도 최악은 기존 CentOS GRUB이 손상되었다는 것입니다. CentOS VM이 중단되고 검은색 화면이 표시되고 유일한 텍스트는 GRUB
.
grub-install /dev/sdb1
sdb1의 MBR을 수정하지 않는 이유는 무엇입니까 ? 이것이 새 드라이브에 GRUB를 설치하는 올바른 방법이 아닙니까?
답변1
저는 grub2 전문가는 아닙니다(죄송합니다). 하지만 grub-install 행에 추가하면 grub 프롬프트로 부팅될 수 있는 파일이 생성되는 것을 --skip-fs-probe
방지할 수 있다는 것을 발견했습니다 . /boot/grub/device.map
이 매개변수가 없으면 grub-install은 사용자가 말한 대로 수행하지 않지만 자신이 사용자보다 더 똑똑하고 다른 작업을 수행할 수 있다고 생각합니다.
또 다른 사항은 올바른 grub 설치를 사용하는지 확인하는 것입니다(즉, 원래 grub이 아닌 grub2의 경우). Centos 내부에서는 문제가 되지 않지만 SystemRecoveryCD를 사용하면 두 버전 모두 사용할 수 있으므로 grub2-install
.
@wurtel이 지적했듯이 파티션이 아닌 드라이브를 지정해야 합니다. Grub2는 전체 디스크 드라이브의 섹터 0에 설치됩니다. 이 "스텁"은 부팅 시 실행되지만 다음 부팅 단계를 위해 파일을 설치하려면 디스크의 위치를 알아야 합니다. 이것이 바로 매개변수입니다. --root-directory
을 위한. (제 생각에는.)
읽고 인터넷 검색을 통해 grub2 버전 1.99++에서는 실제로 작동하지 않는다는 man grub-install
것을 알았습니다 --root-directory
. 하지만 제 경험으로는 작동했습니다. 실제 부팅 디렉터리를 사용 --boot-directory
하고 참조해야 하므로 다음이 제공됩니다.
grub-install /dev/sdb --skip-fs-probe --boot-directory=/media/new_drive/boot
답변2
부팅 파티션 과 루트 파티션 /boot
으로 구성된 데비안 설치를 /
새 드라이브로 옮겨 부팅 가능하게 만든 방법은 다음과 같습니다.GNU 그럽:
파티션 복제
- 사용GParted 라이브 CD, 새 드라이브에 부팅 및 루트 파티션을 만듭니다.
- GParted의 루트 콘솔을 사용하여 이전 부팅 파티션(이라고 가정
/dev/sda1
)과 새 파티션(/dev/sdb1
)을 마운트합니다.mount /dev/sda1 /mnt/oldBoot && mount /dev/sdb1 /mnt/newBoot
- 이전 부팅 파티션에서 새 부팅 파티션으로 데이터 복사: .
cp -afv /mnt/oldBoot /mnt/newBoot
:cp -afv
a
"아카이브"를 의미하며 다음을 의미합니다.- 링크를 역참조하지 마세요
- 재귀적 복사(예
-R
: ) - 모든 속성(타임스탬프, 소유자, 권한)을 유지합니다.
f
: 필수, 기존 대상 파일을 열 수 없으면 삭제하고 다시 시도하세요.v
: 진행 중인 작업을 상세하게 설명합니다.
cp
그러면 현재 복사된 파일과 진행 상황 을 보여주는 출력이 콘솔에 생성됩니다.- 이전 루트 파티션의 파일을 마운트하고 새 루트 파티션에 복사합니다.
- 안전을 위해:
umount /mnt/oldBoot && umount /mnt/newBoot
- 이전 및 새 루트 파티션을 마운트합니다(
/dev/sda2
AND 가정/dev/sdb2
).mount /dev/sda2 /mnt/oldRoot && mount /dev/sdb2 /mnt/newRoot
- 이전 루트 파티션의 데이터를 새 루트 파티션에 복사합니다.
cp -afv /mnt/oldRoot /mnt/newRoot
- 안전을 위해:
- 편집하다파일 시스템 테이블시작 시 마운트할 파티션을 정의합니다(이 작업에는 Vim을 사용하겠습니다).
vi /etc/fstab
여기서는 이전 파티션이 참조된다는 것을 알 수 있습니다. 새 파티션의 UUID 사용
더 쉽게 복사하고 붙여넣을 수 있도록 모든 UUID를 fstab에 일시적으로 삽입할 수 있습니다.
:r !blkid
새 파티션의 UUID로 fstab의 항목을 변경합니다. 다음과 같아야 합니다.
# <file system> <mount point> <type> <options> <dump> <pass> # Root partition UUID=76fd1ffd-fb96-4ab4-be1a-42f8e9223983 / ext4 errors=remount-ro 0 1 # Boot partition UUID=e560e29e-8752-4b83-b1ee-4b86c0009f0b /boot ext2 defaults 0 2
blkid
이전에 삽입한 fstab에서 출력 제거:r !blkid
GRUB 설치
- GParted Live CD의 가상 파일 시스템을 마운트합니다:
mount --bind /dev /mnt/newRoot/dev
mount --bind /proc /mnt/newRoot/proc
mount --bind /sys /mnt/newRoot/sys
- GParted live CD의 GRUB 유틸리티를 루트 파티션에서 사용할 수 있도록 만듭니다.
mount --bind /usr/ /mnt/newRoot/usr
- GRUB는 구성을 다음 위치에 저장하므로 부팅 파티션을 루트 파티션에 마운트합니다
/boot
.mount /dev/sdb1 /mnt/newRoot/boot
chroot /mnt/newRoot
새 루트 파티션을 임시로 파일 시스템의 루트로 만드는 데 사용됩니다./boot/grub/grub.cfg
다음 명령을 사용하여 GRUB 구성 파일을 생성합니다.update-grub2
- 새 드라이브에 GRUB를 설치합니다
grub-install /dev/sdb
. 여기서는 파티션 번호를 지정할 수 없습니다. - GParted 라이브 CD의 파일 시스템을 반환합니다.
exit
- 파티션을 마운트 해제합니다.
umount /mnt/newRoot/*
- 셧다운 머신
- 여러 드라이브가 연결되어 있는 경우 최신 드라이브가 부팅 순서에서 첫 번째인지 확인하세요.
- 기계를 시작하세요
이 지침은 다음에서 영감을 얻었습니다.Oaktreepeak.com에서 가져온 내용.
아니면 줄 수도 있어요클론속같은 목표를 달성하려고 노력하십시오.