FreeBSD setup notes for older MacBook Air / Mac systems

This note summarizes the main settings and commands used during the setup.
Device names can differ between machines, so always check the actual hardware first:

pciconf -lv
ifconfig
cat /dev/sndstat
ls /dev/backlight/
sysctl -a | grep -i light
dmesg | tail


=============================================================================
1. Base system and package management
=============================================================================

Update third-party packages:

su -
pkg update
pkg upgrade

Remove unused dependencies:

pkg autoremove

Clean the downloaded package cache:

pkg clean

Security audit for installed packages:

pkg audit -F

Update the FreeBSD base system / kernel / userland:

su -
freebsd-update fetch
freebsd-update install
reboot

After reboot, check versions:

freebsd-version -kru

If freebsd-update shows a long file list and a ":" prompt at the bottom, press:

q

Then continue with:

freebsd-update install

Note:
The pkg tool manages third-party software only. The FreeBSD base system and kernel are updated with freebsd-update.


=============================================================================
2. Xorg, XFCE, and keyboard layout
=============================================================================

Start XFCE through startx:

startx

User ~/.xinitrc example:

setxkbmap hu
exec startxfce4

Edit it as the regular user:

ee ~/.xinitrc

Temporary keyboard layout change under X:

setxkbmap hu

Optional system-wide X keyboard configuration:

su -
mkdir -p /usr/local/etc/X11/xorg.conf.d
ee /usr/local/etc/X11/xorg.conf.d/00-keyboard.conf

File content:

Section "InputClass"
Identifier "Keyboard Defaults"
MatchIsKeyboard "on"
Option "XkbLayout" "hu"
EndSection

The command below only disables the X11 bell/beep and is optional:

xset b off


=============================================================================
3. Graphics / DRM kernel modules
=============================================================================

Identify the GPU:

pciconf -lv | grep -B3 -A5 -Ei "display|vga|3d|amd|radeon|nvidia|intel"

Add the user to the video group:

su -
pw groupmod video -m <username>

Then log out and back in, or reboot.

Check group membership:

id


-------------------------------------------------------------------------------
3/A. Intel graphics on MacBook Air
-------------------------------------------------------------------------------

Install:

su -
pkg install drm-kmod

Load the module:

kldload i915kms

Load it automatically at boot:

sysrc kld_list+=i915kms

Check:

kldstat | grep i915


-------------------------------------------------------------------------------
3/B. AMD Radeon Baffin / Polaris11 graphics on desktop Mac
-------------------------------------------------------------------------------

Observed GPU family:
Baffin [Radeon RX 460/560 / Pro 450/455/460/555/555X/560/560X]

This needs amdgpu, not radeonkms.

Install:

su -
pkg install drm-kmod xf86-video-amdgpu
pkg install gpu-firmware-amd-kmod-polaris11

Load the module:

kldload amdgpu

Load it automatically at boot:

sysrc kld_list+=amdgpu

Check:

kldstat | grep -E "amdgpu|drm"
ls /dev/dri

Expected devices:

/dev/dri/card0
/dev/dri/renderD128

If Xorg still fails with an scfb/framebuffer error, create a manual BusID configuration:

su -
mkdir -p /usr/local/etc/X11/xorg.conf.d
ee /usr/local/etc/X11/xorg.conf.d/20-amdgpu.conf

File content:

Section "Device"
Identifier "AMD Radeon"
Driver "amdgpu"
BusID "PCI:1:0:0"
EndSection


=============================================================================
4. Display brightness
=============================================================================

Check available backlight devices:

ls /dev/backlight/

Typical devices:

/dev/backlight/backlight0
/dev/backlight/intel_backlight0

Show current brightness:

backlight

Set brightness:

su -
backlight 50
backlight incr 10
backlight decr 10

If multiple devices exist:

backlight -f /dev/backlight/intel_backlight0 50
backlight -f /dev/backlight/backlight0 50

Examples for XFCE keyboard shortcuts:

sudo /usr/sbin/backlight incr 10
sudo /usr/sbin/backlight decr 10

To run these as a regular user without a password, allow the required command through sudoers.


=============================================================================
5. Keyboard backlight / Apple SMC
=============================================================================

Apple SMC module:

su -
kldload asmc

Load it automatically at boot:

sysrc kld_list+=asmc

Check light-related sysctl variables:

sysctl -a | grep -i light

Important variable:

dev.asmc.0.light.control

Set keyboard backlight as root:

sysctl dev.asmc.0.light.control=0
sysctl dev.asmc.0.light.control=128
sysctl dev.asmc.0.light.control=255

Note:
dev.asmc.0.light.left and dev.asmc.0.light.right may be read-only sensor values.
If they return a "read only" error, that is expected. The control variable is light.control.

