prettyprint

顯示具有 FreeBSD 標籤的文章。 顯示所有文章
顯示具有 FreeBSD 標籤的文章。 顯示所有文章

2022年8月23日 星期二

FreeBSD 13.1 Bluetooth Serial Port(SPP client) + Expressif ESP32 MCU(SPP Server): Remote Power Switch and Text Message

    本篇文章介紹使用FreeBSD藍芽的Serial Port(SPP)與Expressif ESP32微控制器(MCU)製作藍芽電源遙控開關,並與Android Phone互傳訊息。



    FreeBSD系統、ESP32 MCU與Android phone三個藍芽設備構成bluetooth piconet,ESP32 MCU當成Master, FreeBSD與Android phone當成slave。

有關ESP32 MCU當成SPP server的製作過程請參閱下列文章說明:https://rfwumcu.blogspot.com/2022/04/esp-idf-using-esp-idf-classic-bt-spp.html

本篇文章著重在FreeBSD藍芽Serial Port(SPP Client)設定方法。

  1. 查看FreeBSD上的藍芽設備名稱:

  2. 啟用藍芽ubt0:

  3. 檢查藍芽配對服務(hcsecd)是否啟用:

  4. 配對藍芽:
    此指令會自動更改/etc/bluetooth/hosts與/etc/bluetooth/hcsecd.conf檔案,自動加入設定內容。

  5. 檢查遠端藍芽設備是否開啟SPP服務:

  6. 連線遠端Bluetooth SPP Server:
    rfcomm_sppd開啟的serial port pseudo-terminal 為/dev/pts/2

  7. 由pseudo-Terminal收送訊息:
    送出訊息

    接收訊息


👉成果影片展示:




2022年8月18日 星期四

FreeBSD 13.1 透過手機連線網際網路(FreeBSD 13.1 Internet Access via Cell Phone)

  當處在沒為可上網的區域網路時,可利用手機透過電信網路連線網際網路。 本篇文章實做以FreeBSD 13.1 利用手機的USB網路共用(USB Tethering)、藍芽網路共用(Bluetooth Tethering)、與Wi-Fi熱點(Wi-Fi hot spot) 接取網際網路。



一、USB網路共用(USB Tethering):

  1. 使用Android手機時載入if_urndis:
    # kldload if_urndis

  2. 使用iPhone手機時載入if_ipheth:
    # lkdload if_ipheth

  3. 手機開啟USB網路共用


  4. FreeBSD就會新增一個ue0的網路介面

  5. 利用dhclient取得ip等網路設定
    # dhclient ue0

詳細步驟可參閱底下影片介紹

二、藍芽網路共用(Bluetooth Tethering):

  1. FreeBDS藍芽是架構在netgraph下,以指令dmesg查看是否有支援的驅動程式:
    # dmesg | grep ubt

  2. 啟用藍芽:
    # service bluetooth start ubt0
    若出現錯誤,再啟用一次即可。

  3. 有關Bluetooth device 設定檔存放在
    /etc/defaults/bluetooth.device.conf
    個別的device要覆寫default設定,更改檔案建立在/etc/bluetooth/<device_name>.conf中,例如/etc/bluetooth/ubt0.conf。像是需不需要配對驗證,可不可以被查詢名稱(inquiry, discoverable等)。

  4. 執行hcsecd或在/etc/rc.conf中設置hcsecd_enable="YES",負責藍芽配對,相對設定檔存在/etc/bluetooth/hcsecd.conf。

  5. 以bluetooth-config scan 掃描可連線的藍芽設備,此指令可配對藍芽外並將修改/etc/bluetooth/hosts與/etc/bluetooth/hcsecd.conf檔案。
    /etc/bluetooth/hosts存放bluetooth address與自訂名稱對應。
    /etc/bluetooth/hcsecd.conf存放配對PIN資料。


  6. 查看手機的藍芽是否支援NAP(Network Access Point) Service class:
    指令為sdpcontrol -a device browser or  sdpcontrol -a device search 0x1116
    0x1116為bluetooth NAP service class UUID
    # sdpcontrol -a iPhone search 0x1116

  7. 手機開啟藍芽網路共用:


  8. 使用btpand指令連線藍芽:
    # btpand -d device -a address -s NAP -i tap0

  9. 取得ip等相關網路設定
    dhclient tap0

三、Wi-Fi熱點(Wi-Fi hotspot):

  1. 手機開啟Wi-Fi hotspot,設定ssid, password
  2. FreeBSD 啟用Wi-Fi。
  3. 在/etc/wpa_supplicant.conf設定連線ssid與psk:



