Добрый день, подскажите пожалуйста по следующей проблеме.
Хочу сделать отказоустойчивую систему на Ubuntu server, с программным рейдом на разделе с системой и данными (mdadm)
Система будет на Microserver с 2 HDD, аппаратный рейд которого не очень дружит с Ubuntu.
"Отказоустойчивость" в моем понимании, будет заключаться в том, что при отказе первого диска, я достаю его, вставляю на его место диск из второго слота - и система работает как раньше.
Затем я беру новый диск - вставляю его в слот 2, копирую туда загрузчик и систему и у меня опять "отказоустойчивая" система.
Как я это вижу:
В рейде будет лишь один раздел (
sda2) с системой и данными (весь корневой каталог /) без папки boot
Загрузчик будет на отдельном разделе
sda1 на каждом диске.
С созданием рейда, думаю проблем не возникнет. В дальнейшем для добавления рейда понадобится поменять в fstab и grub.cfg /dev/sda2 на /dev/md0 и добавить insmod mdraid1x в grub.cfg.
Сначала устанавливаю систему без рейд-массива, чтобы проверить, будет ли все работать на любом из жестких дисков.
Начинаю установку Ubuntu server 16.04 на диск1 (sda) (для примера его размер 500гб)
Во время установки разбиваю диск на 3 раздела и форматирую его следующим образом:
sda1 /boot ext4 - 0.5 gb - загрузочный раздел
sda2 / ext4 - 450 gb - система и данные
sda3 - 2gb - своп
После установки системы настраиваю ее, как мне нужно.
Потом правлю fstab
/etc/fstabПривожу его к виду
/dev/sda2 / ext4 errors=remount-ro 0 1
/dev/sda1 /boot ext4
/dev/sda3 swap
В моем случае UUID у разделов такие:
67a1d760-755d-41ef-a5c5-993f040719a7 - это раздел /dev/sda1
02d28846-9ccc-410b-8171-6e25df72fd83 - это раздел /dev/sda2
Правлю
grub.cfg дефолтовый grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_msdos
insmod ext2
set root='hd0,msdos2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2 02d28846-9ccc-410b-8171-6e25df72fd83
else
search --no-floppy --fs-uuid --set=root 02d28846-9ccc-410b-8171-6e25df72fd83
fi
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=ru_RU
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
set timeout=30
else
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=2
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=2
fi
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-02d28846-9ccc-410b-8171-6e25df72fd83' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 67a1d760-755d-41ef-a5c5-993f040719a7
else
search --no-floppy --fs-uuid --set=root 67a1d760-755d-41ef-a5c5-993f040719a7
fi
linux /vmlinuz-4.4.0-83-generic root=UUID=02d28846-9ccc-410b-8171-6e25df72fd83 ro
initrd /initrd.img-4.4.0-83-generic
мой grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_msdos
insmod ext2
[b]set root='(hd0,1)'[/b]
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2 02d28846-9ccc-410b-8171-6e25df72fd83
else
search --no-floppy --fs-uuid --set=root 02d28846-9ccc-410b-8171-6e25df72fd83
fi
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=ru_RU
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
set timeout=30
else
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=2
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=2
fi
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-02d28846-9ccc-410b-8171-6e25df72fd83' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 67a1d760-755d-41ef-a5c5-993f040719a7
else
search --no-floppy --fs-uuid --set=root 67a1d760-755d-41ef-a5c5-993f040719a7
fi
linux /vmlinuz-4.4.0-83-generic root=/dev/sda2 ro
initrd /initrd.img-4.4.0-83-generic
Сначала поменял все UUID на /dev/sda1 и /dev/sda2 но грузиться перестало, поэтому ограничился частичной заменой.
Затем подключаю к серверу во второй слот диск2 (sdb).
Копирую туда разделы с диск1 (sda)
sudo sfdisk -d /dev/sda> partition.txt
sudo sfdisk --force /dev/sdb <partition.txt
Форматирую разделы, также как на sda.
Потом копирую загрузочный раздел c sda на sdb
dd if=/dev/sda1 of=/dev/sdb1 bs=10M
Устанавливаю загрузчик на
sdbsudo mkdir /tmp/mntroot
sudo mount /dev/sdb1 /tmp/mntroot
sudo grub-install --root-directory=/tmp/mntroot /dev/sdb
sudo umount /tmp/mntroot
Копирую корневой раздел / с
sda2 на
sdb2sudo mkdir /tmp/mntroot1
sudo mount /dev/sdb2 /tmp/mntroot1
sudo rsync -auHxv --exclude=/proc/* --exclude=/boot/* --exclude=/sys/* --exclude=/tmp/* /* /tmp/mntroot1/
sudo umount /tmp/mntroot1
После этого выключаю сервер, достаю диск1, на его место вставляю диск2 и система загружается.
На практике, после всех вышеописанных действий со второго жесткого диска грузится только командная строка GNU GRUB.
Скорее всего из за криво исправленного grub.cfg
В мануале про Grub2 вообще написано grub.cfg руками не трогать.
Может у меня вообще принципиально неправильный подход и есть более простые решения?
Спасибо!