Разработка электроники,

Систем автоматики,

Программного обеспечения

8(981)186-50-82

ООО "Антех ПСБ",
Санкт-Петербург

anteh@bk.ru

antehru@gmail.com

©

Установка настройка FreeBSD 10.1 ZFS на i386, затем на amd64. Ошибка Trying to mount root from zfs:zroot/ROOT/default []... перезагрузка.

16.07.2015 https://anteh.ru

Попытка установить FreeBSD-10.1-RELEASE-i386-dvd1.iso на intel Celeron x64 с использованием ZFS.
Вопрос решить не удалось, вместо ZFS для i386 проще использовать UFS.

Для AMD и почти всех Intel платформ используется один и тот же дистрибутив amd64. Например FreeBSD-10.1-RELEASE-amd64-dvd1.iso.

Установка FreeBSD 10.1 amd64 zfs 1 hdd

Установка FreeBSD 10.1 i386 zfs:

После установки перезагрузка и такая картина:Trying to mount root from zfs zroot ROOT default

Trying to mount root from zfs:zroot/ROOT/default []...

Fatal double fault:
eip = 0xc186ad12
esp = 0xc7a3ef80
ebp = 0xc7a3f2e0
cpuid = 3; apic id = 03
panic: double fault
cpuid = 3
KDB: stack backtrace:
#0 0xc0b53ed2 at kdb_backtrace+0x52
#1 0xc0b1688f at panic+0x11f
#2 0xc101bedb at dblfault_handler+0xab

Постоянная перезагрузка по кругу.

Проблема встречается только для i386 систем. Для amd64 достаточно zfs_load="YES". Для i386 Нужно оптимизировать ZFS перед реальным применением, иначе могут быть сбои при загрузке и монтировании ZFS. При установке FreeBSD 10.1 i386, вышеприведённая ошибка появилась сразу после установки, т.е. ОС даже не загрузилась. Потом через какое-то количество переустановок и манипуляций -так и не выяснилось каких, система загрузилась. Были обновлены и пересобраны мир с ядром. Затем, через пару дней после ручной установки всего необходимого ошибка снова появилась. Было решено не разбираться.

Система не грузится. Пока считаем, что всё плохо и "спасаем" данные с диска на флешку:

Загрузка с LiveCD

Далее монтируем zroot в /mnt LiveCD
# zpool import -f -R /mnt zroot

В LiveCD создаём папку для монтирования флэшки:
# mkdir /tmp/mnt2

Смотрим название подключённой флэшки
# cd /dev
# ls -la | more
Видим da0s1

Монтируем флэшку:
# mount_msdosfs /dev/da0s1 /tmp/mnt2
# cd /tmp/mnt2
# ls -la | more
Убеждаемся, что это та самая флэшка
# mkdir /tmp/mnt2/fbsdrez

Чтобы ничего не забыть из всего /mnt делаем на флэшке архив:
# tar -cvf /tmp/mnt2/fbsdrez/fbrez.tar /mnt

Данные сохранены.
Попытки выяснить причину невозможности монтирования zroot ни к чему не привели. Точно выяснилось, что железо ни при чём.

При установке использовались дефолтное значение размера сектора 4k. Это актуально для дисков большой ёмкости от 2TB. MBR позволяет размечать hdd до 2TB. GPT до 9ZB.
Пробовал установку со стандартным размером сектора 512b, перекомпиляция ядра с options KVA_PAGES=512, настройка /boot/loader.conf.

ZFS на i386 не пошла. С UFS всё работало чётко.

В системе установлено 8G RAM.

Разбираемся с:
"memory above 4gb ignored"memory above 4gb ignored

Нужно ядро скомпилировать с:
Options PAE
Читаем /usr/src/sys/i386/conf/PAE
Решение ненадёжное. Затея не удалась.

Т.е. i386 дистрибутив будет нормально, без усилий по настройке, работать только с максимум 4G RAM, на UFS. Конечно, если припрёт, работать оно будет как угодно.

