FreeBSD 入门笔记

Apr 19, 2021 • 预计阅读时间 6 分钟

配置 sudo

root 用户权限最高,除非必要情况,日常维护和使用应该使用普通用户帐号。

系统默认不提供 sudo 命令,需要使用 root 用户自行安装:

pkg install sudo

创建一个普通用户(用户名 v),默认添加到 staff 分组:

adduser -g staff -s sh -w yes
Username: v

创建一个 admin 分组,并添加 vroot 两位用户:

pw groupadd admin
pw groupmod admin -m v root

创建一个 wheel 分组,只添加 root 用户:

pw groupadd wheel
pw groupmod wheel -m root

admin 组里移除用户 v

pw groupmod admin -d v

删除 admin 用户组:

pw groupdel admin

staffadminwheel 权限的区别:

  • staff,任何新建的用户都属于这个组,权限最低。
  • admin,具有管理系统的权限,可以使用 sudo 命令。
  • wheel,超级管理员权限,可以任意修改系统功能(这个名称来源于俚语 big wheel,意为大人物)。

/usr/local/etc/sudoers.d/ 下新建两个文件 adminwheel

admin内容如下:

%admin ALL=(ALL) ALL

wheel内容如下,多了个 NOPASSWD: ,使用 sudo 时不需要输入密码:

%wheel ALL=(ALL) NOPASSWD:ALL

更换源

默认的源,存储在 /etc/pkg/FreeBSD.conf

# $FreeBSD$
#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
  mirror_type: "srv",
  signature_type: "fingerprints",
  fingerprints: "/usr/share/keys/pkg",
  enabled: yes
}

安装 security/ca_root_nss 可以使用 HTTPS 防止被劫持,推荐!

pkg install -r FreeBSD security/ca_root_nss

源地址可以改为 HTTPS:

  ...
  url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
  ...

重新生成索引:

pkg update -f
Updating FreeBSD repository catalogue...
pkg: Repository FreeBSD has a wrong packagesite, need to re-create database
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01    
Fetching packagesite.txz: 100%    6 MiB   6.5MB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 30336 packages processed.
All repositories are up to date.

国内可以使用中科大的源:https://mirrors.ustc.edu.cn/help/freebsd-pkg.html

更新系统

FreeBSD 提供了实用工具 freebsd-update 来安装系统更新,包括升级到大版本。

常规的安全更新:

freebsd-update fetch
freebsd-update install

小版本或者大版本更新,13.0是要更新到的版本号:

freebsd-update upgrade -r 13.0-RELEASE
freebsd-update install

安装后需要重启系统:

reboot

然后再继续完成安装:

freebsd-update install

系统设置工具 bsdconfig

bsdconfig 是 FreeBSD 提供的系统配置实用工具,是个图像化界面。

安全的操作 rc 文件

sysrc 是 FreeBSD 提供的 rc 文件实用工具,代替手动编辑 rc.conf

作为网关服务器

打开 IP 转发功能:

sysrc gateway_enable="YES"
sysrc ipv6_gateway_enable="YES"

打开防火墙,开启 NAT:

sysrc firewall_enable="YES"
sysrc firewall_script="/etc/ipfw.rules"
sysrc firewall_nat_enable="YES"

设置默认接受连接: vi /boot/loader.conf

net.inet.ip.fw.default_to_accept=1

手动设置 resolv.conf

手动编辑 resolv.conf 后,重启系统又会被重置,因为 DHCP 会重写这个文件。

防止 resolvconf 服务覆盖 resolv.conf:vi /etc/resolvconf.conf

resolv_conf="/dev/null"

再编辑 resolv.conf 就可以了。

查看网卡速率

1 秒刷新一次:

systat -if 1

压缩和解压 txz

解压到根 /

tar -C / -xzvf src.txz

压缩目录:

tar -czvf src.txz src

安装软件

FreeBSD 的包管理工具是 pkg,默认的安装目录是 /usr/local/

  • 更新包源信息:pkg update
  • 安装一个或多个包:pkg install cmake ninja ...
  • 更新已安装的包: pkg upgrade
  • 清除本地包缓存:pkg clean,会清空缓存在 /var/cache/pkg/ 里的包

服务管理系统

FreeBSD 使用 rc.d 框架管理服务。

  • 启动一个服务: service nginx start
  • 停止一个服务: service nginx stop
  • 重启一个服务: service nginx restart

