Заметки о FreeBSD

Заметки о работе с ОС FreeBSD. Статьи об установке и настройке ПО для FreeBSD.

6 февраля 2017 г.

FreeBSD 9.3 iSCSI Initiator

Настройка ISCSI инциатора во FreeBSD 9.3 (Начиная с 10.0 всё еще проще).


Подгружаем модуль ядра
[root@mx1 ~]# kldload iscsi_initiator



[root@mx1 ~]# cat /boot/loader.conf
iscsi_initiator_load="YES"



Инициализируем блочное устройство
[root@mx1 ~]# iscontrol -v -d targetaddress=192.168.154.60 initiatorname='iqn.2017-02.ru.spb.testcorp:testsrv31'
                    port = 3260
                    tags = 0
                 maxluns = 0
                     iqn = iqn.2005-01.il.ac.huji.cs:
          maxConnections = 1
maxRecvDataSegmentLength = 65536
maxXmitDataSegmentLength = 65536
          maxBurstLength = 131072
        firstBurstLength = 65536
        defaultTime2Wait = 0
      defaultTime2Retain = 0
       maxOutstandingR2T = 1
      errorRecoveryLevel = 0
    targetPortalGroupTag = 0
            headerDigest = None,CRC32C
              dataDigest = None,CRC32C
              initialR2T = 1
           immediateData = 1
          dataPDUInOrder = 1
     dataSequenceInOrder = 1
             sessionType = Normal
           targetAddress = (null)
             targetAlias = (null)
              targetName = (null)
           initiatorName = (null)
          initiatorAlias = (null)
              authMethod = None
              chapSecret = (null)
               chapIName = (null)
             tgtChapName = (null)
           tgtChapSecret = (null)
      tgttgtChallengeLen = 0
adding 'targetaddress=192.168.54.6'
I-: cmd=0x3 len=296
        SessionType=Discovery
        InitiatorName=iqn.2017-02.ru.spb.testcorp:testsrv31
        MaxBurstLength=131072
        HeaderDigest=None,CRC32C
        DataDigest=None,CRC32C
        MaxRecvDataSegmentLength=65536
        ErrorRecoveryLevel=0
        DefaultTime2Wait=0
        DefaultTime2Retain=0
        DataPDUInOrder=Yes
        DataSequenceInOrder=Yes
        MaxOutstandingR2T=1
T-: cmd=0x23 len=238
        TargetPortalGroupTag=0x03e8
        MaxRecvDataSegmentLength=65536
        HeaderDigest=None
        DataDigest=None
        MaxBurstLength=65536
        DefaultTime2Wait=0
        DefaultTime2Retain=0
        ErrorRecoveryLevel=0
        MaxOutstandingR2T=1
        DataPDUInOrder=Yes
        DataSequenceInOrder=Yes
I-: cmd=0x4 len=16
        SendTargets=All
T-: cmd=0x24 len=84
        TargetName=iqn.1992-08.com.netapp:sn.142238657
        TargetAddress=192.168.154.60:3260,1000
TargetName=iqn.1992-08.com.netapp:sn.142238657
TargetAddress=192.168.154.60:3260,1000
I-: cmd=0x6 len=0
T-: cmd=0x26 len=0



Конфиг
[root@mx1 ~]# cat /etc/iscsi.conf
napp_disk_testsrv31 {
initiatorname = iqn.2017-02.ru.spb.testcorp:testsrv31
TargetName=iqn.1992-08.com.netapp:sn.142238657
TargetAddress=192.168.154.60:3260,1000
}



Подключаем
[root@mx1 ~]# iscontrol -c /etc/iscsi.conf -n napp_disk_testsrv31
iscontrol[7678]: running
[root@mx1 ~]# iscontrol[7678]: (pass3:iscsi0:0:0:0):  tagged openings now 0



[root@mx1 /dev]# gpart list da2
gpart: No such geom: da2.


Создаем разметку и файловую систему на новом устройстве
[root@mx1 /dev]# gpart create -s GPT /dev/da2
da2 created
[root@mx1 /dev]# gpart list da2
Geom name: da2
modified: false
state: OK
fwheads: 255
fwsectors: 63
last: 1468149726
first: 34
entries: 128
scheme: GPT
Consumers:
1. Name: da2
   Mediasize: 751692677120 (700G)
   Sectorsize: 512
   Mode: r0w0e0