Установка FreeBSD 10.1 на amd64 zfs 1 hdd

Алгоритм сборки/установки новой системы:

Сборка мира, Сборка ядра, Установка мира, Установка ядра, Установка конфигурационных файлов.

Собственно новая система обычно устанавливается с дистрибутива и вышеописанное не особо актуально.

Алгоритм обновления системы:

Сборка мира, Сборка ядра, Установка ядра, Перезагрузка, Обновление части конфигурационных файлов

# cd /usr/src
# mergemaster -p

Установка мира, Обновление конфигурационных файлов # mergemaster, Перезагрузка.

Ставим с LiveCD
<install>

"Distribution Select"
Оставил только lib32 32-bit compatibility libraries

Auto ZFS

"ZFS Configuration"
1 диск
Swap Size 4G
Остальное по дефолту

Дальше по сценарию
Настраиваем сеть

Перезагружаемся загружаем дерево портов и исходники в /usr/src:

# portsnap fetch
# portsnap extract
# svnlite co svn://svn.freebsd.org/base/releng/10.1/ /usr/src

Для удобства ставим mc-light

Для ZFS нигде ничего прописывать и оптимизировать не нужно.
Далее, пере собираем мир, ядро с дополнительными опциями, настраиваем SSH, NTP, IPFW+NAT, ClamAV, Portmaster, Portcentry и пр.

Первая задача настроить файервол, например IPFW в блокирующем режиме.

Для включения блокирующего IPFW + NAT можно ядро пересобрать с такими опциями:
ident <ИМЯ ЯДРА>

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
options IPFIREWALL_FORWARD

Файл ядра GENERIC не редактируем, копируем с переименованием. Редактируем и используем копию GENERIC конфигурации ядра. Меняем ident на какое ни будь своё название.

Пересборка мира, ядра:
# uname -a
FreeBSD <имя хоста> 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r274401: Tue Nov 11 21:02:49 UTC 2014 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64

# cd /usr/obj
# chflags -R noschg *
# rm -rf *
# cd /usr/src
# make cleandir
# make cleandir

Текущая версия исходных/обновлённых текстов исходных кодов:

#grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh
# time make -s -j4 buildworld

-j4 - опция сборки в 4 потока, на многопроцессорных и многоядерных системах существенно сокращает время сборки. Но не рекомендованна, может приводить к ошибкам компиляции.

-s -опция запрета отображения выполнения комманд
Пару часов ждём
# make -j4 -s buildkernel KERNCONF=<ИМЯ ЯДРА например GENERIC>
Ждём около часа
# make -s installkernel KERNCONF=<ИМЯ ЯДРА например GENERIC>
# shutdown now (SSH соединение будет разорвано переход в однопользовательский режим без размонтирования основных разделов)

Новое ядро будет в /boot/kernel, предыдущее в /boot/kernel.old. В загрузчике можно выбирать между ними

# mergemaster -p -если устанавливаем новую систему, то можно не делать, если обновляемся на следующую ветку, то делаем. Про mergemaster читаем в сети пользоваться нужно аккуратно и понимая происходящее. Не удалите записи paswd и master.paswd

Перед инсталляцией ядра проверьте, что в /etc/fstab у /tmp не установлено noexec. Если установлено, то снимите на время installworld. Иначе получите ошибку "Could not execute shell ... Stop in /usr/src":перед инсталляцией ядра проверить что в /etc/fstab у /tmp не установлено noexec

# cd /usr/src
# make installworld

в /etc/fstab возвращаем noexec для /tmp
# shutdown -r now
# mergemaster -a
# mergemaster -p
# shutdown -r now
# uname -a
FreeBSD <имя хоста> 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r285701: Mon Jul 20 15:25:12 MSK 2015 user@host:/usr/obj/usr/src/sys/<ИМЯ ЯДРА> amd64

IPFW ядерный и блокирующий:
# ipfw show
65535 0 0 deny ip from any to any
Всё всем запрещено. Создаём правила IPFW.

