380 Configure custom image

Use case

Use the role vbotka.freebsd.custom_image to configure a custom image.

Tree

shell> tree .
.
├── ansible.cfg
├── group_vars
│   └── all
│       └── vault.yml
├── hosts
├── host_vars
│   └── images.example.com
└── pb.yml

Synopsis

  • Use the playbook pb.yml at images.example.com to customize FreeBSD image:

    • configure wireless adapter RTL8188EU

    • configure wpa_supplicant

    • connect to AP

Requirements

  • root privilege in the managed nodes.

Notes

TBD

Note

vbotka.freebsd.custom_image is the role custom_image in the collection vbotka.freebsd.
vbotka.freebsd_custom_image is the role freebsd_custom_image in the namespace vbotka.
Please make sure the versions are the same before you switch between them.

ansible.cfg

[defaults]
inventory = $PWD/hosts
gathering = explicit
callback_result_format = yaml
display_skipped_hosts = false

[connection]
pipelining = true

Inventory hosts

images.example.com ansible_host=10.1.0.29

[images]
images.example.com

[images:vars]
ansible_user=admin
ansible_become=true
ansible_python_interpreter=auto_silent

host_vars

host_vars/images.example.com
cimage_download: false
cimage_unpack: false

# download
cimage_dir: /export/images/FreeBSD
cimage_download_images:
  - site: https://download.freebsd.org/releases/arm/armv6/ISO-IMAGES/13.5
    image: FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img.xz
    checksum: CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-arm-armv6-RPI-B

# mount
cimage_mount_dir: /export/images/FreeBSD
cimage_mount_file: FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img
cimage_mount_points:
  - partition: s2a
    fstype: ufs
    mountpoint: /mnt3
cimage_mount_path: /mnt3

# rc.conf
cimage_rcconf: true
cimage_rcconf_data:
  - {key: wlans_rtwn0, value: wlan0}
  - {key: ifconfig_wlan0, value: WPA SYNCDHCP}

# wpa_supplicant.conf
cimage_wpasupconf: true
cimage_wpasupconf_template: wpa_supplicant.conf.2.j2 
cimage_wpasupconf_data:
  - dev: wlan0
    network:
      - conf:
          ssid: "{{ my_access_point }}"
          psk: "{{ my_password }}"
          disabled: 0
cimage_wpasupconf_link: true
cimage_wpasupconf_link_dev: wlan0

# postinstall
cimage_postinstall: [loader]

# postinstall loader
fp_loader_tuneables_warning: false
fp_loader_conf_file: "{{ cimage_mount_path }}/boot/loader.conf"
fp_loader_conf_template: ''
loader_states:
  hw.usb.template: '3'
  umodem_load: 'YES'
  boot_multicons: 'YES'
  boot_serial: 'YES'
  beastie_disable: 'YES'
  loader_colo: 'NO'
  legal.realtek.license_ack: '1'
fp_loader_conf: "{{ loader_states | dict2items(key_name='name') }}"
loader_modules: [wlan, wlan_wep, wlan_ccmp, wlan_tkip, wlan_amrr, rtwn, if_rtwn_usb]
fp_loader_conf_modules: "{{ dict(loader_modules | product(['YES'])) | dict2items(key_name='name') }}"

Note

The default values of cimage_download and cimage_unpack are true. Set them to false and enable them when needed.

Hint

Put the variables my_access_point and my_password into an vault file. For example, group_vars/all/vault.yml

Playbook pb.yml

- name: Test role vbotka.freebsd.custom_image
  hosts: images
  gather_facts: true

  roles:
    - vbotka.freebsd.custom_image

Playbook output - Display variables