Optional default value in /etc/sysctl.conf:

dev.asmc.0.light.control=128

Edit:

su -
ee /etc/sysctl.conf


=============================================================================
6. Passwordless sudo for selected commands
=============================================================================

Install sudo:

su -
pkg install sudo

Edit sudoers safely:

su -
visudo

Useful vi commands inside visudo:

G go to end of file
o open a new line below
Esc leave insert mode
:wq save and quit
:q! quit without saving
dd delete current line
u undo

Example: allow only the needed brightness commands, not full root access:

<username> ALL=(root) NOPASSWD: /usr/sbin/backlight, /sbin/sysctl dev.asmc.0.light.control=0, /sbin/sysctl dev.asmc.0.light.control=64, /sbin/sysctl dev.asmc.0.light.control=128, /sbin/sysctl dev.asmc.0.light.control=192, /sbin/sysctl dev.asmc.0.light.control=255

Do not use this unless you explicitly want full passwordless root access:

<username> ALL=(root) NOPASSWD: ALL


=============================================================================
7. Audio
=============================================================================

Check audio devices:

cat /dev/sndstat
mixer

On the tested MacBook Air 13-inch system:

pcm0: Intel Broadwell HDMI/DP audio
pcm1: Cirrus Logic CS4208 Analog
pcm2: Cirrus Logic CS4208 Analog Headphones

Set default output:

su -
sysctl hw.snd.default_unit=1 # internal analog
sysctl hw.snd.default_unit=2 # headphones

Mixer controls:

mixer -f /dev/mixer1
mixer -f /dev/mixer2

Internal speaker volume:

mixer -f /dev/mixer1 vol=80
mixer -f /dev/mixer1 pcm=80

Headphone volume:

mixer -f /dev/mixer2 vol=80
mixer -f /dev/mixer2 pcm=80

Incremental volume commands for XFCE shortcuts:

/usr/sbin/mixer -f /dev/mixer1 vol=+5%
/usr/sbin/mixer -f /dev/mixer1 vol=-5%
/usr/sbin/mixer -f /dev/mixer1 vol.mute=toggle

For headphones, use mixer2:

/usr/sbin/mixer -f /dev/mixer2 vol=+5%
/usr/sbin/mixer -f /dev/mixer2 vol=-5%

Cirrus Logic / MacBook speaker workaround:
If the headphone jack works but the internal speaker does not, this helped on the tested system:

su -
sysctl dev.hdaa.1.gpio_config=0=set

Noise test:

dd if=/dev/urandom of=/dev/dsp1 bs=4096 count=50

If it works, add this to /etc/sysctl.conf:

dev.hdaa.1.gpio_config=0=set

hdac0 timeout messages likely came from Intel HDMI/DP audio, not from the Cirrus internal analog audio. If internal sound and headphones work, it may be only noisy logging.


=============================================================================
8. USB Wi-Fi adapter
=============================================================================

Known working adapter:

TP-Link TL-WN725N
Realtek RTL8188EU
FreeBSD driver: rtwn_usb / rtwn
Interface: rtwn0 -> wlan0

Typical /etc/rc.conf configuration:

wlans_rtwn0="wlan0"
ifconfig_wlan0="WPA DHCP"

Multiple Wi-Fi networks in /etc/wpa_supplicant.conf:

su -
ee /etc/wpa_supplicant.conf

Example:

network={
ssid="HomeWifi"
psk="password"
priority=10
}

network={
ssid="PhoneHotspot"
psk="password"
priority=5
}

Restart Wi-Fi:

su -
service netif restart wlan0

If it does not get an IP address:

dhclient wlan0

Speed test:

speedtest-cli --simple

Measured results in this setup:

TP-Link TL-WN725N: about 12 Mbit/s download, 4-5 Mbit/s upload
Android USB tethering: about 200 Mbit/s download, 35 Mbit/s upload
Thunderbolt/Ethernet: about 764 Mbit/s download, 41 Mbit/s upload

Before unplugging the USB Wi-Fi adapter, stop it first. Live removal caused a freeze/panic once:

su -
service netif stop wlan0
ifconfig wlan0 down
sync

Then unplug it.

After plugging it back in:

service netif restart wlan0
dhclient wlan0


=============================================================================
9. Android USB tethering
=============================================================================

Android USB tethering on FreeBSD:

1. Connect the phone with a USB cable.
2. Enable USB tethering / USB internet sharing on Android.
3. Load the RNDIS driver on FreeBSD:

su -
kldload if_urndis

4. Check the interface:

ifconfig

Usually it appears as:

ue0

5. Bring it up and request an IP address:

ifconfig ue0 up
dhclient ue0

6. Test:

ping -c 3 freebsd.org
speedtest-cli --simple

To load the driver automatically at boot, add this to /boot/loader.conf:

if_urndis_load="YES"

Edit:

su -
ee /boot/loader.conf

Note:
It is fine to load if_urndis permanently. It is a small driver and only creates an interface when an Android USB tethering device is attached.


=============================================================================
10. Wired Ethernet with Apple Thunderbolt adapter
=============================================================================

The tested adapter looked like an Apple Thunderbolt to Gigabit Ethernet adapter.
Expected FreeBSD interface:

bge0

Check:

dmesg | tail -50
ifconfig

Manual setup:

su -
ifconfig bge0 up
dhclient bge0

Test:

ping -c 3 freebsd.org
speedtest-cli

Persistent /etc/rc.conf setting:

sysrc ifconfig_bge0="DHCP"

If multiple network connections are active, check the default route:

netstat -rn | grep default

Stop Wi-Fi if wired Ethernet should be used:

service netif stop wlan0

Switch back to Wi-Fi:

service netif stop bge0
service netif start wlan0


=============================================================================
11. Multiple network interfaces in rc.conf
=============================================================================

It is possible to configure all three:

wlans_rtwn0="wlan0"
ifconfig_wlan0="WPA DHCP"

ifconfig_ue0="DHCP"
ifconfig_bge0="DHCP"

However, if several are active at once, the default route may not be the one you expect.

Practical use:

wlan0 = default everyday network
ue0 = Android USB tethering when fast mobile internet is needed
bge0 = wired Ethernet when a cable is available


=============================================================================
12. Suspend / lid close sleep
=============================================================================

Manual suspend test:

su -
acpiconf -s 3

If it works, enable sleep on lid close:

su -
ee /etc/sysctl.conf

Add:

hw.acpi.lid_switch_state=S3

Apply immediately without reboot:

sysctl hw.acpi.lid_switch_state=S3

Disable lid-close sleep:

sysctl hw.acpi.lid_switch_state=NONE

Note:
There was one kernel panic during the first suspend test. The log suggested a USB Wi-Fi / networking race around detach/resume. Later lid-close suspend/resume worked correctly.


=============================================================================
13. Battery / charger
=============================================================================

Battery information:

acpiconf -i 0

Relevant lines only:

acpiconf -i 0 | grep -E "State|Remaining capacity|Remaining time|Present rate"

AC adapter state:

acpiconf -a

or:

sysctl hw.acpi.acline

Meaning:

1 = on AC power
0 = on battery

Battery states:

charging charging
discharging discharging
high battery is OK / not low or critical; not necessarily an error
low low battery
critical critical battery

Observation:
At one point the MagSafe LED was orange, but FreeBSD showed "discharging". Powered off, the machine charged. In such cases, check acpiconf -a and hw.acpi.acline, and observe whether the percentage increases over 10-15 minutes.


=============================================================================
14. USB flash drive / external SSD / external HDD mounting
=============================================================================

Find the device:

dmesg | tail
ls /dev/da*
gpart show

Detect filesystem:

fstyp /dev/da1
fstyp /dev/da1s1
fstyp /dev/da1p1

It is fine if some commands fail. Use the device node that actually reports a filesystem.

MBR partitions:

/dev/da1s1

GPT partitions:

/dev/da1p1

No partition table / whole-disk filesystem:

/dev/da1


-------------------------------------------------------------------------------
14/A. FAT / FAT32
-------------------------------------------------------------------------------

If fstyp reports:

msdosfs

Mount:

su -
mkdir -p /mnt/usb
mount -t msdosfs /dev/da1s1 /mnt/usb

For easier regular-user access:

mount_msdosfs -u <username> -g <username> /dev/da1s1 /mnt/usb


-------------------------------------------------------------------------------
14/B. exFAT
-------------------------------------------------------------------------------

Install:

su -
pkg install fusefs-exfat
kldload fusefs

Mount:

mkdir -p /mnt/usb
mount.exfat /dev/da1s1 /mnt/usb

If it says "exFAT file system is not found", the device is probably not exFAT or the wrong device node was used. Check:

fstyp /dev/da1
fstyp /dev/da1s1
fstyp /dev/da1s2


-------------------------------------------------------------------------------
14/C. NTFS
-------------------------------------------------------------------------------

Install:

su -
pkg install fusefs-ntfs
kldload fusefs

Mount:

mkdir -p /mnt/usb
ntfs-3g /dev/da1s1 /mnt/usb

Read-only mount if Windows did not cleanly detach it:

ntfs-3g -o ro /dev/da1s1 /mnt/usb


-------------------------------------------------------------------------------
14/D. UFS
-------------------------------------------------------------------------------

mount /dev/da1p1 /mnt/ssd


-------------------------------------------------------------------------------
14/E. ZFS
-------------------------------------------------------------------------------

zpool import

If the pool is named backup:

zpool import backup

Detach/export:

zpool export backup


-------------------------------------------------------------------------------
14/F. Unmounting
-------------------------------------------------------------------------------

sync
umount /mnt/usb

If it says "Device busy":

1. Close the Thunar/file-manager window that is showing /mnt/usb.
2. Make sure the terminal is not inside the mount point:

cd ~

3. Check what is using it:

fstat | grep /mnt/usb

4. Then retry:

umount /mnt/usb


=============================================================================
15. Thunar / graphical ZIP extraction
=============================================================================

If Thunar says:

Failed to extract files. No suitable archive manager found.

Then unzip is not the problem. A graphical archive manager is missing.

Install:

su -
pkg install thunar-archive-plugin xarchiver

Restart Thunar:

pkill thunar
thunar &

or log out and back in.

ZIP from terminal:

unzip file.zip


=============================================================================
16. Screenshots with a keyboard shortcut in XFCE
=============================================================================

Install:

su -
pkg install xfce4-screenshooter

XFCE path:

Settings -> Keyboard -> Application Shortcuts

Commands:

Full screen:

xfce4-screenshooter -f

Active window:

xfce4-screenshooter -w

Selected region:

xfce4-screenshooter -r

Suggested shortcuts:

Print Screen -> xfce4-screenshooter -f
Alt + Print Screen -> xfce4-screenshooter -w
Shift + Print Screen -> xfce4-screenshooter -r


=============================================================================
17. Window switching in XFCE
=============================================================================

Default:

Alt + Tab

Useful panel items:

Window Buttons
Window Menu

Panel right click:

Panel -> Add New Items...

XFCE does not include a macOS-style Mission Control / Expose overview by default.


=============================================================================
18. Bluetooth / webcam / Spotify
=============================================================================

Bluetooth hardware was visible as:

ubt0: Apple Inc. Bluetooth USB Host Controller

However, Bluetooth headphones require more than pairing: A2DP audio support is also needed. This was not worth the effort for this setup; wired headphones were the practical solution.

Bluetooth command tried:

service bluetooth start ubt0

Observed error:

Unable to setup Bluetooth stack for device ubt0

The blued package was not available from pkg in this setup.

Webcam:
The FaceTime Camera was visible on USB, but FreeBSD support was not straightforward. It was not pursued.

Spotify:
The Spotify web player opened, but playback/audio was not reliable. It was abandoned.

Local audio players:

pkg install audacious
pkg install vlc


=============================================================================
19. Internet speed test
=============================================================================

Install:

su -
pkg install py311-speedtest-cli

Run:

speedtest-cli
speedtest-cli --simple

Example measurements:

TL-WN725N USB Wi-Fi: 12.18 Mbit/s down, 4.71 Mbit/s up
Android USB tethering: 200.14 Mbit/s down, 34.99 Mbit/s up
Thunderbolt Ethernet: 764.36 Mbit/s down, 41.05 Mbit/s up


=============================================================================
20. Useful diagnostic commands
=============================================================================

System / boot log:

dmesg | tail
dmesg | grep -i ac
dmesg | grep -i battery
dmesg | grep -i ubt

PCI devices:

pciconf -lv
pciconf -lv | grep -B3 -A5 -Ei "display|vga|network|wireless|broadcom|amd|radeon|intel"

USB devices:

usbconfig
usbconfig | grep -i bluetooth
usbconfig | grep -i -E "realtek|wireless|wifi|802.11"

Network:

ifconfig
netstat -rn | grep default
sysctl net.wlan.devices

Audio:

cat /dev/sndstat
mixer
mixer -f /dev/mixer1
mixer -f /dev/mixer2

Graphics:

kldstat | grep -E "i915|amdgpu|drm"
ls /dev/dri

Battery:

acpiconf -i 0
acpiconf -a
sysctl hw.acpi.acline

Display brightness:

backlight
ls /dev/backlight/

Keyboard backlight:

sysctl -a | grep -i light


=============================================================================
21. General notes
=============================================================================

FreeBSD desktop setup has improved a lot, but it is still more manual than a typical Linux desktop distribution.

Best practical compromise on the older MacBook Air:

- XFCE
- Intel DRM / i915kms
- USB Wi-Fi left plugged in
- Android USB tethering or Thunderbolt Ethernet for fast networking
- wired headphones
- working suspend on lid close
- manual but functional display brightness and keyboard backlight

Problematic or not worth pursuing:

- built-in Broadcom Wi-Fi
- Bluetooth headphones
- FaceTime webcam
- Spotify web playback on FreeBSD
 
Back
Top