配置 sudo
root
用户权限最高,除非必要情况,日常维护和使用应该使用普通用户帐号。
系统默认不提供 sudo
命令,需要使用 root
用户自行安装:
pkg install sudo
创建一个普通用户(用户名 v
),默认添加到 staff
分组:
adduser -g staff -s sh -w yes
Username: v
创建一个 admin
分组,并添加 v
和 root
两位用户:
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
staff
,admin
和 wheel
权限的区别:
staff
,任何新建的用户都属于这个组,权限最低。admin
,具有管理系统的权限,可以使用sudo
命令。wheel
,超级管理员权限,可以任意修改系统功能(这个名称来源于俚语 big wheel,意为大人物)。
在 /usr/local/etc/sudoers.d/
下新建两个文件 admin
和 wheel
:
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 user@server -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/root
,freebsd/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 的频率。
推荐选择 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