(env) > ansible-playbook pb.yml -t cimage_debug -e cimage_debug=true
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Debug cimage_debug=true] *******************
ok: [images.example.com] => 
    msg: |-
        cimage_role_version: 2.7.7
        ansible_role_name: vbotka.freebsd.custom_image
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ansible_architecture: amd64
        ansible_os_family: FreeBSD
        ansible_distribution: FreeBSD
        ansible_distribution_major_version: 14
        ansible_distribution_version: 14.3
        ansible_distribution_release: 14.3-RELEASE
        ansible_python_version: 3.11.12
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        cimage_sanity: False
        cimage_sanity_quiet: True
        cimage_download: False
        cimage_unpack: False
        cimage_mount: True
        cimage_install: False
        cimage_umount: True
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        cimage_get_images: True
        cimage_get_checksums: True
        cimage_dir: /export/images/FreeBSD
        cimage_owner: UNDEFINED
        cimage_group: UNDEFINED
        cimage_mode: UNDEFINED
        cimage_mode_dir: UNDEFINED
        cimage_download_images:
          - checksum: CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-arm-armv6-RPI-B
            image: FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img.xz
            site: https://download.freebsd.org/releases/arm/armv6/ISO-IMAGES/13.5

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        cimage_unpack_cmd:
          .xz: unxz --keep

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        cimage_mount_path: /mnt3
        cimage_mount_file: FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img
        cimage_mount_mode: 0755
        cimage_mount_points_create: False
        cimage_mount_points:
          - {fstype: ufs, mountpoint: /mnt3, partition: s2a}

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        freebsd_install_retries: 10
        freebsd_install_delay: 5
        cimage_pkgng_rootdir: /mnt3
        cimage_pkgng_use_globs: False
        cimage_pkgng_chroot: UNDEFINED
        cimage_pkgng_cached: UNDEFINED
        cimage_pkgng_ignore_osver: UNDEFINED
        cimage_pkgng_pkgsite: UNDEFINED
        cimage_packages:
          []

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        cimage_customize:
          []

PLAY RECAP *********************************************************************
images.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Playbook output - Download images

(env) > ansible-playbook pb.yml -t cimage_download -e cimage_download=true
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Download: Create directory /export/images/FreeBSD] ***
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Download: Get checksums] *******************
changed: [images.example.com] => (item=CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-arm-armv6-RPI-B)

TASK [vbotka.freebsd.custom_image : Download: Read checksums] ******************
ok: [images.example.com] => (item=CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-arm-armv6-RPI-B)

TASK [vbotka.freebsd.custom_image : Download: Get images] **********************
changed: [images.example.com] => (item=FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img.xz)

PLAY RECAP *********************************************************************
images.example.com         : ok=5    changed=2    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   

Playbook output - Unpack images

(env) > ansible-playbook pb.yml -t cimage_unpack -e cimage_unpack=true
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Unpack: Unpack images] *********************
changed: [images.example.com] => (item=FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img.xz)

PLAY RECAP *********************************************************************
images.example.com         : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Playbook output - Mount image

(env) > ansible-playbook pb.yml -t cimage_mount
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [Mount: Attach memory disk] ***********************************************
included: vbotka.freebsd.lib for images.example.com

TASK [vbotka.freebsd.lib : Al_mdconfig: Default variables.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: List memory disks.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Create empty memory disks dictionary.] ***
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Attach memory disk.] *******************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Add memory disk to dictionary.] ********
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Mount: Set variable cimage_mount_dev] ******
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Mount: Mount partitions md0] ***************
changed: [images.example.com] => (item={'partition': 's2a', 'fstype': 'ufs', 'mountpoint': '/mnt3'})

PLAY RECAP *********************************************************************
images.example.com         : ok=9    changed=1    unreachable=0    failed=0    skipped=10   rescued=0    ignored=0   

Playbook output - Customize image

(env) > ansible-playbook pb.yml -t cimage_customize
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Customize image.] **************************
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/wpasupconf.yml for images.example.com => (item=wpasupconf)
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/rcconf.yml for images.example.com => (item=rcconf)
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/postinstall.yml for images.example.com => (item=postinstall)

TASK [vbotka.freebsd.custom_image : Wpasupconf: Configure /mnt3/etc/wpasupplicant.conf] ***
ok: [images.example.com] => (item=wlan0)

TASK [vbotka.freebsd.custom_image : Wpasupconf: Link to /etc/wpa_supplicant.conf.wlan0] ***
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Rcconf: Configure /mnt3/etc/rc.conf] *******
ok: [images.example.com] => (item={'key': 'wlans_rtwn0', 'value': 'wlan0'})
ok: [images.example.com] => (item={'key': 'ifconfig_wlan0', 'value': 'WPA SYNCDHCP'})

TASK [Postinstall: Configure.] *************************************************
included: vbotka.freebsd.postinstall for images.example.com => (item=loader)

