четверг, 18 ноября 2010 г.

Корень FreeBSD на почве ZFS или триумфальное возвращение чертей! :)

Да, да да! Это снова очередная статья о личном опыте использования ОС FreeBSD на основе  файловой системы ZFS. Но лучше много информации чем ее отсутствие :)
Лирическое...
Если вы периодически просматривали этот блог по диагонали, то очевидно заметили что FreeBSD в нем периодически мелькала (то как прокси для деления инета с другом, то сваливалась в десктоп ОС) и вот теперь я решил создать NAS на ее основе. Вы скажите ведь есть FreeNAS, зачем нам заморачиваться с FreeBSD? В ответ возражу что я просто люблю эту ОС, поэтому и обожаю копаться в ней. Вот и все. :)

Техническое...
О прекрасной файловой системе (не лишенной конечно недостатков как и все в нашем мире) ZFS вы и без меня в wikipedia прочитаете. Перебрав множество руководств в сети я остановился на официальном по адресу: wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror. В данном случае я ставил в конфигурации зеркала из 2 дисков по 640Гб.

Итак первым делом нам понадобиться DVD-диск с FreeBSD. У меня был диск 8.1-REALESE. Далее после автозапуска исталятора и выбора страны и языка выбираем Fixit. После чего запуститься sh.

1.  Создаем GPT-схему (в терминологии windows это ближе к понятию том) разбивки жестких дисков.
Fixit# gpart create -s gpt ad4
Fixit# gpart create -s gpt ad6
ad4 и ad6 это имена моих дисков. Посмотреть ваши вы можете выполнив:
Fixit# dmesg| grep SATA
Fixit# dmesg| grep IDE 
2. Создаем партиции (что-то вроде разделов) на них. Мы как и в рекомендации создадим 3 партиции:
- загрузочную в 64кб,
- подкачки на 4Гб,
- корень системы все оставшееся место (в данном случае 590Гб).

Своп партицию создали отдельно, т.к. в случае аварии на ZFS свопе краш-дамп не создаться. 
Fixit# gpart add -b 34 -s 128 -t freebsd-boot ad4
Fixit# gpart add -b 162 -s 8388608 -t freebsd-swap -l swap0 ad4
Fixit# gpart add -b 8388770 -s 590G -t freebsd-zfs -l disk0 ad4
Fixit# gpart add -b 34 -s 128 -t freebsd-boot ad6
Fixit# gpart add -b 162 -s 8388608 -t freebsd-swap -l swap1 ad6
Fixit# gpart add -b 8388770 -s 590G -t freebsd-zfs -l disk1 ad6
 Вот тут первая засада! Если не указывать параметр "-s" при создании последних партиций, то будет использовано все доступное место. Чего ж тут плохого спросите вы. А то что в зеркале 2 и более винчестера и реальные емкости у них тоже разные. На моих винчестерах WD серии Green на 640Гб "маркетинговой емкости" доступно реально 596Гб. А расхождение между винчестерами составило 528,25Мб! А это означает что если "упадет" больший диск, то зеркало не восстановиться.

Именно поэтому размер последней партиции = общая реальная емкость - 2 * расхождение в размере - своп - загрузочная - 2*17кб(GPT-таблица)

Расхождение в размере берем удвоенное, т.к. страхуемся вдруг третий винчестер, который когда нибудь придет на замену, будет содержать большее расхождение в емкости. Двойной размер GPT-таблиц обеспечен их двойным хранением в начале и конце диска. Я не стал заморачиваться и заложил на эти расходы 2.2Гб (да, наверно больше чем нужно, но я собираю NAS и данные на нем мои проекты мне чрезвычайно важны).

Реальный размер диска легко узнать выполнив:
Fixit# gpart list имя_диска
В разделе  Consumer параметр Mediasize.

Кстати в параметрах -b (смещение) и -s (длинна) применяется следующий вид аргументов:
- 0-9 =  LBA-блоки (1 блок 512Б)
- 0-9k = размер в килобайтах
- 0-9M = размер в мегабайтах
- 0-9G = размер в гигабайтах

Проверить корректность "разбивки диска" можно выполнив:
Fixit# gpart show имя_диска 
Если вы ошиблись при разметке, то вам помогут следующие команды:
- удаление партиции
Fixit# gpart delete -i номер_партиции имя_диска 
-удаление схемы (предварительно удалив все партиции)
Fixit# gpart destroy имя_диска 
Номер партиции можно увидеть либо через команду gpart list (параметр index), либо gpart show (3-й столбик).  Ну чтоже пойдем далее.

3. Установим защитный MBR-сектор и gptzfs-загрузчик:
Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad6
В случае ошибки "operation not permitted" выполните:
Fixit# sysctl kern.geom.debugflags=0x10 
4. Загрузим модули поддержки ZFS:
Fixit# kldload /mnt2/boot/kernel/opensolaris.ko
Fixit# kldload /mnt2/boot/kernel/zfs.ko
5. Создадим ZFS-пул под названием zroot (название может быть любым):
Fixit# mkdir /boot/zfs
Fixit# zpool create zroot mirror /dev/gpt/disk0 /dev/gpt/disk1
Fixit# zpool set bootfs=zroot zroot
6. Создадим файловые системы в ZFS-пуле:
Сначала установим нужный нам механизм расчета контрольных сумм. В мануале рекомендован fletcher4. Я же установил sha256, т.к. он более устойчив, но и более "тяжелый" для процессора.
Fixit# zfs set checksum=fletcher4 zroot
Файловые системы оставим пока по умолчанию, ZFS тем и славиться что можно в любой момент что-то добавить не останавливая компьютер. 
Fixit# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
Fixit# chmod 1777 /zroot/tmp
Fixit# zfs create zroot/usr
Fixit# zfs create zroot/usr/home
Fixit# cd /zroot ; ln -s /usr/home home
Fixit# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
Fixit# zfs create zroot/var
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
Fixit# zfs create -o exec=off -o setuid=off zroot/var/db
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
Fixit# zfs create -o exec=off -o setuid=off zroot/var/empty
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
Fixit# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
Fixit# zfs create -o exec=off -o setuid=off zroot/var/run
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off
Fixit# chmod 1777 /zroot/var/tmp
7. Установим систему FreeBSD на диск:
Fixit# cd /dist/8.0-*
Fixit# export DESTDIR=/zroot
Fixit# for dir in base catpages dict doc games info lib32 manpages ports;do (cd $dir ; ./install.sh) ; done
Fixit# cd src ; ./install.sh all
Fixit# cd ../kernels ; ./install.sh generic
Fixit# cd /zroot/boot ; cp -Rlp GENERIC/* /zroot/boot/kernel/
8. Переключаем партицию /var/empty в readonly:
Fixit# zfs set readonly=on zroot/var/empty 
9. Перемонтируем корень системы: 
Fixit# chroot /zroot 
10. Создадим основной конфигурационный файл /etc/rc.conf.
Сначала скажем что наши тома используют ZFS: 
Fixit# echo 'zfs_enable="YES"' > /etc/rc.conf
Потом сообщим система ее имя:
 Fixit# echo 'hostname="nas.mydomain.local"' >> /etc/rc.conf
А за одно пропишем это в файл hosts (особенно если ваш домен, как например .local не может быть разрешен доступными DNS-серверами):
Fixit# echo '127.0.0.1     nas.mydomain.local' >> /etc/hosts
Именно с отсутствием этой записи (а вернее с невозможностью разрезолвить свое DNS-имя) были связаны и долгая загрузка самой системы на строке "configuring syscons: blanktime" и долгий старт mc.
Далее установим конфигурацию сетевой карты:
 Fixit# echo 'ifconfig_nfe0="DHCP"' >> /etc/rc.conf
Можно и по другому (статический адрес):
Fixit# echo 'ifconfig_nfe0="inet 192.168.0.3 netmask 255.255.255.0"' >> /etc/rc.conf
Fixit# echo 'defaultrouter="192.168.0.1"' >> /etc/rc.conf
во всех командах nfe0 - имя моей карты, узнать вашу вы можете так:
Fixit# dmesg | grep Network
или так
Fixit# ifconfig
При этом последняя команда покажет и псевдо-устройство lo0 (интерфейс локальной петли)

