AK>>> поправит (интересно, зачем ему вообще что-то знать о каких-то контрольных AK>>> суммах, да еще на уровне пула, а не отдельной fs) EG>> Для загрузчика несходимость контрольной суммы означает, EG>> что это место надо пропустить при поиске загрузочного пула. AK> хмм... однобитовый патч? ;-)
Hе понял реплики.
Вот имеем мы пусть даже просто загрузочный зеркальный пул. До старта ядра у загрузчика есть только сервисы BIOS/[U]EFI, для простоты будем называть просто BIOS. Оно загружает с одного из дисков MBR и передаёт управление в код, который там лежит.
Этот код, как и любой код, использующий сервисы BIOS, может читать диски, ссылаясь на них как на BIOS disk 0 (тот, с которого загружен сам), BIOS disk 1 и т.д., в терминах фрёвого загрузчика это disk0 и disk1.
В случае BootEasy (/boot/boot0) в MBR этот код либо находит активный раздел и читает с него первый сектор, либо читает MBR с BIOS disk 1 (в зависимости от настроек и/или выбора юзера с консоли) и передаёт туда управление, что в случае ZFS в итоге приводит к запуску zfsboot, которому всё так же доступны disk0, disk1.
zfsboot не знает, с которого диска и которого раздела его прочитали. Он "обнюхивает" доступные диски и разделы в поисках сигнатур и суперблоков ZFS и если видит что-то похожее на ZFS, но контрольная сумма данных не сходится - разумно пропускает и ищет дальше, потому как это мог быть и нестойко читающийся soft bad и лучше бы начать грузить zfsloader с другого компонента.
zfsloader имеет в себе уже гораздо более богатый по возможностям код, который тем не менее всё ещё может использовать только сервисы BIOS, но ему уже передаются уникальные id того пула ZFS и файловой системы на нём, с которого его прочитал zfsboot. Он тоже "обнюхивает" доступные диски и разделы, находит на них компоненты указанного пула, выбирая нужный пул по id и читает данные с ZFS и если контрольная сумма не сходится, то имеет возможность попробовать другой компонент зеркального пула.
В случае с GPT вместо MBR отличие только в последовательности запуска загрузчиков до старта zfsloader, а дальше всё то же самое.
Eugene -- Choose no career --- slrn/1.0.2 (FreeBSD) * Origin: RDTC JSC (2:5006/1@fidonet)