出于安全性考虑,服务安装以后默认是禁用状态,以上命令是无法执行的,需要先开启服务:

vi /etc/rc.conf

添加一行,${name}_enable="YES"${name} 表示服务名称,这是固定格式:

nginx_enable="YES"

服务所对应的脚本路径是: /usr/local/etc/rc.d/

目录结构

FreeBSD 目录功能划分属于规规矩矩的学院派,有条理而且清晰。

/bin 在单个用户和多用户环境下的基本工具目录。
/sbin 在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。
/etc 系统启动的配置和脚本。
/usr/bin 存放实用命令,程序设计工具,和应用软件。
/usr/sbin 存放系统后台程序 和 系统工具 (由用户执行)。
/usr/libexec 存放系统实用或后台程序 (从另外的程序启动执行)。
/tmp 临时文件。 /tmp 目录中的内容,一般不会在系统重新启动之后保留。
/var/log 存放各种的系统记录文件。
/var/tmp 临时文件。 这些文件在系统重新启动时通常会保留, 除非 /var 是一个内存中的文件系统。
/var/run 用来存放 Pidfile。

对于用户安装的程序,可以写入的目录是:

  • /var/run
  • /var/log
  • /var/tmp
  • /tmp

用户安装的程序都统一在 /usr/local 下,比如:

  • /usr/local/bin
  • /usr/local/sbin
  • /usr/local/etc
  • /usr/local/libexec

可以简单理解为系统使用 /usr,用户使用 /usr/local

更多信息,参考官方的文档:https://docs.freebsd.org/zh_CN/books/handbook/dirstructure.html

保持 SSH 在线

服务端设置:

编辑 /etc/ssh/sshd_config,调整 ClientAlive 的设置:

ClientAliveInterval 10
ClientAliveCountMax 3

10 秒给客户端发一次检测,客户端如果 3 次都不回应,则认为客户端已断开连接。

ClientAliveInterval 默认是 0,表示禁用检测。

客户端设置:

全局用户生效:/etc/ssh/ssh_config ,仅对当前用户生效:~/.ssh/config

Host *
ServerAliveInterval 10
ServerAliveCountMax 3

或者在连接的时候使用 -o 指定参数:

ssh [email protected] -p 22 -o ServerAliveInterval=10 -o ServerAliveCountMax=3

客户端和服务端任一开启检测即可。

更换默认 Shell

推荐使用 zsh:

pkg install zsh
chsh -s /usr/local/bin/zsh
touch ~/.zshrc

安装 CertBot

https://certbot.eff.org/lets-encrypt/freebsd-nginx.html

pkg install py37-certbot

设置自动更新证书:vi /etc/periodic.conf

weekly_certbot_enable="YES"

FreeBSD on Raspberry Pi

在树莓派上 FreeBSD 默认内置了两个帐户 root/rootfreebsd/freebsd

root 禁止了 SSH 登录。

freebsd 是普通帐户,可以 SSH 登录,登录进树莓派后使用 su 切换到 root 然后安装 sudo

如果在树莓派上编译 go 源码提示:No space left on device,可能是 /tmp 上可用空间太小了。

解决方法:export TMPDIR=/var/tmp

FreeBSD 13 默认没有加载 Wi-Fi 驱动,需要从 Ports 编译安装:

先同步系统时间,否则会遇到错误(Snapshot appears to have been created more than one day into the future! (Is the system clock correct?)):

ntpdate time.apple.com

ntpd 包含了 ntpdate 的功能,可以把 NTP 同步设置为开机服务,编辑 /etc/rc.conf

ntpd_enable="YES" 

启动 NTP 服务:service ntpd start

NTP 官方文档: https://docs.freebsd.org/doc/6.1-RELEASE/usr/share/doc/handbook/network-ntp.html

再安装 Ports (/usr/ports):

portsnap fetch
portsnap extract
portsnap update

编译 bwn 驱动:

cd /usr/ports/net/bwn-firmware-kmod
make install clean

如果遇到报错:bwn-firmware-kmod-0.1.2 is only for amd64 i386 powerpc powerpc64, while you are running aarch64 (reason: hardware particular to PCI/CardBus)

===>  bwn-firmware-kmod-0.1.2 is only for amd64 i386 powerpc powerpc64, while
you are running aarch64 (reason: hardware particular to PCI/CardBus).
*** Error code 1

