Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Универсальный загрузчик на Ubuntu 16  (Прочитано 1733 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн regs2006

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Добрый день, подскажите пожалуйста по следующей проблеме.
Хочу сделать отказоустойчивую систему на 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

Устанавливаю загрузчик на sdb

Цитировать
sudo mkdir /tmp/mntroot
sudo mount /dev/sdb1 /tmp/mntroot
sudo grub-install --root-directory=/tmp/mntroot /dev/sdb
sudo umount /tmp/mntroot

Копирую корневой раздел / с sda2 на sdb2

Цитировать
sudo 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 руками не трогать.
Может у меня вообще принципиально неправильный подход и есть более простые решения?

Спасибо!
« Последнее редактирование: 13 Июля 2017, 10:08:36 от regs2006 »

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #1 : 13 Июля 2017, 10:00:38 »
В мануале про Grub2 вообще написано grub.cfg руками не трогать.
Его можно трогать, просто после этого не нужно делать sudo update-grub иначе кофигурация перезапишется

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #2 : 13 Июля 2017, 10:06:08 »
regs2006, fstab, если диски менять планируется лучше сделать по UUID а не по названиям устройств
НЕ /dev/sda а UUID=много_цифр_и_букоф
При замене дисков /dev/sdX меняются

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #3 : 13 Июля 2017, 10:10:38 »
И /etc/fstab у вас какой-то странный.))
UUID=14d3ed22-7340-4ae8-b6f9-8e7d9671db61 / ext4 rw,relatime,,errors=remount-ro 0 2

UUID=A1CE-92F2 /boot ext4 ro,relatime,errors=remount-ro 0 1

UUID=5f4c22fd-6230-456b-8740-27b3d71c5724 /home ext4 rw,relatime,errors=remount-ro 0 2

UUID=dd15465a-c891-4a84-b66d-6644b6f9831d none swap defaults 0 0

И вообще, нафиг его редактировать?

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #4 : 13 Июля 2017, 10:22:23 »
Morisson,
Привет! Генератор в фстабу.
)))
Wars ~.o

Оффлайн regs2006

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #5 : 13 Июля 2017, 10:25:30 »
В мануале про Grub2 вообще написано grub.cfg руками не трогать.
Его можно трогать, просто после этого не нужно делать sudo update-grub иначе кофигурация перезапишется
Ну да, update-grub я не делаю, т.к. он уже при установке системы установлен, и просто правлю grub.cfg

regs2006, fstab, если диски менять планируется лучше сделать по UUID а не по названиям устройств
НЕ /dev/sda а UUID=много_цифр_и_букоф
При замене дисков /dev/sdX меняются

Вот как раз в том то и дело, что рабочий диск в любом случае будет вставлен в первый слот, а в микросервере диск в первом слоте всегда определяется как /dev/sda

Т.е. например - сдох первый диск. Достаем его, на его место ставим диск из второго слота. В результате бывший sdb определится как sda
Ну а если сдохнет диск во втором слоте, то вообще ничего не изменится, так и будет грузиться с первого диска.

И /etc/fstab у вас какой-то странный.))
UUID=14d3ed22-7340-4ae8-b6f9-8e7d9671db61 / ext4 rw,relatime,,errors=remount-ro 0 2

UUID=A1CE-92F2 /boot ext4 ro,relatime,errors=remount-ro 0 1

UUID=5f4c22fd-6230-456b-8740-27b3d71c5724 /home ext4 rw,relatime,errors=remount-ro 0 2

UUID=dd15465a-c891-4a84-b66d-6644b6f9831d none swap defaults 0 0

И вообще, нафиг его редактировать?
Все верно, изначально у меня /etc/fstab такой-же как у вас, но т.к. мне нужна универсальность, то я хочу туда прописать dev/sda1 и /dev/sda2 вместо UUID. Чтобы в случае смерти диска не править fstab в очередной раз.

А в первом посте я написал не свой реальный файл, а его примерный вид.
У меня он выглядит примерно так:

Цитировать
/dev/sda2   /   ext4   rw,relatime,,errors=remount-ro   0   2

/dev/sda1   /boot   ext4   ro,relatime,errors=remount-ro   0   1

/dev/sda3   none   swap   defaults   0   0

