После нескольких лет эксплуатации файлового хранилища на базе nas4free (xigmanas), решил перейти на полноценную ОС. Выбор пал на FreeBSD и на это есть несколько причин:
- FreeBSD бесплатная
- Система очень стабильна и вылизана
- Очень хорошая документация
- Поддержка ZFS из коробки
Итак с системой определились переходим к железу. Требования были следующие:
- Хороший проветриваемый корпус
- Наличие отсеков под HDD минимум от 4 штук
- Объем оперативной памяти минимум 8Gb или более, желательно с ECC
В загашнике был HP Microserver Gen 8 с процессором E3-1265L V2 с 16 Gb DDR3 ECC. Далее идем на https://www.freebsd.org/ и качаем свежий образ и записываем его на флешку или диск. Установка самой FreeBSD я считаю вообще тривиальной, и сводится к нажатию Next > Next > Finish. Выбор пакетов для установка тоже остается по вкусу, т.к. базовая система ставится всегда, из пакетов я выбираю lib-32 без дебага. Файловую систему для системного диска я выбрал UFS (почему не ZFS, потому что отказоустойчивости на системном разделе не будет). После завершения установки загружаемся в консоль и приступаем к настройке сервера.
1. Метки дисков в fstab
Иногда случается что при установке usb накопителя могут сбиться имена дисков и тогда операционная система может не загрузиться ссылаясь на невозможность смонтировать корневую файловую систему или файл подкачки. Поэтому лучше сделать монтирование разделов по меткам. Для этого загружаемся в однопользовательском режиме и создаем метки разделов.
Для начала посмотрим какие разделы монтируются
1 2 3 4 |
# cat /etc/fstab # Device Mountpoint FStype Options Dump Pass# /dev/ada0p2 / ufs rw 1 1 /dev/ada0p3 none swap sw 0 0 |
где ada0p2 у нас корневой раздел, а ada0p3 раздел подкачки. Далее назначаем метки разделам:
ada0p2 — rootfs
ada0p3 — swap
1 |
# glabel label rootfs /dev/ada0p2 |
1 |
# glabel label swap /dev/ada0p3 |
Далее выходим из однопользовательского режима
1 |
exit |
и ждем завершения загрузки системы. Теперь открываем файл fstab и вносим коррективы
1 |
ee /etc/fstab |
1 2 3 |
# Device Mountpoint FStype Options Dump Pass# /dev/label/rootfs / ufs rw 1 1 /dev/label/swap none swap sw 0 0 |
Сохраняем и перезагружаемся.
2. Настройка сети
Если во время установки сеть не настроилась то лучше сделать это сейчас и перейти уже к настройке по SSH.
1 |
ifconfig |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 groups: lo nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> hn0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8051b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4,LRO,LINKSTATE> ether 00:15:5d:00:65:25 inet 192.168.0.151 netmask 0xffffff00 broadcast 192.168.0.255 media: Ethernet autoselect (10Gbase-T <full-duplex>) status: active nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
У меня определилась сетевая карта hn0 и с настроенным адресом. Но в случае отсутствия адреса приступаем к настройке.
1 |
ee /etc/rc.conf |
И добавляем в файл следующие строки, не забываем что сетевая карта hn0
1 2 |
ifconfig_hn0="inet 192.168.1.30 netmask 255.255.255.0" defaultrouter="192.168.1.1" |
Настраиваем DNS
1 |
ee /etc/resolv.conf |
1 |
nameserver 192.168.1.1 |
После внесения изменений нужно перезапустить сервак (так офф документация советует).
3. Русификация консоли и терминала
Начнем с консоли:
Проверяем локали в системе
1 2 3 4 5 6 |
locale -a | grep ru ru_RU.CP1251 ru_RU.CP866 ru_RU.ISO8859-5 ru_RU.KOI8-R ru_RU.UTF-8 |
Использовать будем ru_RU.UTF-8
Смотрим доступные keymaps
1 2 3 4 |
ls -Al /usr/share/vt/keymaps/ | grep ru -r--r--r-- 1 root wheel 16228 20 янв. 11:41 ru.kbd -r--r--r-- 1 root wheel 16234 20 янв. 11:41 ru.shift.kbd -r--r--r-- 1 root wheel 16232 20 янв. 11:41 ru.win.kbd |
- keymap=“ru” — переключение на русский клавишей CAPS Lock;
- keymap=“ru.shift” — переключение на русский клавишей CAPS Lock, но верхний ряд на клавиатуре by default будет цифровой;
- keymap=“ru.win” — переключение на русский клавишами CTRL+SHIFT.
Выбираем понравившийся для указания в /etc/rc.conf
Выбираем шрифт, посмотреть доступные можно командой
1 2 3 4 5 6 7 8 9 10 11 12 |
ls -Al /usr/share/vt/fonts/ total 176 -r--r--r-- 1 root wheel 8452 7 дек. 2018 gallant.fnt -r--r--r-- 1 root wheel 1845 20 янв. 11:41 INDEX.fonts -r--r--r-- 1 root wheel 76248 7 дек. 2018 terminus-b32.fnt -r--r--r-- 1 root wheel 1318 7 дек. 2018 tom-thumb.fnt -r--r--r-- 1 root wheel 36408 7 дек. 2018 vgarom-16x32.fnt -r--r--r-- 1 root wheel 8742 7 дек. 2018 vgarom-8x14.fnt -r--r--r-- 1 root wheel 9864 7 дек. 2018 vgarom-8x16.fnt -r--r--r-- 1 root wheel 5384 7 дек. 2018 vgarom-8x8.fnt -r--r--r-- 1 root wheel 5400 7 дек. 2018 vgarom-thin-8x16.fnt -r--r--r-- 1 root wheel 2704 7 дек. 2018 vgarom-thin-8x8.fnt |
Из них:
- vgarom-8×8.fnt — матрица 8×8 с поддержкой русских символов;
- vgarom-8×14.fnt — матрица 8×14 с поддержкой русских символов;
- vgarom-8×16.fnt — матрица 8×16 с поддержкой русских символов (используется по умолчанию);
- vgarom-16×32.fnt — матрица 16×32 с поддержкой русских символов (для wide мониторов).
Итак в файле /etc/rc.conf должно получится нечто следующее
1 |
ee /etc/rc.conf |
1 2 |
keymap="ru.win" font8x16="vgarom-8x16" #можно не указывать |
Так-же добавляем строчку чтобы консоль загрузилась в графическом режиме если кириллица все еще не отображается нормально после перезапуска машины
1 |
ee /boot/loader.conf |
1 2 |
hw.vga.textmode=0 kern.vty=vt |
Для терминала:
Будем использовать login class, открываем файл
1 |
ee /etc/login.conf |
и приводим класс к следующему виду
1 2 3 4 |
russian|Russian Users Accounts:\ :charset=UTF-8:\ :lang=ru_RU.UTF-8:\ :tc=default: |
после этого нужно синхронизировать базу
1 |
cap_mkdb /etc/login.conf |
Для существующего пользователя меняем класс.
1 |
pw user mod user_name -L russian |
Где user_name имя пользователя
И перезапуск
После настройки SSH, можно подключиться удобным терминалом и настраивать сервер более приятным способом.
3. ZFS (Zettabyte File System)
Открываем файл
1 |
ee /etc/rc.conf |
И добавляем
1 |
zfs_enable="YES" |
Перезапускаем систему и приступаем к настройке пула.
У меня есть 2 диска для хранилища (da1, da2)
Для начала диски нужно выровнять если они с сектором 4k, для этого удаляем разметку с них
1 |
gpart destroy -F /dev/ada1 |
1 |
gpart destroy -F /dev/ada2 |
Теперь создаем GPT раздел.
1 |
gpart create -s gpt /dev/ada1 |
1 |
gpart create -s gpt /dev/ada2 |
Создаем раздел со смещением и задаем метку дисков disk0, disk1. Для меток дисков рекомендую использовать их серийные номера. Для того чтобы узнать серийный номер диска выполните
1 |
diskinfo -v /dev/da1 | grep ident |
1 |
891DLUDCS # Disk ident. |
Получившийся номер можно использовать как идентификатор диска, но для примера я использую disk0, disk1
1 |
gpart add -t freebsd-zfs -l disk0 -b 8192 -a 4k /dev/ada1 |
1 |
gpart add -t freebsd-zfs -l disk1 -b 8192 -a 4k /dev/ada2 |
По итогу у нас получилось два раздела GPT (da1p1, da2p1) с метками disk0, disk1 и с отрезанными 4 мегабайтами в начале диска (это пригодится для замены диска)
Поэтому создаем пул с названием storage и на GPT метках
Для аналога RAID1
1 |
zpool create pool mirror /dev/gpt/disk0 /dev/gpt/disk1 |
Для аналога RAID5
1 |
zpool create pool raidz1 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 |
Для аналога RAID6
1 |
zpool create pool raidz2 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3 |
Теперь включаем сжатие
1 |
zfs set compression=lz4 pool |
и задаем точку монтирования, если не устраивает по умолчанию
1 |
zfs set mountpoint=/mnt/storage pool |
4. Samba
Обозначим вводные данные:
- Пользователь sambauser
- Группа пользователя sambauser
- Шара будет находиться /mnt/storage/files
Ищем самбу в пакетах
1 |
pkg search samba |
1 2 3 4 5 6 |
p5-Samba-LDAP-0.05_2 Manage a Samba PDC with an LDAP Backend p5-Samba-SIDhelper-0.0.0_3 Create SIDs based on G/UIDs samba-nsupdate-9.16.5 nsupdate utility with the GSS-TSIG support samba411-4.11.15 Free SMB/CIFS and AD/DC server and client for Unix samba412-4.12.9_1 Free SMB/CIFS and AD/DC server and client for Unix samba413-4.13.1_1 Free SMB/CIFS and AD/DC server and client for Unix |
Ставим версию 4.13
1 |
pkg install samba413-4.13.1_1 |
После установка нам выдают что:
Конфигурация находится /usr/local/etc/smb4.conf
Логи /var/log/samba4
Включаем сервис самбы
1 |
ee /etc/rc.conf |
1 |
samba_server_enable="YES" |
Создаем директорию
1 |
mkdir /mnt/storage/files |
Создаем пользователя sambauser
1 |
adduser sambauser |
Задаем права на папку (пользователь и группа sambauser, пользователь и группа могут делать с файлами все что хотят),
1 2 |
chmod -R 770 /mnt/storage/files chown sambauser:sambauser /mnt/storage/files |
Создаем пустой файл и открываем его для редактирования:
1 |
ee /usr/local/etc/smb4.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
[global] #Тип аутентификации security = user #База паролей passdb backend = tdbsam #Рабочая группа workgroup = home #Текстовое описание сервера server string = storage #Netbios имя netbios name = storage #Мастер браузер local master = no #Приоритет мастер браузера os level = 255 #Домен контролер domain master = no #Версии протоколов server min protocol = SMB2 client min protocol = SMB2 client max protocol = SMB3 #wins сервер wins support = no #Название сетевой шары [storage] #Путь до директории шары path = /mnt/storage/files #Разрешенные пользователи valid users = @sambauser #Группа для сетевой шары force group = sambauser #Маска создания файлов create mask = 0770 #Маска создания директорий directory mask = 0770 #Разрешение на запись writable = yes #Видимость сетевой шары browseable = yes |
Проверяем наш конфигурационный файл на ошибки
1 |
testparm /usr/local/etc/smb4.conf |
Теперь нужно добавить нашего пользователей в samba.
1 |
smbpasswd -a sambauser |
Ну и перезапускаем samba
1 |
/usr/local/etc/rc.d/samba_server restart |
Финальные штрихи
Midnight Commander — файловые менеджер, клон Norton Commander
1 |
pkg install mc |
Screen — это оконный менеджер, разделяющий один физический терминал между несколькими процессами
1 |
pkg install screen |