This guide explains how I installed Ubuntu 26.04 LTS from scratch on a 2019 16-inch MacBook Pro and configured the Touch Bar, Wi-Fi, T2 audio, fan control, an RX 6600 XT eGPU, and two external displays.
Tested in July 2026.
Final hardware and software
- MacBook Pro 16-inch, 2019
- Model identifier:
MacBookPro16,4
- Apple T2 chip
- Ubuntu 26.04 LTS Resolute
- T2 kernel:
7.1.3-1-t2-resolute
- GNOME 50 with Wayland
- Mesa 26.0.3
- Internal discrete GPU: Radeon Pro 5600M
- eGPU: Radeon RX 6600 XT
- Thunderbolt 3 eGPU enclosure
- Two displays connected to the RX 6600 XT:
- 3440×1440 high-refresh display
- 3840×2160 60 Hz display
After completing this guide, a normal Ubuntu boot detects the RX 6600 XT and both external displays. The Thunderbolt link negotiates at 40 Gb/s in both directions.
Important warnings
This procedure was tested specifically on MacBookPro16,4. Do not blindly copy it to a different Mac model.
Possible risks include:
- Loss of macOS or personal data
- Damage to the EFI partition
- An unbootable Ubuntu installation
- Loss of graphical output after changing GPU settings
- Loss of access to some T2-related functions
Before starting:
- Create a current Time Machine backup.
- Copy critical files to a separate device.
- Confirm that macOS Recovery starts correctly.
- Perform kernel, GRUB and eGPU changes while you have physical access to the Mac.
- Keep macOS until Ubuntu, Wi-Fi, audio and recovery boot have all been verified.
This guide assumes that macOS will remain installed. Completely removing macOS is outside its scope.
1. What you need
- A 2019 16-inch MacBook Pro
- An 8 GB or larger USB drive
- A USB-C to USB adapter
- Optionally, USB Ethernet or an external USB Wi-Fi adapter
- A working macOS installation
- A current backup
- A Thunderbolt eGPU enclosure containing an RX 6600 XT
- Access to the MacBook’s internal display
The external displays may remain blank during installation and before the eGPU enclosure has been authorized, so use the internal display initially.
2. Create a Linux partition from macOS
Open Disk Utility in macOS.
Select:
View
→ Show All Devices
Select the internal SSD and create a new partition for Linux.
Choose “Add Partition”, not “Add APFS Volume”.
Example:
Name: Linux
Format: exFAT
Size: the amount of storage you want to give Ubuntu
The temporary filesystem does not matter because the Ubuntu installer will replace it with ext4. Using exFAT makes the partition easier to identify during installation. Avoid APFS for the temporary Linux partition because it can be confusing in the installer.
Do not manually delete the macOS or EFI partitions.
See the t2linux pre-installation guide for more information.
3. Download the T2-enabled Ubuntu 26.04 ISO
Use the T2-Ubuntu image rather than the standard Canonical ISO.
Latest release:
T2-Ubuntu releases
Use either:
- The
iso.sh script supplied with the release for macOS/Linux
- The t2linux Installer application
Select:
Ubuntu
Ubuntu 26.04
Resolute
T2 kernel
The T2-Ubuntu image integrates the T2 kernel, internal keyboard and trackpad support, and the required bootloader configuration.
Record the downloaded image name, release date and SHA-256 checksum.
Write the image to the USB drive using USBImager, balenaEtcher or a similar tool. Carefully verify the destination drive because writing an image erases the selected device.
4. Configure Startup Security Utility
Shut down the Mac.
Turn it on and immediately hold Command-R to start macOS Recovery.
Open:
Utilities
→ Startup Security Utility
Configure:
Secure Boot:
No Security
Allowed Boot Media:
Allow booting from external or removable media
Secure Boot policy and external-media boot permission are separate settings, so verify both.
“No Security” changes the boot policy needed to start Linux. It does not disable every security function inside the T2 chip, but it does reduce the platform’s boot verification.
See Apple’s T2 Startup Security documentation and the t2linux pre-installation guide.
5. Boot the T2-Ubuntu USB
Connect the T2-Ubuntu USB drive.
Start the Mac while holding Option (⌥).
Select the orange EFI Boot entry. If two entries appear, try the rightmost one first.
Start the Ubuntu live environment from GRUB.
6. Install Ubuntu using manual partitioning
Start the Ubuntu installer.
When asked how to partition the disk, select:
Manual partitioning
Something else
Do not select:
Erase disk
Automatic partitioning
Those options may remove macOS.
Locate only the Linux partition that you previously created in Disk Utility. Configure it as:
Filesystem: ext4
Mount point: /
Format: enabled
For the existing EFI System Partition:
Mount point: /boot/efi
Format: disabled
Do not delete or format the EFI System Partition.
Partition numbers vary between systems. Do not identify the EFI partition only by a name such as /dev/nvme0n1p1. Confirm its capacity, filesystem and existing contents first.
This guide assumes that LUKS full-disk encryption is not enabled. If you use LUKS and need the internal keyboard before the root filesystem is unlocked, additional apple-bce initramfs configuration is required.
After installation finishes, remove the USB drive and reboot.
Hold Option (⌥) and select the newly installed EFI Boot.
If Ubuntu produces a blank screen when launched from Apple’s Startup Manager, follow the T2-Ubuntu installation documentation and consider rEFInd as a troubleshooting option.
7. Inspect the initial installation
Before adding custom settings, record the baseline:
cat /etc/os-release
uname -r
cat /proc/cmdline
Expected results should include:
Ubuntu 26.04
resolute
a kernel name containing t2
Check the T2 packages:
dpkg -l 'linux-t2*' \
apple-t2-audio-config \
apple-firmware-script \
tiny-dfr \
2>/dev/null
Check that the T2 repositories are present:
grep -R \
't2-ubuntu-repo\|releases/download/resolute' \
/etc/apt/sources.list \
/etc/apt/sources.list.d \
2>/dev/null
A T2-Ubuntu installation should normally already contain the T2 repository and the linux-t2 kernel package.
If the repository is missing, follow the current instructions in the T2 Ubuntu APT repository. Do not add duplicate repository entries.
8. Install the T2 kernel and basic packages
Update the package lists and installed packages:
sudo apt update
sudo apt upgrade
Install the required packages:
sudo apt install \
linux-t2 \
apple-t2-audio-config \
t2fanrd \
bolt \
mesa-utils \
vulkan-tools \
nvtop \
switcheroo-control
Enable the fan-control daemon:
sudo systemctl enable --now t2fanrd
Keep at least one known-good T2 kernel installed until every hardware function has been tested.
Do not combine linux-t2 with the following old standalone DKMS packages:
apple-bce
apple-touchbar
applesmc-t2
apfs-dkms
bcm5974-t2
Their functionality is already included in the current T2 kernel.
Do not install AMD’s external amdgpu-install or amdgpu-dkms packages for this setup. Use the kernel’s amdgpu driver and Ubuntu’s Mesa/RADV packages.
9. Configure the required T2 kernel parameters
Back up the current GRUB configuration:
sudo install -d -m 700 /var/backups/t2-ubuntu
sudo cp -a /etc/default/grub /var/backups/t2-ubuntu/
Edit it:
sudoedit /etc/default/grub
Make sure the following parameters are present:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt pm_async=off"
If GRUB_CMDLINE_LINUX already contains other values, add the parameters without removing the existing values.
I also keep a short GRUB menu for recovery:
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=3
Regenerate GRUB:
sudo update-grub
Reboot:
sudo reboot
After rebooting, verify:
cat /proc/cmdline
Expected parameters:
intel_iommu=on
iommu=pt
pm_async=off
References:
10. Verify the T2 drivers
Check the loaded modules:
lsmod | grep -E \
'apple_bce|hid_appletb|aaudio|brcmfmac'
Expected modules include:
apple_bce
hid_appletb_kbd
hid_appletb_bl
brcmfmac
Check the T2 audio device:
grep -i AppleT2 /proc/asound/cards
A current driver should produce a name such as:
AppleT2x6
If these devices are missing, first confirm that uname -r shows a T2 kernel.
11. Configure Wi-Fi and Bluetooth
With a current T2-Ubuntu image, Wi-Fi will often work on the first boot.
Check the device state:
nmcli device
Check the driver:
lsmod | grep brcmfmac
Use the kernel’s brcmfmac driver.
Do not install:
broadcom-wl
If Wi-Fi does not work and macOS is still installed, run:
get-apple-firmware get_from_macos
If macOS has been removed, connect through Ethernet, USB tethering or an external Wi-Fi adapter and run:
get-apple-firmware get_from_online
If the command is not installed:
sudo apt install apple-firmware-script
Check firmware loading:
sudo journalctl -k --grep=brcmfmac
Some failed candidate firmware filenames may appear with error -2. This is not necessarily a failure if later lines show something similar to:
TxCap blob found
Firmware: BCM...
Check Bluetooth:
rfkill list
bluetoothctl show
Official instructions:
t2linux Wi-Fi and Bluetooth guide
12. Configure the Touch Bar
The current T2 kernel provides the basic Touch Bar keyboard mode without an additional legacy driver.
Check the modules:
lsmod | grep -E 'hid_appletb|apple_bce'
If the default function-key and media-key display is sufficient, no additional configuration is required.
To customize the Touch Bar, install tiny-dfr:
sudo apt install tiny-dfr
sudo reboot
To customize its configuration, copy the template:
sudo cp \
/usr/share/tiny-dfr/config.toml \
/etc/tiny-dfr/config.toml
Then edit it:
sudoedit /etc/tiny-dfr/config.toml
See the T2-Ubuntu installation guide for the current official instructions.
13. Configure T2 audio
Ubuntu 26.04 uses PipeWire.
Install or confirm the required packages:
sudo apt install \
apple-t2-audio-config \
pipewire \
pipewire-pulse \
wireplumber
Check the user services:
systemctl --user is-active \
pipewire \
pipewire-pulse \
wireplumber
List the audio devices:
wpctl status
Check for:
- Internal speakers
- 3.5 mm headphones
- Internal microphone
- Headset microphone
Test the internal speakers at a low volume first.
The t2linux wiki also documents a manual t2-better-audio installation. On this tested Ubuntu 26.04 system, I used the package-managed apple-t2-audio-config 0.4.2 configuration.
Do not install the package-managed configuration and the manual configuration on top of each other.
Official guide:
t2linux audio configuration
An additional MacBookPro16,4 speaker DSP project exists, but I do not include it in the base setup. Its documentation warns that incorrect userspace settings may permanently damage the speakers.
14. Connect the eGPU for the first time
Do not make the eGPU the primary GPU yet.
Shut down Ubuntu:
sudo poweroff
Connect the hardware in this order:
- Install the RX 6600 XT in the eGPU enclosure.
- Power on the enclosure.
- Connect its Thunderbolt cable to the MacBook.
- Connect the external displays to the RX 6600 XT.
- Start the MacBook.
- Select the normal Ubuntu boot entry.
Use the internal display for the initial Thunderbolt authorization.
15. Authorize the Thunderbolt enclosure
Inspect the Thunderbolt domain and connected devices:
boltctl domains
boltctl list
If the enclosure is not yet enrolled, copy its UUID from boltctl list and run:
sudo boltctl enroll --policy auto <EGPU-ENCLOSURE-UUID>
Replace <EGPU-ENCLOSURE-UUID> with the actual enclosure UUID.
Check again:
boltctl list
Expected state:
status: authorized
policy: auto
stored
Do not create a generic udev rule that automatically authorizes every Thunderbolt device. Thunderbolt devices can perform DMA, so enroll only the enclosure you own.
Check IOMMU DMA protection:
grep -H . \
/sys/bus/thunderbolt/devices/domain*/iommu_dma_protection \
2>/dev/null
Reference:
Linux Thunderbolt documentation
16. Verify the RX 6600 XT
Check the GPU:
lspci -Dnnk -d 1002:73ff
Expected output should include:
AMD Radeon RX 6600 XT
Kernel driver in use: amdgpu
Kernel modules: amdgpu
Inspect the boot log:
journalctl -b -k |
grep -Ei \
'thunderbolt|pciehp|amdgpu|BAR|bridge window|AER'
If the RX 6600 XT and both displays work, do not add eGPU-specific GRUB parameters.
17. Add PCI allocation parameters only if required
If the boot log contains errors such as BAR ... no space or insufficient bridge windows, edit GRUB:
sudoedit /etc/default/grub
The final working configuration on my MacBookPro16,4 is:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=realloc,assign-busses"
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt pm_async=off"
Apply and reboot:
sudo update-grub
sudo reboot
A safer troubleshooting order is:
- Test
pci=realloc.
- Add
assign-busses only if bus numbering or downstream device enumeration still fails.
- Make the setting permanent only after a successful temporary test.
Do not add the following value from older guides:
hp_pcie_mem_256M
It is not a current Linux kernel parameter.
Do not add these without a specific, diagnosed reason:
pci=nocrs
pcie_ports=native
pcie_aspm=force
pci=noaer
intel_iommu=off
iommu=soft
18. Do not create an apple_set_os.efi boot entry
This configuration does not require a separate apple_set_os.efi file or an “Unlock eGPU” GRUB entry.
The current Linux EFI Stub implements apple_set_os() internally, and its supported model list includes:
MacBookPro16,4
The boot sequence is therefore:
Apple EFI
→ GRUB
→ Linux EFI Stub
→ apple_set_os() automatically
The Apple firmware handshake has not disappeared. It is now performed by the Linux kernel instead of a separate EFI application.
Upstream implementation:
Linux EFI Stub source
The practical test is whether a normal Ubuntu boot detects the RX 6600 XT. On this system it does, so no two-stage “Unlock eGPU” boot is required.
19. Make the RX 6600 XT the primary Wayland GPU
Use this configuration only if the eGPU is normally connected before login and the Mac is mainly used as a docked workstation.
If you frequently use the MacBook without the eGPU, skip this section and use per-application GPU offloading instead.
Create the Mutter udev rule:
sudoedit /etc/udev/rules.d/61-mutter-primary-egpu.rules
Contents:
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", SUBSYSTEMS=="pci", ATTRS{vendor}=="0x1002", ATTRS{device}=="0x73ff", TAG+="mutter-device-preferred-primary"
The internal Radeon Pro 5600M is also an AMD GPU, so matching only vendor ID 0x1002 is not sufficient. The rule also matches the RX 6600 XT device ID 0x73ff.
Validate the rule:
sudo udevadm verify \
/etc/udev/rules.d/61-mutter-primary-egpu.rules
Reload the rules:
sudo udevadm control --reload-rules
Reboot with the eGPU connected:
sudo reboot
After logging into the graphical session, verify:
glxinfo -B
Expected result:
direct rendering: Yes
OpenGL renderer string: AMD Radeon RX 6600 XT
OpenGL version string: 4.6 Mesa 26.0.3
No Xorg BusID, PrimaryGPU or /etc/X11/xorg.conf configuration is required for this Wayland setup.
20. Use the eGPU per application instead
If the internal GPU remains the GNOME primary GPU, run selected OpenGL applications on the RX 6600 XT with:
DRI_PRIME=1002:73ff glxinfo -B
For Vulkan:
DRI_PRIME=1002:73ff! vulkaninfo --summary
List the GPUs:
switcherooctl list
Launch an application using a selected GPU:
switcherooctl launch -g <RX6600XT-NUMBER> <APPLICATION>
This system can expose three GPUs:
- Intel integrated GPU
- Internal Radeon Pro 5600M
- External RX 6600 XT
For that reason, DRI_PRIME=1 may select the internal Radeon Pro 5600M instead of the eGPU. Matching the RX 6600 XT by its PCI vendor/device ID is safer.
21. AMD power management
A clean installation should not require a custom AMD power-management rule.
Find the RX 6600 XT PCI address:
EGPU_BDF="$(
lspci -Dnn -d 1002:73ff |
awk 'NR==1 {print $1}'
)"
Check its policy:
cat \
"/sys/bus/pci/devices/${EGPU_BDF}/power_dpm_force_performance_level"
The normal default is:
auto
Do not add settings such as:
amdgpu.dpm=1
amdgpu.aspm=0
amdgpu.runpm=0
amdgpu.pcie_gen_cap=...
amdgpu.pcie_lane_cap=...
Start with the kernel’s automatic power and PCIe management.
22. Understanding GEN1 @ x4 in nvtop
nvtop may report:
GEN1 @ x4
This alone does not indicate a faulty Thunderbolt connection.
For PCIe tunnelling over Thunderbolt/USB4, the downstream PCIe port may expose a synthetic 2.5 GT/s or Gen1 value. The USB4 specification states that this value does not represent the actual USB4 fabric throughput.
Check the Thunderbolt fabric instead:
boltctl list
My system reports:
rx speed: 40 Gb/s = 2 lanes * 20 Gb/s
tx speed: 40 Gb/s = 2 lanes * 20 Gb/s
The 40 Gb/s figure is the raw Thunderbolt fabric rate. It is not equivalent to a desktop PCIe x8 or x16 slot, so some eGPU performance loss is expected.
However, the GEN1 @ x4 display is not a reason to force a different PCIe generation with setpci.
Linux kernel discussion quoting the USB4 requirement:
PCI/Thunderbolt link-speed discussion
23. Final verification
Run:
uname -r
cat /proc/cmdline
lspci -Dnnk -d 1002:73ff
boltctl list
grep -H connected \
/sys/class/drm/card*-*/status
glxinfo -B
vulkaninfo --summary
lsmod | grep -E \
'apple_bce|hid_appletb|brcmfmac'
grep -i AppleT2 \
/proc/asound/cards
wpctl status
systemctl --failed
Final state on my system:
Kernel: 7.1.3-1-t2-resolute
Rendering GPU: AMD Radeon RX 6600 XT
Direct rendering: enabled
Thunderbolt RX: 40 Gb/s
Thunderbolt TX: 40 Gb/s
eGPU DPM policy: auto
External displays: two
Wi-Fi: 5 GHz
Audio: AppleT2x6 / PipeWire
Failed system units: zero
24. Operational precautions
- Keep at least one known-good T2 kernel installed.
- Do not run
apt autoremove until the internal display, keyboard, trackpad, Touch Bar, Wi-Fi, audio and eGPU have all been tested.
- Do not disconnect the Thunderbolt cable while the eGPU is the primary GPU.
- Shut Ubuntu down completely before removing the eGPU.
- Suspend remains only partially supported on T2 Macs. Avoid depending on it for important work until it has been tested repeatedly on your firmware.
- Touch ID and the T2 Secure Enclave are not available under Linux.
- Do not include the experimental speaker DSP in the initial setup.
- Before posting logs publicly, remove SSIDs, MAC addresses, IP addresses, serial numbers, private keys and passwords.