Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ",
Санкт-Петербург
+79811865082
anteh@bk.ru
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 []...
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"
Нужно ядро скомпилировать с:
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":
# 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.