...зачем постоянно обновлять конфигурационный файл grub?
В том-то и беда, что система делает это самостоятельно. Например при обновлении ядра.
А для того, что нужно, как раз и существует файл 40_custom.
По аналогии с этим можно в файл 11_custom...
Хочу предостеречь. При совсем грубых ошибках update-grub создает новый конфиг с другим именем, а работать остается старый. Это хорошо.
Но в некоторых случаях сооздается новый конфиг с ошибками. В результате, появляется часть меню только до места ошибки.
Если ошибка окажется в файле 11_*, то большая часть меню окажется недоступной. Поэтому советую в файл 11_* помешать хорошо проверенный код и желателно не ошибаться.
Если ссылки, генерируемые скриптом 30_os-prober вам не нужны, то можно удалить этот пакет. Быстрее происходит генерация, меньше шанс ошибок.
У меня этот пакет удален.
Еще замечание. В файле 40_* можно переопределить то, что сделано скриптами до него, не вмешиваясь в код этих скриптов.
Исходя из сказанного, существующие скрипты не трогаю. Создаю свои.
08_hostname. Здесь обычно ссылки конкретно для этого компьютера. Пример моего файла:
#!/bin/sh
# /etc/grub.d/08_hp625 19.05
exec tail -n +6 $0
# Not change the 'exec tail' line above.
# To add hp625 menu entries, type the menu entries after this comment.
color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
timeout_style=menu; timeout=2
submenu 'hp625 menu >>' {
color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
src='hit320_3'; key="elevator=noop quiet --"
insmod gzio
menuentry "Ubuntu, with Linux 4.18.0-15-generic [$src]" --class ubuntu --class gnu-linux --class gnu --class os {
key="forcepae root=LABEL=${src} ${key}"; version='-4.18.0-15-generic'
search -n -s -l ${src}
linux /boot/vmlinuz${version} ${key}
initrd /boot/initrd.img${version}
}
menuentry "Linux [$src]" --class ubuntu --class gnu-linux --class gnu --class os {
key="root=LABEL=${src} fastboot noresume ${key}"
savedefault
search -n -s -l ${src}
linux /vmlinuz ${key}
initrd /initrd.img
}
submenu "Linux [$src] live" {
src='/opt'; key="boot=casper cdrom-detect/try-usb=true noprompt ${key}"
#version='.efi'
root='x'; search -n -s -f "${src}/casper/vmlinuz${version}"
if [ "${root}" = 'x' ]
then src='Linux live'
else key="ignore_uuid live-media-path=${src}/casper ${key}"
if [ -e "${src}/casper-rw" ]; then key="persistent persistent-path=${src} ${key}"; fi
if [ -e "${src}/casper/initrd${version}" ]; then avinit="initrd ${src}/casper/initrd${version}"; else avinit="initrd ${src}/casper/initrd.lz"; fi
avload='linux'; src="${src}/casper/vmlinuz${version} ${key}"
fi
if [ "${root}" = 'x' ]; then msg="$src not exist!"; else if [ -z "${msg}" ]; then msg="Load $src from $root"; fi; fi
echo "$msg"; sleep -v 1
if [ -n "${avload}" ]; then ${avload} ${src}; fi
if [ -n "${avinit}" ]; then ${avinit}; fi
}
submenu 'Windows 7 [hit320_2]' --class windows --class os {
src='/bootmgr2'; insmod ntfs
root='x'; search -n -s -f ${src}
if [ ${root} = x ]; then msg="$src not exist!"; else msg="Load $src from $root"; avload='ntldr'; fi
if [ -n "${avload}" ]; then ${avload} ${src}; fi
}
}
Здесь-же ответ на вопрос:
не уверен что груб умеет грузиться с симлинков...
Умеет. Второй пункт как раз так грузит установленную Ubuntu с последним установленным ядром и параматрами, которые я задал.
Обычно я не удаляю ядро, с которым устанавливалась система. Первый пункт загружает систему с этим ядром и минимумом параметров.
Третий пункт - для загрузки установленной системы как "живой" из каталога /opt. Будет проведен поиск по всем разделам. Где найдет, оттуда и загрузится.
Для этого в ней сделаны небольшие изменения.
Второй файл - 40_flash. В нем более универсальные пункты загрузки, чаще применяемые на мультизагрузочной флешке. Но и на установленной системе нередко приходятся очень кстати.
Приведу его фрагмент:
#!/bin/sh
# /etc/grub.d/40_flash 18.
exec tail -n +6 $0
# Not change the 'exec tail' line above.
# To add flash menu entries, type the menu entries after this comment.
color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
submenu 'Flash menu >>' {
color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
default='*buntu live'; fallback='*buntu live'; timeout=4
submenu '*buntu live' {
iso_path='/opt/rescatux-0.51b3.iso'
iso_path='/opt/super_grub2_disk_x86_64_efi_2.02s10.iso'
iso_path='/opt/runtu-lite-18.04.1-amd64_20180801.iso'
iso_path='/opt/ubuntu-10.04.4-desktop-i386.iso'
iso_path='/opt/ubuntu-16.04.4-desktop-amd64.iso'
iso_path='/opt/ubuntu-18.04-desktop-amd64.iso'
src='/opt/ub18'; key="boot=casper cdrom-detect/try-usb=true noprompt quiet --"
#version='.efi'
#insmod regexp; insmod part_gpt
root='x'; search -n -s -f "${iso_path}"
if [ "${root}" = 'x' ]
then if regexp "buntu-16.04.4" "${iso_path}"; then src='/opt/ub16'; fi
if regexp "buntu-10" "${iso_path}"; then src='/opt/ub10'; fi
search -n -s -f "${src}/casper/vmlinuz${version}"
if [ "${root}" = 'x' ]
then src='*buntu live'
else key="elevator=noop ignore_uuid live-media-path=${src}/casper ${key}"
if [ -e "${src}/casper-rw" ]; then key="persistent persistent-path=${src} ${key}"; fi
if regexp "buntu-18" "${iso_path}"; then key="--version=0 systemd.unit=avn.target ${key}"; fi
if regexp "buntu-16" "${iso_path}"; then key="--version=016 systemd.unit=avn.target ${key}"; fi
if regexp "buntu-10" "${iso_path}"; then key="--version=0 4 i915.modeset=1 ${key}"; fi
if [ -e "${src}/casper/initrd${version}" ]; then avinit="initrd ${src}/casper/initrd${version}"; else avinit="initrd ${src}/casper/initrd.lz"; fi
avload='linux'; src="${src}/casper/vmlinuz${version} ${key}"
fi
else msg="Load $iso_path from $root"
export iso_path; loopback loop ${iso_path}
root=(loop)
if [ -e "/boot/grub/loopback.cfg" ]
then avload='configfile'; src='/boot/grub/loopback.cfg'
else key="file=/cdrom/preseed/ubuntu.seed iso-scan/filename=${iso_path} ${key}"
if regexp "buntu-10" "${iso_path}"; then key="i915.modeset=1 ${key}"; fi
if [ -e "${src}/casper/initrd${version}" ]; then avinit="initrd ${src}/casper/initrd${version}"; else avinit="initrd ${src}/casper/initrd.lz"; fi
avload='linux'; src="${src}/casper/vmlinuz${version} ${key}"
fi
fi
if [ "${root}" = 'x' ]; then msg="$src not exist!"; else if [ -z "${msg}" ]; then msg="Load $src from $root"; fi; fi
echo "$msg"; sleep -v 4
if [ -n "${avload}" ]; then ${avload} ${src}; fi
if [ -n "${avinit}" ]; then ${avinit}; fi
}
submenu 'Linux on LABEL|UUID|DEV' --class ubuntu --class gnu-linux --class gnu --class os {
src='fuj120_1'
#key="fastboot forcepae noresume"
#version='-4.18.0-15-generic.efi.signed'; avload='/boot'
insmod part_gpt
#insmod part_msdos
insmod gzio
#insmod ext2
root='x'; search -n -s -l ${src}
if [ ${root} = x ]
then search -n -s -u ${src}
if [ ${root} = x ]
then search -n -s -f ${avload}/vmlinuz${version}
rootfs="root=/dev/${src}"
else rootfs="root=UUID=${src}"
fi
else rootfs="root=LABEL=${src}"
fi
if [ ${root} = x ]
then msg="${src} not exist!"; avload=''
else msg="Load ${src} from ${root} ${rootfs}"
if [ -e /boot/grub/grub.cfg ]
then avload='configfile'; src='/boot/grub/grub.cfg'
else avinit="initrd ${avload}/initrd.img${version}"; src="${avload}/vmlinuz${version} ${rootfs} ${key} quiet --"; avload='linux'
fi
fi
echo "${msg}"; sleep -v 4
if [ -n "${avload}" ]; then ${avload} ${src}; fi
if [ -n "${avinit}" ]; then ${avinit}; fi
}
submenu 'Windows' --class windows --class os {
src='/EFI/Microsoft/Boot/bootmgfw.efi'; root='x'
if [ ${grub_platform} = efi ]
then avload='chainloader'; insmod part_gpt; insmod fat; search -n -s -f ${src}
if [ ${root} = x ]; then src='/bootmgr.efi'; search -n -s -f ${src}; fi
else avload='ntldr'; insmod part_msdos; insmod ntfs; search -n -s -f ${src}
if [ ${root} = x ]
then src='/bootmgr'; search -n -s -f ${src}
if [ ${root} = x ]
then src='/ntldr'; search -n -s -f ${src}
if [ ${root} = x ]
then src='/MSDOS.SYS'; insmod fat; search -n -s -f ${src}
if [ ${root} = x ]
then src='/I386/SETUPLDR.BIN'
# insmod iso9660
# insmod udf
search -n -s -f ${src}
if [ ${root} = x ]
then src='/BCDW/LOADER.BIN'; search -n -s -f ${src}
if [ ${root} = x ]
then src='/opt/avndos.img'; search -n -s -f ${src}
if [ ${root} = x ]
then src='Windows'
else avinit="initrd16 $src"; avload='linux16'; src='/boot/syslinux/memdisk ima raw'
fi
fi
fi
else src='+1'; drivemap -s (hd0) ${root}
fi
fi
fi
fi
if [ "${src}" = "+1" ]; then avload='chainloader'; else insmod ${avload}; fi
fi
if [ ${root} = x ]
then msg="$src not exist!"; avload=''; avinit=''
else msg="Load $src from $root"
fi
echo "$msg"; sleep -v 4
if [ -n "${avload}" ]; then ${avload} ${src}; fi
if [ -n "${avinit}" ]; then ${avinit}; fi
}
}
Первый пункт - загрузка Ubuntu из исо-образа. Если образ не найден, то загрузка "живой Ubuntu" из каталога.
Второй - загрузка установленной системы. В переменной src задано что искать. Это может быть метка тома, УУИД, каноническое имя раздела.
Третий - загрузка "любой" Windows.
Все пункты осуществляют поиск систем по всем разделам. Будет загружена первая найденая система, удовлетворяющая условиям помска Для меня такой вариант более удобен.