11.  Создадим конфигурационный файл загрузчика:
Fixit# echo 'zfs_load="YES"' > /boot/loader.conf
Fixit# echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf
12. Установим загрузчик ZFS:
Fixit# echo 'LOADER_ZFS_SUPPORT=YES' > /etc/src.conf
Fixit# mount -t devfs devfs /dev
Fixit# export DESTDIR=""
Fixit# cd /usr/src/sys/boot/
Fixit# make obj
Fixit# make depend
Fixit# make
Fixit# cd i386/loader
Fixit# make install
13. Ставим пароль на root'a:
Fixit# passwd
14. Выбираем часовой пояс:
Fixit# tzsetup
15. Создаем базу alias'ов /etc/mail/aliases.db:
Fixit# cd /etc/mail
Fixit# make aliases
16. Отключаем текущий корень системы:
Fixit# umount /dev
Fixit# exit
17. Сохраняем файл конфигурации ZFS в каталоге корневой установленной системы (это один из важных файлов ZFS сохраните его потом в надежном месте):
Fixit# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache
18. Подключаем своп:
18.1 Вариант 1 - это использование всех партиций свопа как независимых. Для этого создаем файл fstab, описывающий конфигурацию файловых систем:
Fixit# cat << EOF > /zroot/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
/dev/gpt/swap1 none swap sw 0 0
EOF
18.2 Вариант 2 - использование зеркалированного свопа (RAID-1)
18.2.1 Для второго варианта (а я использую его как самый устойчивый и просто интересный) нужно подгрузить модуль поддержки зеркала:
Fixit# kldload /mnt2/boot/kernel/geom_mirror.ko
18.2.2 Собрать зеркало:
Fixit# gmirror label -b prefer swap gpt/swap0 gpt/swap1
Вот тут тоже иногда ошибка скачет. Бывает пишет что не видит swap0 и в каталоге /dev/gpt/ файлы устройств swap0 и swap1 пропадают, то смотрим собралось ли зеркало:
Fixit# gmirror status
В случае успеха переходим далее.

18.2.3 Создаем файл fstab, описывающий конфигурацию файловых систем:
Fixit# cat << EOF > /zroot/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/swap none swap sw 0 0
EOF
18.2.4 Добавляем в загрузчик модуль поддержки зеркала:
Fixit# echo 'geom_mirror_load="YES"' >> /zroot/boot/loader.conf
19. Выставим корректный путь к библиотекам:
Fixit# export LD_LIBRARY_PATH=/mnt2/lib 
20. Демонтируем все файловые системы ZFS:
Fixit# zfs unmount -a
Бывает и тут ошибка "device busy", тогда пишем:
Fixit# cd /
и повторяем предыдущую команду.

21. Установим точки загрузки для ZFS-пула:
Fixit# zfs set mountpoint=legacy zroot
Fixit# zfs set mountpoint=/tmp zroot/tmp
Fixit# zfs set mountpoint=/usr zroot/usr
Fixit# zfs set mountpoint=/var zroot/var

Все, готово! Выполняем exit и выходим из sysinstall с перезагрузкой.


четверг, 11 ноября 2010 г.

NVIDIA 8800GT и умелые ручки :)

(В статье приводиться личный опыт автора. За испорченное оборудование автор ответственности не несет. Все действия делаются на свой страх и риск. Кроме того данные действия лишают вас гарантии на устройство.)

Досталась мне тут плата NVIDIA 8800GT почти даром, со сломаной системой охлаждения. 

 
А поскольку хотелось собрать еще один комп, а покупать видеокарту совсем не хотелось, то решил я ее восстановить. Пробежавшись по магазинам заводской системы не нашлось по разумной цене, поэтому решил "слепить из того что было".

А был кулер Igloo под  CPU Socket. Достав инструменты (напильник, шуруповер/дрель, комплект сверл, относительно прямые руки) я принялся за работу.

Снял систему охлаждения (с обратной стороны карты отстегиваем пружинки с крючков).

Удалил остатки старой термопасты (она тут иногда присыхает, будьте осторожны при отделении радиатора от ядра микросхемы). В данном случае, термопаста хорошо растворясь спиртом.


После чего были отвинчены обе крепежные скобки с крючками от радиатора.


Потом берем линейку и снимаем размеры с радиатора. А точнее кординаты ответстий под резьбу шурупов и расположение углублений в радиаторе под крепежные скобки. Наносим все это хозяйство на радиатор от Socket'a примеряем и снимаем лишний аллюминий напильником для создания углублений под крепежные скобки. Величина глубины их равна толшине металла скобки. 




Сверлим отверстия чуть меньшего диаметра чем винты и вбиваем винты (как гвозди молотком) в металл. Аллюминий металл мягкий поэтому винты хорошо войдут и закрепятся.


Скотчем изолируем скобки от коротких замыканий на деталях. И так как одной стороной радиатор ложиться на PCI-порты я ее тоже заизолировал скотчем (на всякий).

После прикручиваем/приклеиваем к радиатору вентилятор (я использовал крепление проволкой).


Примеряем, наносим термопасту и устанавливаем на карту. Получаем монстра :)


Ремонт занял примерно 2 часа, из которых 1,5 я вытачивал углубления и сверлил отверстия добиваясь точности и мучаясь без тисков. Если вы как и я промахнулись с первого раза с отверстием, то возмите кусочек аллюминевой проволки  и забейте его в отверстие, сняв напильником лишний металл.

Монстр был установлен в компьютер и работает уже 2 меясяца без нареканий. 



Температура по показанию драйвера от Nvidia X Server Setting под Linux составляет 54-60 градусов С.