Предпосылки: небольшой персональный сервер, электронная почта, Интернет, оболочка и т. Д. Для семьи и друзей. SunOS 5.11, snv_113 от ноября 2008 года. Сервер построен в 2009 году. Я полагаю, что это была версия с ранним доступом opensolaris или Solaris. 64-битный процессор AMD, оперативная память 4 ГБ.
Трехстороннее зеркало Root zpool, первоначально состоявшее из трех вращающихся дисков размером 320 ГБ. По прошествии трех лет каждый из вращающихся дисков отмирал один за другим; каждый заменен по гарантии производителя. За последние несколько месяцев опять тупил еще один диск. На данный момент я решил просто запустить двустороннее зеркало. На прошлой неделе возникла постоянная ошибка с указанием трех файлов. После очистки эти ошибки исчезли, за исключением одной ошибки метаданных. Поскольку второй диск тоже начал выходить из строя, я вставил запасной диск для настольного компьютера и вернулся к нему. Ошибка контрольной суммы и метаданных сохранялась. В отчаянии я купил пару SSD (я действительно ненавижу вращающиеся диски). Я добавил один в пул в качестве третьего, и, конечно же, во время переноса я остаюсь со следующим:
root-klaatu /root% zpool status -v
pool: rpool
state: ONLINE
status: One or more devices has experienced an error resulting in data
corruption. Applications may be affected.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
see: http://www.sun.com/msg/ZFS-8000-8A
scrub: resilver in progress for 1h47m, 84.53% done, 0h19m to go
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 1
mirror ONLINE 0 0 6
c1d0s0 ONLINE 0 0 6
c1d1s0 ONLINE 0 0 6 55.0G resilvered
c0d1s0 ONLINE 0 0 6 55.3G resilvered
ошибки:
Permanent errors have been detected in the following files:
<metadata>:<0x172>
К тому времени, когда он завершится, будет сообщено о десяти ошибках контрольной суммы на диск и две на самом rpool. 'Zpool clear' отлично подходит для очистки счетчика ошибок контрольной суммы, но ошибочный файл метаданных сохраняется, и каждый resilver / scrub возвращает одни и те же ошибки контрольной суммы. Обратите внимание, что я удалил все снимки, так как читал, что иногда именно там находятся ошибочные данные, но без радости.
У меня есть резервные копии, но они создаются через CrashPlan и в облаке, поэтому восстановление всего этого займет несколько дней по сравнению с ограниченным подключением, которое я поддерживаю для сервера, что означает дни, когда сервер будет недоступен, что просто неприемлемо.
Таааак - все, что сказано. Каков мой вариант восстановления, кроме восстановления из резервной копии (поскольку «файл» метаданных, очевидно, я не могу удалить).
Если бы мне пришлось создать новый пул zfs на новом диске - будет ли отправка / получение zfs «очистить» ошибку? Или было бы лучше настроить новый пул, затем выполнить синхронизацию с ним данных старого пула, затем переименовать новый пул обратно в исходный, установить загрузочные блоки на зеркальные диски, а затем попробовать загрузиться с него? Я читал, что есть кешированные биты данных, связанные с фактическим именем пула, которые могут мешать реальной загрузке.
Я знаю, что `` логичным '' было бы просто создать новый, свежий сервер на последней ОС, такой как OmniOS или OpenIndiana или еще что-то, но со всем настраиваемым скомпилированным кодом на этом сервере (который изначально был Sparc 20 назад в начале 2000-х), я полагаю, что rsyncing все не сработает.
Спасибо за любую помощь.
О, я должен добавить - сервер работает нормально. Ни сбоев, ни зависаний, ничего.
Я смог «оправиться» от этого инцидента, отправив zfs и получив поврежденный пул в новый пул.
# создать новый однодисковый пул (или зеркало заранее, если хотите)
zpool create -f tpool c0d0s0
# сделать базовый снимок старого пула
zfs snapshot -r rpool@now
# zfs отправляет его в новый пул
zfs send -vR rpool@now | zfs receive -Fduv tpool
# обратите внимание, что это сбросит точку монтирования tpool на rpool - поэтому обязательно обновите ее
zfs set mountpoint=/tpool tpool
# перейти на одного пользователя; как это зависит от вашей системы
# редактировать:
/rpool/boot/grub/menu.lst
# (Обратите внимание, что этот файл должен поддерживаться bootadm; в данных обстоятельствах я решил просто пойти напрямую)
# дублируйте первую загрузку, отредактируйте копию, измените findroot с
findroot (pool_rpool,0,a)
# к
findroot (pool_tpool,0,a)
# сделать второй снимок теперь, когда в однопользовательском
zfs snapshot -r rpool@now2
# отправляем инкрементную привязку в новый пул
zfs send -vR -i rpool@now rpool@now2 | zfs receive -Fduv tpool
# mount tpool - помните, что точку монтирования необходимо обновить
zfs mount=/tpool tpool
# rm файл 'bootsign' и замените его новым:
rm /tpool/boot/grub/bootsign/pool_rpool
touch /tpool/boot/grub/bootsign/pool_tpool
# формализуем откуда загружаться
zpool set bootfs=tpool/ROOT/snv_113 tpool
# добавляем загрузочные блоки
installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0d0s0
# poweroff, отсоедините диски rpool - или оставьте их для дальнейшего исследования
# если собираетесь зеркалировать, физически прикрепите второй диск
# загрузка
# превратить tpool в зеркало
zpool attach tpool c0d0s0 c1d0s0
# сделано
Обратите внимание, что если все в порядке, вы можете отредактировать меню grub, чтобы либо переместить новую загрузочную запись tpool, чтобы она была первой, либо изменить объявление 'default', чтобы оно указывало на то, что оно есть в списке (или, если нет другие объявления загрузки, затем просто удалите одно для rpool).
Кроме того, хотя я ссылался, вероятно, на более сотни различных сайтов и веб-страниц, пытаясь решить эту проблему, приведенный выше «рецепт» во многом основан на Как сжать зеркальный ZFS rpool, Джо Мокер.