詳細設定過程請參閱下列影片連結:




2022年6月23日 星期四

在Raspberry Pi 3B+安裝FreeBSD 13.1 並實作WiFi Client/Access Point/Wireless Router等功能

     本實驗在Raspberry Pi 3B+硬體上安裝FreeeBSD 13.1系統,用來實現並測試當作WiFi Client 、 Access Point(AP)與Wireless Router的功能,三種模式如下圖所示:




因為FreeBSD尚未支援Raspberry Pi內建無線網卡的Driver,所以本次實驗以外加一片usb網卡(TP-Link TL-WN725N)來測試。

👉安裝FreeBSD 13.1系統在Raspberry Pi 3B+上

從FreeBSD官網下載image檔案:FreeBSD-13.1-RELEASE-arm64-aarch64-RPI.img.xz

下載Raspberry Pi Imager(https://downloads.raspberrypi.org/imager/imager_latest.exe)燒錄FreeBSD image到SD(註1)上,過程可參閱文末成果影片連結。

FreeBSD使用Raspberry Pi硬體,螢幕輸出的介面有兩種: primary為TTL Serial, Secondary 為Vodeo(HDMI介面),本實驗使用USB-UART介面接到筆電的USB上,開啟PuTTY Serial Port,如下圖,Raspberry Pi pinout可參閱https://pinout.xyz/。[RPI: Gnd(6), TX(8), RX(10)]

  • 系統root內定的password為root

本實驗使用的TP-Link TL-WN725N在FreeBSD下的driver 為rtwn,使用指令dmesg查閱,如下圖所示:

但使用內定參數實測後,網路存取速度異常慢,調整設定,載入kdlload wlan_amrr模組或設定dev.rtwn.0.ratectl=0,即可獲得良好的網路存取速度,可在/boot/loader.conf設定如下:
dev.rtwn.0.ratectl=0
wlan_amrr_load="YES"


👉設定成為WiFi Client使用:

  • 在/etc/rc.conf設定
wlans_rtwn0="wlan0"
ifconfig_wlan0="WPA SYNCDHCP"
create_args_wlan0="country TW"

  • 增設/etc/wpa_supplicant.conf檔案,內容填入
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
        ssid="your ssid"
scan_ssid=1
key_mgmt=WPA-PSK
psk="your passwd"
}
更改正確的ssid與psk
重新啟用系統後即可連至WiFi網路


👉設定成為Access Point(Bridge)使用:
Raspberry Pi wifi介面改成hostap mode,再將有線網路介面ue0與無線網路介面wlan0,加入到bridge members中。如上圖,終端無線設備(手機、筆電等)連到 Raspberry Pi AP後,即可將無線網路橋接到ISP Router連到Internet。終端無線設備屬於同一個網段,本實驗的例子為192.168.1.0/24。
  • 在/etc/rc.conf設定如下
#WLAN hostap mode
wlans_rtwn0="wlan0"
create_args_wlan0="wlanmode hostap -apbridge country TW"
hostapd_enable="YES"
# create a bridge
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.1.61/24 addm ue0 addm wlan0 up"
ifconfig_ue0="up"
ifconfig_wlan0="up"
#enable geteway(net.inet.ip.forwarding)
gateway_enable="YES"

  • 在/etc/hostapd.conf下設定如下
interface=wlan0
debug=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=myAP_SSID                       #==>改成你的SSID
wpa=2
wpa_passphrase=PassW0rd      #==>改成你的passphrase
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

重新啟用系統Raspberry Pi即成為無線網路的Access Point。
但在系統重新啟動後,並無法正常使用,bridge0並未將ue0與wlan0加入bridge0的members中。
以dmesg查看driver啟用順序,發現bridge0先啟用後,ue0與wlan0再啟用,推測因此bridge0才無法把加入ue0與wlan0正確加入到bridge0的members中。
以netstat -r 查看 route table並未正確產生

因此把bridge0建立時間延後到啟用local daemon時,再來create bridge並加入ue0與wlan0到members中,步驟如下:
  1. 取消/etc/rc.conf中的下面兩行
    cloned_interfaces="bridge0"
    ifconfig_bridge0="inet 192.168.1.61/24 addm ue0 addm wlan0 up"
  2. 在/etc/rc.local加入
    #!/bin/sh
    br=`ifconfig bridge create`
    ifconfig $br addm ue0 addm wlan0
    dhclient $br