TASK [vbotka.freebsd.postinstall : Loader: Backup orig /mnt3/boot/loader.conf] ***
ok: [images.example.com]

TASK [vbotka.freebsd.postinstall : Loader: Configure by sysctl /mnt3/boot/loader.conf] ***
changed: [images.example.com] => (item={'name': 'hw.usb.template', 'value': '3'})
ok: [images.example.com] => (item={'name': 'umodem_load', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'boot_multicons', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'boot_serial', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'beastie_disable', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'loader_colo', 'value': 'NO'})
changed: [images.example.com] => (item={'name': 'legal.realtek.license_ack', 'value': '1'})

TASK [vbotka.freebsd.postinstall : Loader: Configure modules by sysctl /mnt3/boot/loader.conf] ***
changed: [images.example.com] => (item={'name': 'wlan', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'wlan_wep', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'wlan_ccmp', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'wlan_tkip', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'wlan_amrr', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'rtwn', 'value': 'YES'})
changed: [images.example.com] => (item={'name': 'if_rtwn_usb', 'value': 'YES'})

RUNNING HANDLER [vbotka.freebsd.postinstall : Loader message reboot] ***********
ok: [images.example.com] => 
    msg: '[MESSAGE] Reboot to activate configuration in /boot/loader.conf'

PLAY RECAP *********************************************************************
images.example.com         : ok=12   changed=2    unreachable=0    failed=0    skipped=9    rescued=0    ignored=0   

Playbook output - Umount image

(env) > ansible-playbook pb.yml -t cimage_umount
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Umount: Unmount] ***************************
changed: [images.example.com] => (item=/mnt3)

TASK [Umount: Detach memory disk] **********************************************
included: vbotka.freebsd.lib for images.example.com

TASK [vbotka.freebsd.lib : Al_mdconfig: Default variables.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: List memory disks.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Create empty memory disks dictionary.] ***
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Parse memory disks.] *******************
ok: [images.example.com] => (item=md0	vnode	 5120M	/export/images/FreeBSD/FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img	)

TASK [vbotka.freebsd.lib : Al_mdconfig: Detach memory disk.] *******************
changed: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Remove memory disk from dictionary.] ***
ok: [images.example.com]

PLAY RECAP *********************************************************************
images.example.com         : ok=9    changed=2    unreachable=0    failed=0    skipped=8    rescued=0    ignored=0   

Playbook output - Mount, customize, and umount image

The play is not idempotent when the image is unmounted. The default is cimage_umount=true. In this case, at least 3 tasks are changed. The image is mounted, unmounted, and the memory disk is detached.

(env) > ansible-playbook pb.yml
PLAY [Test role vbotka.freebsd.custom_image] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [images.example.com]

TASK [Mount: Attach memory disk] ***********************************************
included: vbotka.freebsd.lib for images.example.com

TASK [vbotka.freebsd.lib : Al_mdconfig: Default variables.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: List memory disks.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Create empty memory disks dictionary.] ***
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Attach memory disk.] *******************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Add memory disk to dictionary.] ********
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Mount: Set variable cimage_mount_dev] ******
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Mount: Mount partitions md0] ***************
changed: [images.example.com] => (item={'partition': 's2a', 'fstype': 'ufs', 'mountpoint': '/mnt3'})

TASK [vbotka.freebsd.custom_image : Customize image.] **************************
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/wpasupconf.yml for images.example.com => (item=wpasupconf)
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/rcconf.yml for images.example.com => (item=rcconf)
included: /scratch/collections/ansible_collections/vbotka/freebsd/roles/custom_image/tasks/fn/postinstall.yml for images.example.com => (item=postinstall)

TASK [vbotka.freebsd.custom_image : Wpasupconf: Configure /mnt3/etc/wpasupplicant.conf] ***
ok: [images.example.com] => (item=wlan0)

TASK [vbotka.freebsd.custom_image : Wpasupconf: Link to /etc/wpa_supplicant.conf.wlan0] ***
ok: [images.example.com]

TASK [vbotka.freebsd.custom_image : Rcconf: Configure /mnt3/etc/rc.conf] *******
ok: [images.example.com] => (item={'key': 'wlans_rtwn0', 'value': 'wlan0'})
ok: [images.example.com] => (item={'key': 'ifconfig_wlan0', 'value': 'WPA SYNCDHCP'})