конфиг fstab у меня в конечном итоге будет на разделе рейда, поэтому хотелось бы отредактировать его один раз и потом ограничиться лишь добавлением загрузчика на новый жесткий диск и rsync sda2 на sdb2
« Последнее редактирование: 13 Июля 2017, 10:28:54 от regs2006 »

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #6 : 13 Июля 2017, 11:31:57 »
victor00000, Привет!))

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #7 : 13 Июля 2017, 11:37:27 »
грузится перестало, т.к. в grub.cfg так же прописаны UUID
Цитировать
search --no-floppy --fs-uuid --set=root 67a1d760-755d-41ef-a5c5-993f040719a7
В /etc/default/grub есть
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
Потом
sudo update-grubПотом правь grub.cfg

Morisson

  • Гость

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28366
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #9 : 13 Июля 2017, 20:02:34 »
update-grub я не делаю
Зато его делает пакетный менеджер при обновлении системы.
Вот как раз в том то и дело
Дело в том, что вы не понимаете принципиальной разницы. Как /dev/sda определяется ПЕРВЫЙ РАБОЧИЙ диск, а не "диск в первом слоте".
А в вашем случае вообще не должно быть разницы, в каком слоте стоит диск, иначе это не отказоустойчивость.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн regs2006

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #10 : 14 Июля 2017, 06:10:47 »
А в вашем случае вообще не должно быть разницы, в каком слоте стоит диск, иначе это не отказоустойчивость.
Ну я же не спорю с этим. Но если у меня на обоих жестких дисках будет загрузчик, и в нем прописан диск /dev/sda и при этом я любой из этих дисков всегда могу оставить один в сервере. или воткнуть в любой слот. Т.е. убунуту может определить единственный диск в системе как sdb?
А слот диска - это мне просто для понимания/запоминания, где какой диск.
Например - в первом слоте сдох диск, его достаем, выкидываем. Перемещаем из второго слота рабочий диск в первый слот.
Теперь в первом слоте у нас рабочая система. во второй слот вставляем чистый диск и производим с ним манипуляции по добавлению загрузчика и рейда. При необходимости повторяем.

А вы бы как сделали в этом случае? К UUID я тоже не могу привязаться, т.к. это вообще привязка к конкретному диску.
« Последнее редактирование: 14 Июля 2017, 06:59:38 от regs2006 »

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6911
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #11 : 14 Июля 2017, 08:42:47 »
regs2006, предлагаю рассмотреть такой код.
(Нажмите, чтобы показать/скрыть)
Как это будет работать с раид я не знаю, не знаком. А на обычной системе получаем следующее.
vmlinuz - символическая ссылка, указывающая на последнюю верию ядра.
Grub, с помощью команды search, ищет файл vmlinuz и с этого раздела загружает ядро.
Пока все универсально. Главное, чтобы хоть на каком-то разделе нашелся vmlinuz.
Ядру передается параметр "root=/dev/sda1" - где искать корневую файловую систему. Это единственное неуниверсальное место.
Нужно чтобы всегда был раздел /dev/sda1, и на нем был линух.
Fstab править не нужно. При правильном раскладе в нем правильно прописано расположение корня.
Этот код поместить в файл /etc/grub.d/40_custom.
В файле /etc/default/grub указать пункт загружаемый по умолчанию:
GRUB_DEFAULT="Linux [sda1]"Выполнить update-grub. Теперь по-умолчанию будет загружаться наш пункт меню.

Оффлайн firerat

  • Активист
  • *
  • Сообщений: 254
  • Audaces Fortuna Juvat
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #12 : 14 Июля 2017, 09:16:54 »
не знаю, как там с софтовым рейдом, но с нормальным выглядит процесс так:
сначала поднимается рейд (например, зеркало), а затем уже на него ставится ос.
таким образом перед установкой мы видим не два диска, а один. И никакого мозгоблудства не требуется.
Ubuntu 20.04 Unity

Morisson

  • Гость
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #13 : 14 Июля 2017, 09:41:17 »
firerat, +++

Оффлайн regs2006

  • Автор темы
  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Универсальный загрузчик на Ubuntu 16
« Ответ #14 : 14 Июля 2017, 11:13:04 »
andytux, спасибо! попробую это вариант

не знаю, как там с софтовым рейдом, но с нормальным выглядит процесс так:
сначала поднимается рейд (например, зеркало), а затем уже на него ставится ос.
таким образом перед установкой мы видим не два диска, а один. И никакого мозгоблудства не требуется.
Про нормальный рейд вопросов нет. Изначально планировалось работать, именно с аппаратным рейдом.
 Но микросервер,к сожалению, эти планы нарушил.
 Приходится извращаться :(

 

Страница сгенерирована за 0.038 секунд. Запросов: 25.