[root@mx1 /dev]# gpart add -t freebsd-ufs /dev/da2
da2p1 added
[root@mx1 /dev]# gpart list da2
Geom name: da2
modified: false
state: OK
fwheads: 255
fwsectors: 63
last: 1468149726
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: da2p1
   Mediasize: 751692642816 (700G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 8e622b5c-e9f0-11e6-8e23-005056845619
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 751692642816
   offset: 17408
   type: freebsd-ufs
   index: 1
   end: 1468149726
   start: 34
Consumers:
1. Name: da2
   Mediasize: 751692677120 (700G)
   Sectorsize: 512
   Mode: r0w0e0



[root@mx1 /dev]# newfs -U /dev/da2p1
/dev/da2p1: 716869.9MB (1468149688 sectors) block size 32768, fragment size 4096
        using 1145 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1282432, 2564672, 3846912, 5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592, 14104832, 15387072, 16669312, 17951552,
 19233792, 20516032, 21798272, 23080512, 24362752, 25644992, 26927232, 28209472, 29491712, 30773952, 32056192, 33338432, 34620672,
....



Включаем журналирование:
[root@mx1 /dev]# tunefs -j enable /dev/da2p1
Using inode 4 in cg 0 for 33554432 byte journal
tunefs: soft updates journaling set

Монтируем
[root@mx1 /dev]# mount /dev/da2p1 /wrk2



[root@mx1 /dev]# mount
/dev/da0p3 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
/dev/da1p1 on /wrk (ufs, local, journaled soft-updates)
/dev/da2p1 on /wrk2 (ufs, local, journaled soft-updates)



Записываем в fstab для автомонтирования при загрузке сиситемы
[root@mx1 /dev]# ee /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0p2      none            swap    sw      0       0
/dev/da0p3      /               ufs     rw      1       1
/dev/da1p1      /wrk            ufs     rw      2       2
/dev/da2p1     /wrk2           ufs     rw      3       3



1 февраля 2017 г.

FreeBSD 11 IPFW Kernel NAT

Настройка "ядерного" IPFW NAT на FreeBSD 11

em0 - внутренний интерфейс
em1 - внешний интерфейс


Версия FreeBSD:

root@test_machine_bsd11:~ # uname -mrs
FreeBSD 11.0-RELEASE amd64
root@test_machine_bsd11:~ # freebsd-version
11.0-RELEASE


Подгружаем нужные модули ядра:

root@test_machine_bsd11:~ # cat /boot/loader.conf
ipfw_load="YES"
ipfw_nat_load="YES"

Можно подгружать только ipfw_nat.ko - он сам подгрузит ipfw.ko, но лучше перестраховаться.


Разрешаем запуск ipfw в rc.conf:

root@test_machine_bsd11:~ # cat /etc/rc.conf
...
firewall_enable="YES"
firewall_type="/etc/ipfw.rules"

firewall_nat_enable в rc.conf писать не нужно. Теперь это ни на что не влияет.


Правила фаервола:

root@test_machine_bsd11:~ # cat /etc/ipfw.rules
# Правило необходимо чтобы пакеты от самого сервера не попадали в NAT (в правило 07000)
add 02000 allow all from me to any via em1 keep-state
nat 1 config if em1 log reset same_ports deny_in
add 03001 nat 1 all from 192.168.94.0/24 to 8.8.8.8 out via em1
# Правило для "обратного" NAT
add 07000 nat 1 all from any to 214.3.198.40 in via em1


12 января 2017 г.

FreeBSD 11 gmirror GPT на установленной системе

[root@testsrv998 ~]# freebsd-version
11.0-RELEASE-p6

У нас есть два диска:
ada0, где уже установлена система и ada1, который мы хотим использовать в качестве зеркала.

[root@testsrv998 ~]# ls | grep ada
ada0
ada0p1
ada0p2
ada0p3
ada1


Первым делом разрешаем загрузку модуля адра gmirror при старте системы:

[root@testsrv998 ~]# cat /boot/loader.conf
geom_mirror_load="YES"



[root@testsrv998 ~]# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16

Делаем копию таблицы разделов на новый диск:

[root@testsrv998 ~]# gpart backup ada0 | gpart restore -F /dev/ada1


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

[root@testsrv998 ~]# gpart show
=>       40  976773088  ada0  GPT  (466G)
         40       1024     1  freebsd-boot  (512K)
       1064    8388608     2  freebsd-swap  (4.0G)
    8389672   52428800     3  freebsd-ufs  (25G)
   60818472  915954656        - free -  (437G)
=>       40  976773088  ada1  GPT  (466G)
         40       1024     1  freebsd-boot  (512K)
       1064    8388608     2  freebsd-swap  (4.0G)
    8389672   52428800     3  freebsd-ufs  (25G)
   60818472  915954656        - free -  (437G)



Устанавливаем загрузчик на новый диск:

[root@testsrv998 ~]# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1


[root@testsrv998 ~]# mount
/dev/ada0p3 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)