修改後重啟系統即可正常使用AP功能了。

👉設定成為Wireless Router使用:
設定為router模式時,WiFi與有線LAN分別屬於不同網段,因此Raspberry Pi須具備路由器功能。如上圖所示,有線的LAN連接ISP Router為192.168.1.0/24,無線網路為10.10.200.0/24,Raspberry Pi Router無線網路介面設定IP為10.10.200.1。所以Raspberry Pi上需增加NAT(Firewall)、DHCP server與DNS server等功能(DNS server為選項)。
設定步驟如下:

➤DHCP Server使用isc-dhcp時:

執行指令
pkg install -y isc-dhcp44-server
加入hdcp server功能,啟用方式

  1. 在/etc/rc.conf中加入
    dhcpd_enable="YES"
    dhcpd_flags="-q"
    dhcpd_conf="/usr/local/etc/dhcpd.conf"
    dhcpd_ifaces="wlan0"
    dhcpd_withumask="022"
  2. 在/usr/local/etc/dhcpd.conf中加入
    option domain-name "mytest.org";
    default-lease-time 60;
    max-lease-time 72;
    # A slightly different configuration for an internal subnet.
     subnet 10.10.200.0 netmask 255.255.255.0 {
            range 10.10.200.10 10.10.200.20;
            option domain-name-servers 192.168.1.1;
            option routers 10.10.200.1;
            default-lease-time 600;
            max-lease-time 7200;
    }

➤DHCP Server使用dnsmasq時:

執行指令
pkg install -y dnsmasq
  1. 在/etc/rc.conf中加入
    dnsmasq_enable="YES"
  2. 在/usr/local/etc/dnsmasq.conf中加入
    interface=wlan0
    dhcp-range=10.10.200.90,10.10.200.100,255.255.255.0,24h

➤啟用Firewall(NAT)與hostap等功能:

本實驗使用IPFW與IN-Kernel NAT
  • 在/etc/rc.conf設定如下(使用dnsmasq)
ifconfig_ue0="DHCP"
#WLAN WiFi hostap
wlans_rtwn0="wlan0"
create_args_wlan0="wlanmode hostap -apbridge country TW"
ifconfig_wlan0="inet 10.10.200.1 netmask 255.255.255.0"
hostapd_enable="YES"

ifconfig_ue0="up"
ifconfig_wlan0="up"

#Filrewall and NAT enable
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/ipfw.rules"
gateway_enable="YES"

dnsmasq_enable="YES"

  • 在/etc/ipfw.rules下設定如下:

ipfw -q -f flush
cmd="ipfw -q add"
skip="skipto 1000"
pif=ue0
wif=wlan0
ks="keep-state"
good_tcpo="22,25,37,53,80,443,110"
ipfw disable one_pass
ipfw -q nat 1 config if $pif same_ports unreg_only reset
$cmd 005 allow all from any to any via $wif
$cmd 010 allow all from any to any via lo0 # exclude loopback traffic
$cmd 099 reass all from any to any in # reassemble inbound packets
$cmd 100 nat 1 ip from any to any in via $pif # NAT any inbound packets
# Allow the packet through if it has an existing entry in the dynamic rules table
$cmd 101 check-state
# Authorized outbound packets
$cmd 200 $skip tcp from any to any $good_tcpo out via $pif setup $ks
$cmd 210 $skip udp from any to any 53 out via $pif $ks
$cmd 220 $skip icmp from any to any out via $pif $ks
# allow all outbound
$cmd 230 $skip tcp from any to any out via $pif setup $ks
#Authorized inbound packets
$cmd 500 allow icmp from any to me via $pif
$cmd 501 allow tcp from any to me 22 via $pif setup $ks
# otherwise deny
$cmd 999 deny log all from any to any
$cmd 1000 nat 1 ip from any to any out via $pif # skipto location for outbound stateful rules
$cmd 1001 allow ip from any to any

詳細過程可觀看下列影片:




註1:

本次實驗使用不同SD卡安裝系統,若讀者發現系統DISK IO異常,也許可換不同廠牌SD卡試試看。


2022年6月9日 星期四

FreeBSD 13.1 GNOME、KDE5和Xfce中文桌面環境安裝

 FreeBSD桌面環境常用的有GNOME、KDE和Xfce。本文著重介紹在中文環境的安裝。

壹、FreeBSD 13.1基本安裝:

安裝過程主要使用內定值,其他特別事項如下說明:

  • 若不選擇安裝ports,則以後可使用portsnap fetch / portsnap extract指令安裝

  • 可安裝在ZFS partition或是一般的UFS partition
  • 使用ZFS可選用不同等級的 redundancy 增加系統可靠度
  • 開啟自動網路校時
  • 新增一位使用者 group 為wheel,可執行su指令成為root身分。

貳、安裝桌面環境

一、安裝共同部分:

  1. 安裝xorg,以pkg指令安裝
    pkg install -y xorg
  2. 安裝中文字型,使用ports安裝
    cd /usr/ports/chinese/CNS11643-font
    make install clean

二、安裝桌面環境:選擇一種安裝

  1. GNOME:
    執行:pkg install gnome
    在/etc/rc.conf加入以下各行,讓系統啟動後直接進入桌面環境
    dbus_enable="YES"
    hald_enable="YES"
    gdm_enable="YES"
    gnome_enable="YES"


  2. KDE5:
    執行:pkg install kde5,安裝完整KDE 或 執行: pkg install plasma5-desktop安裝精簡版的KDE
    執行: pkd install sddm, 安裝桌面登入管理
    在/etc/rc.conf加入以下各行,讓系統啟動後直接進入桌面環境
    dbus_enable="YES"
    hald_enable="YES"
    sddm_enable="YES
    "

  3. Xfce:
    執行:pkg install xfce
    執行: pkd install slim, 安裝桌面登入管理
    執行: echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xinitrc
    在/etc/rc.conf加入以下各行讓系統啟動後直接進入桌面環境
    dbus_enable="YES"
    hald_enable="YES"
    slim_enable="YES"

三、桌面環境中文介面:

重新啟動系統後即可自動進入桌面環境登入介面,登入後啟用終端機程式,安裝ibus中文輸入法
執行:pkg install -y zh-ibus-chewing(注音)或 pkg install -y zh-ibus-canglie(倉頡)
接著設定中文環境
  • GNOME:
進入settings的region & language設定中文並無法更改中文介面,直接更改
/usr/local/etc/gdm/locale.conf檔案內容
LANG="zh_TW.UTF-8"
LC_CTYPE="zh_TW.UTF-8"
LC_MESSAGES="zh_TW.UTF-8"
LC_ALL="zh_TW.UTF-8"

詳細過程可參閱以下影片:



  • KDE5:
在settings region/language 下選擇中文,並且在
.profile檔案下加入以下設定,才能正常啟用輸入法:
~/.profile
XIM=ibus; export XIM
GTK_IM_MODULE=ibus; export GTK_IM_MODULE
QT_IM_MODULE=ibus; export QT_IM_MODULE
XMODIFIERS=@im=ibus; export XMODIFIERS
XIM_PROGRAM="ibus-daemon"; export XIM_PROGRAM
XIM_ARGS="--daemonize --xim"; export XIM_ARGS

詳細過程可參閱以下影片:


  • Xfce:
在~/.xinitrc檔案下加入下列設定以啟用中文與輸入法:
XIM=ibus; export XIM
GTK_IM_MODULE=ibus; export GTK_IM_MODULE
QT_IM_MODULE=ibus; export QT_IM_MODULE
XMODIFIERS="@im=ibus"; export XMODIFIERS
XIM_PROGRAM="ibus-daemon"; export XIM_PROGRAM
XIM_ARGS="--daemonize --xim"; export XIM_ARGS

LANG="zh_TW.UTF-8"; export LANG
LC_CTYPE="zh_TW.UTF-8"; export LC_CTYPE
LC_MESSAGES="zh_TW.UTF-8"; export LC_MESSAGES
LC_ALL="zh_TW.UTF-8"; export LC_ALL

exec startxfce4

===============
xfce音效輸出設定
執行:
pkg install -y xfce4-pulseaudio-plugin
pkg install -y xfce4-volumed-pulse
== /etc/rc.conf加入
sound_load="YES"
snd_hda_load="YES"
=============
詳細過程可參閱以下影片:






2022年5月31日 星期二

ZFS介紹--在FreeBSD與ubuntu環境下實作(ZFS file system introduction and experiment in FreeBSD and ubuntu)

本篇文章著重在FreeBSD與ubuntu下實作ZFS 檔案系統,ZFS理論與優缺點部分不再贅述。

ZFS (Zettabyte file system):

實作上以兩個指令(zpool與zfs)來運作 

  1. zpool: 設定ZFS storage pools
  2. zfs --設定 ZFS datasets

zpool指令: 管理實體儲存設備,形成storage pool

  1. Device: 一個實體儲存設備,例如硬碟等.
  2. Virtual Device(vdev): 一個虛擬設備(vdev)可以是單一個device組成,也可以是多的devices組成mirror, raidz, raidz2, raidz3等主要儲存虛擬設備,也可以當成是hot spare,log等虛擬設備。 
  3. zfs pool: 一個storage pool是由多個vdevs組成,若主要儲存是由多個vdevs組成,則這幾個vdevs在storage pool中是以stripe方式組成。因此若vdev是由單一個device構成,則損換一個device則整個storage pool就會損壞。因此構成storage pool的vdevs一般會採用mirror 或raidz[1-3]較為適合。

zfs指令:管理在storage pool內的dataset

dataset分為:

  1. File system: 能直接掛載在檔案系統中,就像一般檔案系統一樣。
  2. Volume: 是一種block device,可視為是一顆邏輯硬碟,若要掛載在檔案系統中使用,需partition與format後才可mount在檔案系統下。一般直接用來當作iSCSI target的device。
  3. Snapshot: file system或volume特定時間點的快照,一般以 filesystem@name 或 volume@name形式表示。
  4. Bookmark: 像snapshot,但沒有實際保留資料空間。

實機測試:

實際在FreeBSD與ubuntu下,使用12個 20GB虛擬硬碟測試。
包含:
  • ZFS pool硬碟設備故障,如何手動與自動更換故障的設備。
  • ZFS pool在不同作業系統中實體移轉。
  • zfs dataset 的snapshot, rollback, clone
  • zfs dataset在同機器或跨機器間備份與回存(zfs send/zfs receive)
實作過程請參閱以下影片




2022年5月9日 星期一

Raspberry Pi 3 + FreeBSD + ZFS + iSCSI (Part 1)

實驗在Raspberry pi 3 B+上安裝FreeBSD作業系統,啟用ZFS檔案系統,比較ZFS dataset有使用壓縮(Compression)與副本(copies)屬性使用磁碟空間比較。另外建立一個ZFS Volume(Block device)作為iSCSI Target使用。以Windows系統連線iSCSI Target並格式化為NTFS。測試ZFS snapshot, rollback 等功能。 

一、下載Raspberry Pi的FreeBSD OS Image:

從FreeBSD官網下載作業系統映像檔,如下圖所示:

下載檔案:FreeBSD-13.0-RELEASE-arm64-aarch64-RPI.img.xz


二、使用Raspberry Pi Imager安裝作業系統到SD Card上:
  1. 從https://www.raspberrypi.com/software/下載Raspberry Pi Imager:
  2. 安裝FreeBSD Image:
    選用use custom選項,安裝剛剛下載的OS映像檔。

三、設定FreeBSD Static IP, nameserver, 與sshd允許遠端連線:

  1. static IP: 查看網路面卡名稱(ue0),編輯/etc/rc.conf加入
    ipconfig_ue0="inet x.x.x.x netmask x.x.x.x"
    defaultrouter="x.x.x.x"

  2. nameserver:編輯/etc/resolv.conf加入nameserver ip:

  3. sshd:編輯/etc/ssh/sshd_config更改permitRootLogin成yes

四、把外接USB硬碟加入ZFS pool:

啟用ZFS服務:
  1. 編輯/etc/rc.conf加入zfs_enable="YES"

  2. 執行service zfs start啟用zfs service
  3. 查看外接USB硬碟設備代號(da0),
    執行zpool create storage da0建立名稱為storage的zfs pool。

五、比較zfs dataset具有compression與copies屬性儲存空間的差異

  1. 分別建立storage/normal, storage/compress與storage/data三個filesystem,

  2. 設定storage/compress具有compression屬性
  3. 設定storage/data具有copies=2屬性,可把資料儲存兩份,增加可靠性
  4. 複製相同的資料到這三個檔案系統,查看使用硬碟空間的差異。



    六、建立iSCSI Target,使用Windows iSCSI Initiator 連線成為自己的硬碟

  1. 建立zfs volume(block device)作為iSCSI Target設備 zfs create -V 25G storage/iscsi01
  2. 編輯/etc/ctl.conf
    更改etc.conf權限,chmod 644 /etc/ctl.conf
    編輯/etc/rc.conf加入ctld_enable="YES"
    啟用service ctld start

  3. 啟用Windows iSCSI Initiator 連線iSCSI Target

  4. 使用Windoes disk managment格式化iSCSI 硬碟

七、zfs snapshot與rollback展示: