Tenho uma caixa virtual em execução com CentOS.
Anexei um novo disco virtual à VM CentOS existente e estou agora tentando instalar o GRUB neste disco recém-anexado.
Posteriormente, apresentarei uma segunda VM com um disco rígido inicializável recém-preparado com um sistema de arquivos raiz personalizado e kernel.
I tentei as seguintes etapas:
- Anexe um novo disco virtual à máquina CentOS existente em funcionamento.
- Criou uma nova partição com
fdisk /dev/sdb
. Durante o particionamento, escolhi as opções partição primária, partição número 1 e outras opções padrão. - Formatei o disco com
mkfs.ext3 /dev/sdb1
. - Montado o disco em
/media/new_drive
. - GRUB instalado
grub-install /dev/sdb1 --root-directory=/media/new_drive/
.
Depois disso, a segunda VM com o disco rígido recém-preparado não inicializou; Recebi o erro: could not read from the boot medium
. Parece que o MBR não é atualizado após grub-install
, mas posso ver o GRUB instalado em /boot/grub
na nova unidade.
Mas o pior é que ele corrompeu meu CentOS GRUB existente: o CentOS VM trava mostrando uma tela preta com o único texto sendo GRUB
.
Por que grub-install /dev/sdb1
não modifica o MBR de sdb1? Esta não é a maneira certa de instalar o GRUB na nova unidade?
Comentários
Resposta
Não sou um especialista em grub2 (desculpe), mas tente adicionar --skip-fs-probe
para sua linha grub-install, descobri que isso impede a criação de /boot/grub/device.map
que pode causar a inicialização em um prompt do grub. Acho que sem isso parâmetro grub-install, em vez de fazer o que você diz, pensa que é mais inteligente do que você e pode fazer algo diferente.
Outra coisa é ter certeza de que você está usando o grub-install correto (ou seja, para grub2 e não para o grub original). Não é um problema se você estiver dentro do Centos, mas com SystemRecoveryCD as duas versões estão disponíveis e então você deve usar grub2-install
. Aprendi da maneira mais difícil …
E como @wurtel apontou (parabéns), você deve especificar uma unidade, não uma partição. O Grub2 é instalado no setor 0 de toda a unidade de disco, e este “stub” é o que é executado no momento da inicialização, mas ele precisa saber a localização no disco e deve instalar os arquivos para o próximo estágio de inicialização – é isso que o --root-directory
parâmetro é para. (Eu acho.)
Lendo man grub-install
e pesquisando no Google, vejo que --root-directory
não deve ser usado para grub2 versões 1.99 ++, embora funcione na minha experiência. Você deve usar --boot-directory
e referir-se ao diretório de inicialização real, então isso lhe daria:
grub-install /dev/sdb --skip-fs-probe --boot-directory=/media/new_drive/boot
Comentários
- Minha primeira tentativa foi sem particionar e formatar
grub-install /dev/sdb
, mas deu um erro. Mais tarde, tentei com disco particionado e formatado, com disco formatado que sempre estava usando / dev / sdb1, vou tentar junto com –skip-fs-probe - @Renjith oh e o diretório raiz deve se referir a o ponto de montagem montado quando você executa grub-install, então você precisa montar a partição no novo drive, por exemplo em
/mnt/sys2
e, em seguida, em sua linha grub-install, especifique--root-directory=/mnt/sys2
. É ‘ é contra-intuitivo (como muitas coisas grub, eu acho), mas ‘ é como funciona. - editei minha resposta um pouco …
- O grub agora estou usando 0,97, que não ‘ suporta –skip-fs-probe . mas sem isso funcionou. sdb1 foi o erro.
- ok, fico feliz por você ter resolvido, esse é um grub antigo, não o mais novo ‘ brilhante ‘ grub2. Eu não ‘ não percebi que RedHat era tão lento para mudar para grub2. CentOS 7 usa grub2, mas CentOS 6 (e anteriores) usa grub.
Resposta
Foi assim que movi uma instalação Debian que consistia em uma partição de boot /boot
e uma partição raiz /
para uma nova unidade e a tornou inicializável usando o GNU GRUB :
Clonar partições
- Usando o CD ao vivo GParted , crie a partição de inicialização e raiz no novo .
- Usando um console raiz no GParted, monte a partição de inicialização antiga (digamos “s
/dev/sda1
) e a nova partição (/dev/sdb1
):mount /dev/sda1 /mnt/oldBoot && mount /dev/sdb1 /mnt/newBoot
- Copie os dados da partição de inicialização antiga para a nova:
cp -afv /mnt/oldBoot /mnt/newBoot
. Explicação decp -afv
:-
a
significa ” arquivo ” que significa:- não desreferencie links
- copie recursivamente (como
-R
) - preservar todos os atributos (carimbo de data / hora, proprietário, permissão)
-
f
: force, se um arquivo de destino existente não pode ser aberto, remova-o e tente novamente -
v
: detalhado, explique o que está sendo feito
-
- Isso irá gerar alguma saída em seu console, mostrando qual arquivo está copiado atualmente e se
cp
faz progresso - Monte e copie os arquivos de sua partição raiz antiga para a nova:
- Por segurança:
umount /mnt/oldBoot && umount /mnt/newBoot
- Monte a partição raiz antiga e a nova (assumindo que “s
/dev/sda2
e/dev/sdb2
):mount /dev/sda2 /mnt/oldRoot && mount /dev/sdb2 /mnt/newRoot
- Copie o dat uma da partição raiz antiga para a nova partição raiz:
cp -afv /mnt/oldRoot /mnt/newRoot
- Por segurança:
- Edite o tabela do sistema de arquivos que define quais partições são montadas na inicialização (vou usar o Vim para isso):
-
vi /etc/fstab
-
Você notará que suas partições antigas são referenciadas aqui. Em vez disso, use os UUIDs das novas partições
-
Você pode inserir temporariamente todos os UUIDs no fstab para copiar e colar mais facilmente com
:r !blkid
-
Use os UUIDs de suas novas partições para alterar as entradas no fstab. Eles devem se parecer com isto:
`# <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`
- Remova a saída de
blkid
do fstab que você inseriu anteriormente com:r !blkid
- Remova a saída de
-
Instalar GRUB
-
Monte os sistemas de arquivos virtuais do live CD do GParted:
mount --bind /dev /mnt/newRoot/dev mount --bind /proc /mnt/newRoot/proc mount --bind /sys /mnt/newRoot/sys
-
Make os utilitários GRUB do live CD GParted disponíveis para a partição raiz:
mount --bind /usr/ /mnt/newRoot/usr
-
Monte a partição de inicialização na partição raiz desde o GRUB armazenará sua configuração em
/boot
:mount /dev/sdb1 /mnt/newRoot/boot
-
Use
chroot /mnt/newRoot
para tornar a nova partição raiz temporariamente a raiz do sistema de arquivos -
Crie um arquivo de configuração GRUB em
/boot/grub/grub.cfg
usandoupdate-grub2
-
Instale o GRUB na nova unidade:
grub-install /dev/sdb
. Você não deve especificar um número de partição aqui -
Retorne ao sistema de arquivos do live CD GParted:
exit
-
Desmonte partições:
umount /mnt/newRoot/*
-
Desligue a máquina
-
Se você tiver várias unidades conectadas, certifique-se de que a unidade mais recente venha primeiro na ordem de inicialização
-
Iniciar máquina
Estas instruções são inspiradas nas de oaktreepeak.com .
Como alternativa, você pode fornecer Clonezilla uma tentativa de conseguir o mesmo.
/dev/sdb1
não é onde o BIOS procura MBR, ele ‘ está em/dev/sdb
, ou seja, no primeiro setor do disco.grub-install /dev/sdb --root-directory=/media/new_drive/
em vez de sdb1