Файл /etc/firewall.conf создаём.
Правила для IPFW файл /etc/firewall.conf хотя бы такие:

{
#!/bin/sh

/sbin/ipfw -q -f flush
/sbin/ipfw -q -f pipe flush
/sbin/ipfw -q -f queue flush

fwadd="/sbin/ipfw -q add"

ext="re0" #Ext Internet interface
ip_ext="55.56.57.58" #Ext IP

/sbin/sysctl net.inet.ip.fw.one_pass=1
/sbin/sysctl net.inet.tcp.blackhole=2
/sbin/sysctl net.inet.udp.blackhole=1
/sbin/sysctl net.inet.icmp.drop_redirect=1
/sbin/sysctl net.inet.icmp.log_redirect=0
/sbin/sysctl net.inet.ip.redirect=0
/sbin/sysctl net.inet.ip.ttl=226
/sbin/sysctl net.inet.tcp.drop_synfin=1
/sbin/sysctl net.inet.tcp.syncookies=1
/sbin/sysctl net.inet.ip.sourceroute=0
/sbin/sysctl net.inet.ip.accept_sourceroute=0
/sbin/sysctl net.inet.icmp.bmcastecho=0
/sbin/sysctl net.inet.icmp.maskrepl=0
/sbin/sysctl net.inet.tcp.msl=7500
/sbin/sysctl net.inet.icmp.icmplim=100
/sbin/sysctl security.bsd.see_other_uids=0
/sbin/sysctl security.bsd.see_other_gids=0
/sbin/sysctl security.bsd.conservative_signals=0
/sbin/sysctl security.bsd.unprivileged_proc_debug=0
/sbin/sysctl security.bsd.unprivileged_read_msgbuf=0
/sbin/sysctl security.bsd.hardlink_check_uid=0
/sbin/sysctl security.bsd.hardlink_check_gid=0
/sbin/sysctl vfs.usermount=0
/sbin/sysctl net.inet.tcp.log_in_vain=0
/sbin/sysctl net.inet.udp.log_in_vain=0

${fwadd} 00100 allow ip from any to any via lo0
${fwadd} 00110 deny ip from any to 127.0.0.0/8
${fwadd} 00120 deny ip from 127.0.0.0/8 to any

${fwadd} 01000 allow ip from me to any out xmit ${ext} keep-state
${fwadd} 01010 allow ip from any to ${ip_ext} in recv ${ext}
}

Правило deny from any to any для блокирующего ipfw добавляется автоматически.
Конечно же правила создаём под свои нужды. Нужно явно разрешать только те соединения, которые нужны.

"/sbin/sysctl" -эти строки могут находиться в /etc/sysctl.conf

В /etc/rc.conf

gateway_enable="YES"
firewall_enable="YES"
firewall_quiet="YES"
firewall_script="/etc/firewall.conf"
firewall_nat_enable="YES"

Перезагружаемся

Для перезапуска IPFW с изменёнными правилами:
# /etc/rc.d/ipfw restart

После первой заливки исходных кодов в /usr/src обновление делаем так:
# svnlite update /usr/src
Updating 'usr/src':
At revision 285718.

Посмотреть версию исходных файлов /usr/src можно так:
# grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh
TYPE="FreeBSD"
REVISION="10.1"
BRANCH="RELEASE"

Теперь можно пере собирать обновлённые исходники, как показано выше

# uname -a
FreeBSD <имя хоста> 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r285718: Mon Jul 20 21:45:37 MSK 2015 user@<имя хоста>:/usr/obj/usr/src/sys/<ИМЯ ЯДРА> amd64

Можно использовать бинарный способ обновления через freebsd-update. Этот способ более простой, но могут возникнуть проблемы, если используется нестандартное ядро, не GENERIC. Можно на время обновления установить GENERIC.


Copyright ©Новиков Алексей Александрович,

2012-2017 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru