Linux: восстановить grub после установки Windows

Автор: | 30/06/2016

linux_logoИмеется ноутбук, на котором была установлена Ubuntu 14.04, после чего на отдельный раздел диска была установлена Windows.

Для Ubuntu раздел /boot вынесен в отдельный раздел, а /home и / установлены в группе разделов под LVM:

# lvdisplay --columns
  LV   VG         Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert
  home kubuntu_vg -wi-ao--- 470,00g                                           
  root kubuntu_vg -wi-ao---  30,00g

Полное описание установки – в посте Debian: ручная разбивка диска с fdisk, создание разделов LVM и установка системы.

Таблица разделов выглядит следующим образом:

# fdisk -l

Disk /dev/sda: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders, total 1250263728 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6fa60981

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     4196351     2097152   83  Linux
/dev/sda2         4196352    37750783    16777216   82  Linux swap / Solaris
/dev/sda3        37750784  1086326783   524288000   83  Linux
/dev/sda4   *  1086326784  1250260991    81967104    7  HPFS/NTFS/exFAT
  • /dev/sda4  – загрузочный раздел Windows;
  • /dev/sda1 – раздел /boot;
  • /dev/sda3 – физический раздел LMV:
# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda3
  ...

Загружаемся с любого Linux LiveCD и подключаем группу разделов:

# vgchange -a kubuntu_vg
  2 logical volume(s) in volume group "kubuntu_vg" now active

Проверяем пути к Logical Volume:

# lvdisplay -c
  /dev/kubuntu_vg/root:kubuntu_vg:3:1:-1:1:62914560:7680:-1:0:-1:252:0
  /dev/kubuntu_vg/home:kubuntu_vg:3:1:-1:1:985653248:120319:-1:0:-1:252:1

И сами блочные устройства:

# ls -l /dev/kubuntu_vg/
total 0
lrwxrwxrwx 1 root root 7 Jun 30  2016 home -> ../dm-1
lrwxrwxrwx 1 root root 7 Jun 30  2016 root -> ../dm-0

Монтируем старый корневой раздел:

# mount /dev/kubuntu_vg/root /mnt/

Монтируем старый загрузочный раздел:

# mount /dev/sda1 /mnt/boot/

Подключаем (с опцией --bind) каталоги /dev, /proc и /sys из текущей системы – в каталог /mnt:

# mount --bind /dev/ /mnt/dev
# mount --bind /proc/ /mnt/proc/
# mount --bind /sys/ /mnt/sys/

Проверяем содержимое каталога /mnt – тут сейчас должна содержаться вся (почти – /dev и т.д. мы монтировали из текущей системы, т.к. они заполняются ядром во время загрузки) старая система:

# ls -l /mnt/
total 128
-rw-r--r--   1 root root     0 May 22 16:53 0
drwxr-xr-x   2 root root  4096 May  4 18:23 bin
drwxr-xr-x   4 root root  4096 May 21 18:55 boot
drwxrwxr-x   2 root root  4096 Mar  7 19:29 cdrom
drwxr-xr-x  19 root root  4840 Jun 30  2016 dev
drwxr-xr-x 155 root root 12288 Jun 15 07:21 etc
drwxrwxr-x   2 root root  4096 Mar  7 19:27 home
lrwxrwxrwx   1 root root    32 May 13 06:22 initrd.img -> boot/initrd.img-4.2.0-36-generic
lrwxrwxrwx   1 root root    32 Apr 17 10:47 initrd.img.old -> boot/initrd.img-4.2.0-35-generic
drwxr-xr-x  26 root root  4096 May 13 06:19 lib
drwxr-xr-x   2 root root  4096 Apr 17 10:39 lib32
drwxr-xr-x   2 root root  4096 Feb 17 23:12 lib64
drwx------   2 root root 16384 Mar  7 19:27 lost+found
drwxr-xr-x   5 root root  4096 Apr  8 21:17 media
drwxr-xr-x   3 root root  4096 Apr  8 21:10 mnt
drwxr-xr-x   6 root root  4096 May 22 16:53 opt
drwxr-xr-x   2 root root  4096 Apr 10  2014 proc
drwx------   7 root root  4096 Jun 13 09:09 root
drwxr-xr-x  11 root root  4096 Feb 17 23:19 run
drwxr-xr-x   2 root root 12288 May 13 06:17 sbin
drwxr-xr-x   2 root root  4096 Feb 17 23:11 srv
drwxr-xr-x   2 root root  4096 Mar 13  2014 sys
drwxrwxrwt  15 root root 20480 Jun 15 07:21 tmp
drwxr-xr-x  11 root root  4096 Apr 17 10:39 usr
drwxr-xr-x  13 root root  4096 Feb 17 23:23 var
lrwxrwxrwx   1 root root    29 May 13 06:22 vmlinuz -> boot/vmlinuz-4.2.0-36-generic
lrwxrwxrwx   1 root root    29 Apr 17 10:47 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic

Проверяем /boot:

# ls -l /mnt/boot/
total 125712
-rw-r--r-- 1 root root  1312645 Mar 11 13:17 abi-4.2.0-34-generic
-rw-r--r-- 1 root root  1313029 Mar 18 18:14 abi-4.2.0-35-generic
-rw-r--r-- 1 root root  1313407 May 13 21:55 abi-4.2.0-36-generic
-rw-r--r-- 1 root root   184896 Mar 11 13:17 config-4.2.0-34-generic
-rw-r--r-- 1 root root   184896 Mar 18 18:14 config-4.2.0-35-generic
-rw-r--r-- 1 root root   184896 May 13 21:55 config-4.2.0-36-generic
drwxr-xr-x 5 root root     4096 May 21 18:55 grub
-rw-r--r-- 1 root root 30528342 Apr 17 10:36 initrd.img-4.2.0-34-generic
-rw-r--r-- 1 root root 30002777 Apr 17 10:49 initrd.img-4.2.0-35-generic
-rw-r--r-- 1 root root 31654405 May 21 18:55 initrd.img-4.2.0-36-generic
drwx------ 2 root root    16384 Mar  7 19:27 lost+found
-rw-r--r-- 1 root root   176500 Mar 12  2014 memtest86+.bin
-rw-r--r-- 1 root root   178176 Mar 12  2014 memtest86+.elf
-rw-r--r-- 1 root root   178680 Mar 12  2014 memtest86+_multiboot.bin
-rw------- 1 root root  3757656 Mar 11 13:17 System.map-4.2.0-34-generic
-rw------- 1 root root  3758162 Mar 18 18:14 System.map-4.2.0-35-generic
-rw------- 1 root root  3758996 May 13 21:55 System.map-4.2.0-36-generic
-rw------- 1 root root  6716080 Mar 11 13:17 vmlinuz-4.2.0-34-generic
-rw------- 1 root root  6731856 Mar 18 18:14 vmlinuz-4.2.0-35-generic
-rw------- 1 root root  6732816 May 13 21:55 vmlinuz-4.2.0-36-generic

С помощью chroot меняем свой текущий корневой раздел на каталог /mnt:

# chroot /mnt/

Генерируем новый grub.cfg, что бы в него добавился раздел с Windows:

# update-grub
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.2.0-36-generic
Found initrd image: /boot/initrd.img-4.2.0-36-generic
Found linux image: /boot/vmlinuz-4.2.0-35-generic
Found initrd image: /boot/initrd.img-4.2.0-35-generic
Found linux image: /boot/vmlinuz-4.2.0-34-generic
Found initrd image: /boot/initrd.img-4.2.0-34-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
Found Windows 7 (loader) on /dev/sda4
done

Примечание: update-grub, update-grub2 и grub-mkconfig – одно и то же:


update-grub, update-grub2 – stub for grub-mkconfig
update-grub is a stub for running grub-mkconfig -o /boot/grub/grub.cfg to generate a grub2 config file.

Проверяем конфиг:

# cat boot/grub/grub.cfg | grep 'Windows\|Ubuntu'
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-32311065-7026-48ca-ad76-5edd64ef9e28' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-36-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-36-generic-advanced-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-36-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-36-generic-recovery-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-advanced-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-recovery-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-34-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-34-generic-advanced-32311065-7026-48ca-ad76-5edd64ef9e28' {
	menuentry 'Ubuntu, with Linux 4.2.0-34-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-34-generic-recovery-32311065-7026-48ca-ad76-5edd64ef9e28' {
menuentry 'Windows 7 (loader) (on /dev/sda4)' --class windows --class os $menuentry_id_option 'osprober-chain-4A50CF6C50CF5D77' {

Подробнее про двойную загрузку Linux + Windows и файл grub.cfg – в посте Linux: изменить порядок загрузки в GRUB.

Устанавливаем grub:

# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

Выходим из chroot-окружения по Ctrl+D и отмонтируем всё:

# umount /mnt/proc 
# umount /mnt/dev 
# umount /mnt/sys 
# umount /mnt/boot
# umount /dev/kubuntu_vg/root

Готово. Выполняем reboot, загружаемся с жесткого диска – и получаем обратно grub с Windows в опциях.