На новом диске создаем файловую систему для корневого раздела (для boot и swap не надо)

[root@testsrv998 ~]# newfs -U /dev/ada1p3


Так так на ФС на существующем диске (ada0) включено журналирование - включаем его и на новом диске:

[root@testsrv998 ~]# tunefs -j enable /dev/ada1p3


Создаем зеркало для раздела boot:


[root@testsrv998 ~]# gmirror label -v -b round-robin boot /dev/ada0p1 /dev/ada1p1
Metadata value stored on /dev/ada0p1.
Metadata value stored on /dev/ada1p1.
Done.


И swap:
[root@testsrv998 ~]# gmirror label -v -b round-robin swap /dev/ada0p2 /dev/ada1p2
Metadata value stored on /dev/ada0p2.
Metadata value stored on /dev/ada1p2.
Done.


Теперь раздел root, но пока добавляем только ada1p3, т. к. система не даст записать метки на диск, с которого работает:
[root@testsrv998 ~]# gmirror label -v -b round-robin root /dev/ada1p3
Metadata value stored on /dev/ada1p3.
Done.


Должно получиться примерно так:
[root@testsrv998 ~]# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  DEGRADED  ada1p2 (ACTIVE)
mirror/root  COMPLETE  ada1p3 (ACTIVE)


Зеркало swap в режиме DEGRADED. После перезагрузки сервера перейдет в режим COMPLETE.


Теперь будем копировать данные через dump/restore на зеркальный диск:

[root@testsrv998 ~]# mkdir -p /new/root
[root@testsrv998 ~]# mount /dev/mirror/root /new/root/
[root@testsrv998 ~]# ( dump -0f - / ) | ( cd /new/root ; restore -rf - )
...
  DUMP: 57.94% done, finished in 0:03 at Thu Jan 12 11:33:22 2017
  DUMP: 76.99% done, finished in 0:02 at Thu Jan 12 11:37:44 2017
  DUMP: DUMP: 2225748 tape blocks
  DUMP: finished in 840 seconds, throughput 2649 KBytes/sec
  DUMP: DUMP IS DONE

Правим fstab на новом диске:
[root@testsrv998 ~]# cat /new/root/etc/fstab
# Device                Mountpoint      FStype  Options Dump    Pass#
/dev/mirror/swap        none            swap    sw      0       0
/dev/mirror/root        /               ufs     rw      1       1


И на рабочей системе:
[root@testsrv998 ~]# cat /etc/fstab
# Device                Mountpoint      FStype  Options Dump    Pass#
/dev/mirror/swap        none            swap    sw      0       0
/dev/mirror/root        /               ufs     rw      1       1


[root@testsrv998 ~]# umount /new/root/
[root@testsrv998 ~]# reboot


После загрузки проверяем:
[root@testsrv998 ~]# mount
/dev/mirror/root on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)

[root@testsrv998 ~]# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  COMPLETE  ada0p2 (ACTIVE)
                       ada1p2 (ACTIVE)
mirror/root  COMPLETE  ada1p3 (ACTIVE)


И добавляем недостающий раздел в зеркало root (ada0p3):
[root@testsrv998 ~]# gmirror insert root /dev/ada0p3


Синхронизация:
[root@testsrv998 ~]# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  COMPLETE  ada0p2 (ACTIVE)
                       ada1p2 (ACTIVE)
mirror/root  DEGRADED  ada1p3 (ACTIVE)
                       ada0p3 (SYNCHRONIZING, 3%)


Завершилась:
[root@testsrv998 ~]# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  COMPLETE  ada0p2 (ACTIVE)
                       ada1p2 (ACTIVE)
mirror/root  COMPLETE  ada1p3 (ACTIVE)
                       ada0p3 (ACTIVE)


После перезагрузки проверяем:
[root@testsrv998 ~]# dmesg | grep MIRROR
GEOM_MIRROR: Device mirror/boot launched (2/2).
GEOM_MIRROR: Device mirror/swap launched (2/2).
GEOM_MIRROR: Device mirror/root launched (2/2).