Может ли grub безопасно загрузиться с btrfs raid10?
Я использую Ubuntu 16.04.1 LTS. Система была настроена с RAID1 btrfs / (два диска sda1 и sdb1). Не было создано ни одного раздела /boot или загрузочных разделов BIOS.
После добавления еще двух дисков и преобразования в RAID10 система отказалась загружаться. Однако я смог восстановить его, запустив update-grub с Live CD, следуя инструкциям на этой странице.
Я не очень много знаю о том, как работает Grub. Но, оглядываясь назад, на самом деле кажется чудом, что удалось загрузить систему. Если я правильно понимаю, grub сохраняет адрес блока первого блока следующего этапа в MBR. Правильно ли я в том, что мне пришлось использовать update-grub, потому что баланс перемешал блоки вокруг?
Во-вторых, что произойдет, если из-за RAID10 следующая стадия grub будет разделена на несколько дисков? Он знает, как справиться с этим, или я сижу здесь на бомбе замедленного действия?
2 ответа
Grub загружает свой собственный менеджер файловых систем (NTFS, FAT32, EXT*, BTRFS, LUKS; LVM, RAID и т. Д.), Если при установке он сообщает, что модули должны находиться на этапе загрузки, то есть он знает, как получить доступ ко всем файловым системам, если вы этого хотите. (которые поддерживаются), поэтому он загружает небольшой код MBR (хранящийся в 1-м секторе), независимо от того, является ли он диском с MBR или GPT (или гибридом), затем он загружает "большой" кусок данных, жестко закодированных в секторе и следующих секторах. (может быть около 2 МБ или более, если на этом этапе установлено много модулей, я тестировал до 8 МБ), что данные хранятся на неподвижной части диска, могут быть после MBR (1 мегабайт, до 2047 секторов).), в выделенном разделе (biosgrub) без формата (в необработанном режиме), в отформатированном разделе (в файле, который нельзя перемещать) или в цепочке блоков (некоторые ext * и не рекомендуется, поскольку их можно перемещать и не загрузится до переустановки grub).
Таким образом, grub сначала загружает мини-код, который жестко закодирован в том месте, где хранится "большой" код, а затем загружает этот код, и этот "большой" код знает, как управлять всеми файловыми системами, о которых было сказано (при установке grub с использованием параметра modules или с конфигурациями файлов и т. д.), что позволяет grub знать, как обращаться к зашифрованным LUKS (допускается многоуровневое), RAID, LVM2, FAT32, NTFS, EXT*, BTRFS и т. д., поэтому он знает, как получить доступ к файловой системе, где находятся его файлы. (grub.cfg и т. д.) сохраняются.
Так что да, GRUB2 может быть установлен на чистую зачистку (raid0, LVM, btrfs и т. Д.) Без проблем; но также верно, что если этот "большой" код перенесен в другое место и там, где он был перезаписан, GRUB не сможет загрузиться, пока переустановка grub не обновит эту жестко закодированную позицию для своего "большого" кода.
Некоторые файловые системы имеют флаг для файла, который позволяет файловой системе знать, что файл не должен быть перемещен, и поскольку этот файл не перезаписывается, он не перемещается, за исключением некоторых случаев.
С балансом btrfs может случиться так, что такой специальный файл grub (где хранится "большой" код) будет удален из-за COW на btrfs, а также из-за того места, где он был перезаписан, тогда grub2 не загрузится... у меня было страдать при переходе с 'single' на 'raid1' после добавления второго диска.
В этом случае grub покажет загрузочную командную строку вместо загрузки. Что можно сделать, чтобы это исправить, очень легко, просто загрузитесь с живого linux, который имеет команду grub-install (нет необходимости делать chroot), и смонтируйте раздел, где у вас есть grub.cfg как / или /boot, в зависимости от того, используете ли вы /boot - это отдельный раздел или нет из раздела /; Запустите grub-install с правильными параметрами modu, es, unmount и reboot, затем переделайте установку grub из вашего собственного linux, чтобы иметь ту же версию (если вы параноик или не хотите путать версии).
Но рекомендуемый способ исправить это - смонтировать btfrs, выполнить chroot и заново выполнить установку grub из вашего собственного linux.
Я предпочитаю другую схему, у меня всегда есть свой собственный grub2 (с grub.cfg, отредактированным вручную), который загружает по цепочке все другие загрузчики linux/windows/etc, таким образом, каждая система имеет свой собственный загрузчик, и каждая система не должна зависеть от других (multi-boot). Кроме того, у меня есть такая схема на компьютерах, у меня есть только одна система, поэтому у меня есть цикл ISO (поэтому я могу загружать живые дистрибутивы Linux, которые находятся на.iso-файлах), я также добавляю опции для перехода к загрузчику Linux (на всякий случай, если любой обновление повреждает собственный загрузчик и т. д.) и цепочку на первом секторе раздела (где был установлен загрузчик дистрибутива).
Таким образом, я могу изолировать проблемы, если загрузчик linux distro не загружается, вместо загрузки с chaiload я загружаюсь с собственной записью, затем я исправляю то, что нужно исправить, и т. Д.
Так как я обнаружил btrfs raid 1, позволяющий мне восстановиться с некоторого SSD-диска KingDian, который после длительных периодов без питания (более недели, восьмого дня и более) говорит, что некоторые секторы не читаются (и если они не включаются в течение следующих восьми дней, список нечитаемые изменения, а те, которые не были читаемыми, снова становятся читаемыми с правильными данными; действительно странная неисправность на этих SSD-дисках KingDian); я использую только btrfs raid 1 для моего основного загрузчика GRUB2 и для всех linux.
И да, мне иногда приходилось исправлять загрузку grub в linux, но с некоторых месяцев мне приходилось делать это только один раз, и это было только после добавления второго диска и баланса (преобразовать из одного в raid1), так что я могу предположить, это не то, о чем беспокоиться, это достаточно безопасно, и в случае неудачи, просто загрузившись с SystemRescuCd или любым другим дистрибутивом, который вы хотите, используя команду grub-install, вы можете исправить это напрямую (в случае необходимости) или выполнить chroot (рекомендуется).
До того, как я узнал о btrfs, я всегда использовал grub2 на NxHDD в RAID0 (давно в dm-raid, а недавно в LVM2), и у меня никогда не было проблем из-за 'sttriping'... помня, чтобы не забыть параметр 'modules' в Команда grub-install.
Так что не беспокойтесь о наличии GRUB2 на RAID 0, 1, 10) на btrfs, но все люди, которых я знаю, предупреждали меня, если RAID (5 или 6), лучше вообще не использовать raid5 и raid6 на btrfs.
Вы не даете много информации. Например, GRUB вообще загружался или нет?!
Я только что проверил это на виртуальной машине. Я установил Debian Stretch с ядром 4.9 и btrfs-progs V4.7 на одном диске. Загрузчик представляет собой пакет GRUB 2.02~beta3-4.
После установки я добавил 3 дополнительных диска (всего 4 диска (по 1 разделу на каждый)). Я установил grub на все диски и выполнил update-grub.
Я перебалансировал данные и метаданные в RAID10. Я даже удалил один из дисков в наборе RAID10, чтобы посмотреть, что произошло. Мне пришлось редактировать командную строку ядра с помощью rootflags=degraded для загрузки с отсутствующего диска. После повторного подключения диска и запуска баланса (чтобы снова преобразовать отдельные фрагменты в raid10) я перетасовал данные, установил кое-что, несколько раз перебалансировал и все еще успешно загрузился. Обратите внимание, что я НЕ запускал update-grub ни на одном из дисков во время этих балансировок.
Также в руководстве GRUB говорится, что поддерживаются BTRFS RAID0, RAID1, RAID10, gzip и lzo): https://www.gnu.org/software/grub/manual/grub.html
Я не очень разбираюсь в том, как работает GRUB, но могу только предположить, что BTRFS должен иметь слой перевода... например, виртуальный блок 1234 указывает на то, где он действительно находится на диске.
Исходя из моих тестов, я пришел к выводу, что загрузка с btrfs raid10 кажется не менее страшной, чем raid1. Я не могу отвечать за Ubuntu 16.04.1 LTS, так как я им не пользуюсь, но я советую вам поэкспериментировать самостоятельно, потому что, судя по моим тестам, он работает нормально.