Stop.
make: stopped in /usr/ports/net/bwn-firmware-kmod

vi Makefile 增加 aarch64

ONLY_FOR_ARCHS=         aarch64 amd64 i386 powerpc powerpc64

如果遇到报错:requires kernel source files in SRC_BASE=/usr/src

===>  bwn-firmware-kmod-0.1.2 requires kernel source files in
SRC_BASE=/usr/src.
*** Error code 1

Stop.
make: stopped in /usr/ports/net/bwn-firmware-kmod

解决方法:

手动下载源码,释放到根路径下。

fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/`freebsd-version -k`/src.txz
tar -C / -xzvf src.txz

再次执行 make install clean 编译安装驱动,期间会自动从 downloads.openwrt.org 下载所依赖到源文件。

...
...
...
====> Compressing man pages (compress-man)
===>  Installing for bwn-firmware-kmod-0.1.2
===>  Checking if bwn-firmware-kmod is already installed
===>   Registering installation for bwn-firmware-kmod-0.1.2
Installing bwn-firmware-kmod-0.1.2...
===>  Cleaning for b43-fwcutter-019
===>  Cleaning for gmake-4.3_2
===>  Cleaning for bwn-firmware-kmod-0.1.2

安装后驱动就自动加载了,如果没有,可以手动加载:kldload if_bwn

开机自动加载 vi /boot/loader.conf

if_bwn_load="YES"
bwn_v4_ucode_load="YES"
bwn_v4_lp_ucode="YES"

vi /etc/rc.conf,把设备 bwn0 映射到 wlan0,自动获取 IP:

wlans_bwn0="wlan0"
ifconfig_wlan0="WPA DHCP"

配置 Wi-Fi 连接密码 vi /etc/wpa_supplicant.conf

参考文档: https://www.freebsd.org/cgi/man.cgi?wpa_supplicant.conf(5)

# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

network={
    ssid="lvv.me"     # your Wi-Fi name
    scan_ssid=1
    key_mgmt=WPA-PSK
    psk="1234567890"  # your Wi-Fi password
}

加载 USB 无线网卡:

目前 FreeBSD 还不支持 5G Wi-Fi,只有使用 2.4G 的频率。

802.11ac (Wi-Fi 5) todo

推荐选择 Realtek 芯片的 USB 网卡,官方支持的型号还算可以: https://www.freebsd.org/cgi/man.cgi?query=rtwn_usb&sektion=4&manpath=freebsd-release-ports

手动加载驱动:kldload rtwn_usb

/boot/loader.conf 设置为开机加载:

rtwn_usb_load="YES"
legal.realtek.license_ack=1

编辑 /etc/rc.conf,映射网卡接口:

wlans_rtwn0="wlan1"
ifconfig_wlan1="WPA DHCP"

无线网卡作为热点 vi /etc/rc.conf

hostapd_enable="YES"
wlans_rtwn0="wlan1"
wlans_ath0="wlan1"
create_args_wlan1="wlanmode hostap"
ifconfig_wlan1="inet 192.168.101.1 netmask 255.255.255.0"

设置热点名称和密码 vi /etc/hostapd.conf

加密方式是 WPA2-PSK

interface=wlan1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=NAME
wpa=2
wpa_passphrase=PASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
channel=6
hw_mode=g
ieee80211n=1
wmm_enabled=1

设置 DHCP 服务器:

pkg install dhcpd
sysrc dhcpd_enable="YES"
sysrc dhcpd_ifaces="wlan1"

配置自动分配的 IP 地址池,需要和热点是同一个网段 /usr/local/etc/dhcpd.conf

subnet 192.168.101.0 netmask 255.255.255.0 {
    range 192.168.101.100 192.168.101.199;
    option routers 192.168.101.1;
    option domain-name-servers 192.168.101.1;
}

设置 NAT ,让热点的流量转发到有线网卡上:

NAT 开启转发功能:

sysrc gateway_enable="YES"
sysrc ipv6_gateway_enable="YES"
sysrc pf_enable="YES"

/etc/pf.conf 内容如下:

int_if=wlan1
ext_if=genet0

set skip on lo0

nat on $ext_if from $int_if:network to any -> ($ext_if)

pass in all
pass out all

重启 pf 完成设置:service pf restart

FreeBSD
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

Shell 脚本获取微信登录二维码

在 Linode 上安装 FreeBSD