TASK [Postinstall: Configure.] *************************************************
included: vbotka.freebsd.postinstall for images.example.com => (item=loader)

TASK [vbotka.freebsd.postinstall : Loader: Backup orig /mnt3/boot/loader.conf] ***
ok: [images.example.com]

TASK [vbotka.freebsd.postinstall : Loader: Configure by sysctl /mnt3/boot/loader.conf] ***
ok: [images.example.com] => (item={'name': 'hw.usb.template', 'value': '3'})
ok: [images.example.com] => (item={'name': 'umodem_load', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'boot_multicons', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'boot_serial', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'beastie_disable', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'loader_colo', 'value': 'NO'})
ok: [images.example.com] => (item={'name': 'legal.realtek.license_ack', 'value': '1'})

TASK [vbotka.freebsd.postinstall : Loader: Configure modules by sysctl /mnt3/boot/loader.conf] ***
ok: [images.example.com] => (item={'name': 'wlan', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'wlan_wep', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'wlan_ccmp', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'wlan_tkip', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'wlan_amrr', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'rtwn', 'value': 'YES'})
ok: [images.example.com] => (item={'name': 'if_rtwn_usb', 'value': 'YES'})

TASK [vbotka.freebsd.custom_image : Umount: Unmount] ***************************
changed: [images.example.com] => (item=/mnt3)

TASK [Umount: Detach memory disk] **********************************************
included: vbotka.freebsd.lib for images.example.com

TASK [vbotka.freebsd.lib : Al_mdconfig: Default variables.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: List memory disks.] ********************
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Create empty memory disks dictionary.] ***
ok: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Parse memory disks.] *******************
ok: [images.example.com] => (item=md0	vnode	 5120M	/export/images/FreeBSD/FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img	)

TASK [vbotka.freebsd.lib : Al_mdconfig: Detach memory disk.] *******************
changed: [images.example.com]

TASK [vbotka.freebsd.lib : Al_mdconfig: Remove memory disk from dictionary.] ***
ok: [images.example.com]

PLAY RECAP *********************************************************************
images.example.com         : ok=27   changed=3    unreachable=0    failed=0    skipped=43   rescued=0    ignored=0   

Write the image file to USB

shell> dd if=FreeBSD-13.5-RELEASE-arm-armv6-RPI-B.img of=/dev/sdb bs=1M conv=sync status=progress
5348786176 bytes (5.3 GB, 5.0 GiB) copied, 154 s, 34.7 MB/s
5120+0 records in
5120+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 154.648 s, 34.7 MB/s

Note

Linux was used to write the image. In FreeBSD, use bs=1m

Result

MACs are sanitized.

(env) > ssh freebsd@10.1.0.16 dmesg
Copyright (c) 1992-2021 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 13.5-RELEASE releng/13.5-n259162-882b9f3f2218 RPI-B arm
FreeBSD clang version 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2)
WARNING: 32-bit kernels are deprecated and may be removed in FreeBSD 15.0.
VT: init without driver.
CPU: ARM ARM1176 r0p7 (ECO: 0x00000000)
CPU Features: 
  Thumb, Security, VMSAv7
Optional instructions: 
  UMULL, SMULL, MLA, SIMD(ext)
  16KB/32B 4-way instruction cache
  16KB/32B 4-way WB data cache
real memory  = 469757952 (447 MB)
avail memory = 444395520 (423 MB)
arc4random: WARNING: initial seeding bypassed the cryptographic random device because it was not yet seeded and the knob 'bypass_before_seeding' was enabled.
random: entropy device external interface
kbd0 at kbdmux0
ofwbus0: <Open Firmware Device Tree>
simplebus0: <Flattened device tree simple bus> on ofwbus0
ofw_clkbus0: <OFW clocks bus> on ofwbus0
clk_fixed0: <Fixed clock> on ofw_clkbus0
clk_fixed1: <Fixed clock> on ofw_clkbus0
regfix0: <Fixed Regulator> on ofwbus0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
regfix1: <Fixed Regulator> on ofwbus0
regfix2: <Fixed Regulator> on ofwbus0
regfix3: <Fixed Regulator> on ofwbus0
bcm2835_firmware0: <BCM2835 Firmware> on simplebus0
ofw_clkbus1: <OFW clocks bus> on bcm2835_firmware0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
intc0: <BCM2835 Interrupt Controller> mem 0x7e00b200-0x7e00b3ff on simplebus0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
gpio0: <BCM2708/2835 GPIO controller> mem 0x7e200000-0x7e2000b3 irq 6,7 on simplebus0
gpiobus0: <OFW GPIO bus> on gpio0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
mbox0: <BCM2835 VideoCore Mailbox> mem 0x7e00b880-0x7e00b8bf irq 5 on simplebus0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007eff irq 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37 on simplebus0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
systimer0 mem 0x7e003000-0x7e003fff irq 0,1,2,3 on simplebus0
Event timer "BCM2835-3" frequency 1000000 Hz quality 1000
Timecounter "BCM2835-3" frequency 1000000 Hz quality 1000
gpioc0: <GPIO controller> on gpio0
uart0: <PrimeCell UART (PL011)> mem 0x7e201000-0x7e2011ff irq 8 on simplebus0
sdhci_bcm0: <Broadcom 2708 SDHCI controller> mem 0x7e300000-0x7e3000ff irq 16 on simplebus0
mmc0: <MMC/SD bus> on sdhci_bcm0
bcm283x_dwcotg0: <DWC OTG 2.0 integrated USB controller (bcm283x)> mem 0x7e980000-0x7e98ffff,0x7e006000-0x7e006fff irq 20,21 on simplebus0
usbus1 on bcm283x_dwcotg0
bcmwd0: <BCM2708/2835 Watchdog> mem 0x7e100000-0x7e100113,0x7e00a000-0x7e00a023 on simplebus0
vchiq0: <BCM2835 VCHIQ> mem 0x7e00b840-0x7e00b87b irq 52 on simplebus0
vchiq: local ver 8 (min 3), remote ver 8.
pcm0: <VCHIQ audio> on vchiq0
fb0: <BCM2835 VT framebuffer driver> on simplebus0
fb0: keeping existing fb bpp of 32
fbd0 on fb0
WARNING: Device "fb" is Giant locked and may be deleted before FreeBSD 15.0.
VT: initialize with new VT driver "fb".
fb0: 1024x768(1024x768@0,0) 32bpp
fb0: fbswap: 1, pitch 4096, base 0x1e8fa000, screen_size 3145728
cpulist0: <Open Firmware CPU Group> on ofwbus0
cpu0: <Open Firmware CPU> on cpulist0
bcm2835_cpufreq0: <CPU Frequency Control> on cpu0
cpufreq0: <CPU frequency control> on cpu0
clk_fixed2: clock-fixed has no clock-frequency
clk_fixed2: clock-fixed has no clock-frequency
gpioled0: <GPIO LEDs> on ofwbus0
Timecounters tick every 1.000 msec
usbus1: 480Mbps High Speed USB v2.0
ugen1.1: <DWCOTG OTG Root HUB> at usbus1
uhub0 on usbus1
uhub0: <DWCOTG OTG Root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
mmcsd0: 32GB <SDHC JB1Q5 3.0 SN F97167D8 MFG 05/2024 by 27 SM> at mmc0 50.0MHz/4bit/65535-block
bcm2835_cpufreq0: ARM 700MHz, Core 400MHz, SDRAM 400MHz, Turbo OFF
WARNING: 32-bit kernels are deprecated and may be removed in FreeBSD 15.0.
Trying to mount root from ufs:/dev/ufs/rootfs [rw]...
Warning: no time-of-day clock registered, system time will not be set accurately
Dual Console: Serial Primary, Video Secondary
uhub0: 1 port with 1 removable, self powered
ugen1.2: <Realtek 802.11n NIC> at usbus1
rtwn0 on uhub0
rtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 2> on usbus1
rtwn0: MAC/BB RTL8188EU, RF 6052 1T1R
random: unblocking device.
GEOM_PART: mmcsd0s2 was automatically resized.
  Use `gpart commit mmcsd0s2` to save changes or `gpart undo mmcsd0s2` to revert them.
wlan0: Ethernet address: 11:22:33:44:55:66
lo0: link state changed to UP
wlan0: link state changed to UP
warning: total configured swap (218111 pages) exceeds maximum recommended amount (217952 pages).
warning: increase kern.maxswzone or reduce amount of swap.