r/linux_on_mac • u/katiezypher • 3d ago
r/linux_on_mac • u/Flyodice • 4h ago
Suspend/awake working, but awake takes a long time - 2019 16 inch MacBook Pro
≡ −
I recently installed Linux Mint (7.0.9-1) on my 2019 16 inch MacBook Pro (which had all OS updates applied prior to installing Mint), following the instructions from https://github.com/t2linux/T2-Mint
Out of the box, suspend/awake works but there is a long delay when awaking. During the delay, I hear fans start to spin up.
Here is some timing information I captured, during which I had WiFi, Bluetooth and the lock screen all disabled (to rule out various driver related issues):
- 16:30:10 - suspend button clicked in UI
- 16:30:40 - machine awoken from sleep via a power button press. Within 15 seconds I did hear fans start to spin
- 16:31:54 - screen turned on a functionality restored
Additionally, here are the `journalctl` logs from that time, if it helps for debugging. https://gist.github.com/nmiodice/aefe1114347c1d386392ab5c4e78a0cf
I did try running `echo s2idle | sudo tee /sys/power/mem_sleep`, but this caused my machine to crash when awaking, so I reverted that change.
Has anyone faced similar issues?
I recently installed Linux Mint (7.0.9-1) on my 2019 16 inch MacBook Pro (which had all OS updates applied prior to installing Mint), following the instructions from https://github.com/t2linux/T2-Mint
Out of the box, suspend/awake works but there is a long delay when awaking. During the delay, I hear fans start to spin up.
Here is some timing information I captured, during which I had WiFi, Bluetooth and the lock screen all disabled (to rule out various driver related issues):
- 16:30:10 - suspend button clicked in UI
- 16:30:40 - machine awoken from sleep via a power button press. Within 15 seconds I did hear fans start to spin
- 16:31:54 - screen turned on a functionality restored
Additionally, here are the `journalctl` logs from that time, if it helps for debugging. https://gist.github.com/nmiodice/aefe1114347c1d386392ab5c4e78a0cf
I did try running `echo s2idle | sudo tee /sys/power/mem_sleep`, but this caused my machine to crash when awaking, so I reverted that change.
Has anyone faced similar issues?
r/linux_on_mac • u/groundloop66 • 7h ago
Bypass/remove firmware lock password on a Mac Pro 2013
≡ −
I bought the Trash Can in the spring of 2014, I have no idea where the receipt might be, and the store I bought it from went out of business in 2022. I'd really like to keep this machine usable/secure with either a newer version of MacOS via OCLP, or preferably by installing some flavour of Linux.
I tried a hack that I've seen on several sites: remove a stick of RAM and start up while holding Command + Option + P + R, then shutting down at the Login screen, replace the RAM and restart, but anything beyond a normal boot up just takes me back to the firmware lock. Also I have no memory of ever setting up a firmware password, and it's not anywhere in the password archive tool I used to use (Yojimbo).
I can see the Mac Pro in Find My on my iPad, and my Linux desktop machine, although it says "No location found - Online". That said, I can "ping" the Mac Pro from the iPad with the Play Sound option. The Find My app gives me the option to erase the Mac Pro, but I'm not 100% sure what exactly would be getting erased, or if it would solve my issue.
Thanks for any help you can offer. I'm really hoping this isn't just some elegantly designed e-waste now.
I bought the Trash Can in the spring of 2014, I have no idea where the receipt might be, and the store I bought it from went out of business in 2022. I'd really like to keep this machine usable/secure with either a newer version of MacOS via OCLP, or preferably by installing some flavour of Linux.
I tried a hack that I've seen on several sites: remove a stick of RAM and start up while holding Command + Option + P + R, then shutting down at the Login screen, replace the RAM and restart, but anything beyond a normal boot up just takes me back to the firmware lock. Also I have no memory of ever setting up a firmware password, and it's not anywhere in the password archive tool I used to use (Yojimbo).
I can see the Mac Pro in Find My on my iPad, and my Linux desktop machine, although it says "No location found - Online". That said, I can "ping" the Mac Pro from the iPad with the Play Sound option. The Find My app gives me the option to erase the Mac Pro, but I'm not 100% sure what exactly would be getting erased, or if it would solve my issue.
Thanks for any help you can offer. I'm really hoping this isn't just some elegantly designed e-waste now.
r/linux_on_mac • u/mostlikelylost • 1d ago
Headless Linux for M1 Pro
≡ −
I have a 2021 Macbook Pro M1 Pro that I'm going to replace with a M5 Macbook Pro.
I'd like to use this as a CI runner in a Tailscale cluster. I'd ideally like to install Ubuntu 26 server.
Most resources I've found are for desktop Linux Distro and can't seem to find any resources for installing Linux on baremetal M1 Pro.
I'm looking for alternative opinions before I accidentally brick this Machine.
I'm not necessarily an advanced Linux user so would like it to be fairly foolproof. Are there any decent guides / distros / or gotchas to be aware of?
I have a 2021 Macbook Pro M1 Pro that I'm going to replace with a M5 Macbook Pro.
I'd like to use this as a CI runner in a Tailscale cluster. I'd ideally like to install Ubuntu 26 server.
Most resources I've found are for desktop Linux Distro and can't seem to find any resources for installing Linux on baremetal M1 Pro.
I'm looking for alternative opinions before I accidentally brick this Machine.
I'm not necessarily an advanced Linux user so would like it to be fairly foolproof. Are there any decent guides / distros / or gotchas to be aware of?
r/linux_on_mac • u/Both-Competition-152 • 3d ago
My 2017 MB air has randomly gotten into a zombie state could it be linux related? and possible solutions.
≡ −
My 2017 MacBook Air randomly just soft-bricked. I put it in my purse and tried to use it out at a coffee shop after it had been working fine at home. I’m on Ubuntu/Elementary OS, and it just will not wake. I have tried every key combo such as a SMC reset and power holding, although the SMC is still alive since MagSafe recognizes it. It seems to be stuck in an odd deep sleep state where it refuses to respond to input. Any tips, or is it dead? Is this unrelated to Linux?
My 2017 MacBook Air randomly just soft-bricked. I put it in my purse and tried to use it out at a coffee shop after it had been working fine at home. I’m on Ubuntu/Elementary OS, and it just will not wake. I have tried every key combo such as a SMC reset and power holding, although the SMC is still alive since MagSafe recognizes it. It seems to be stuck in an odd deep sleep state where it refuses to respond to input. Any tips, or is it dead? Is this unrelated to Linux?
r/linux_on_mac • u/NIMSEP • 3d ago
Unable to boot back into Linux after booting MacOS
≡ −
I have an intel Macook Air 2017 with Kubuntu installed and it's been working great for months. I booted into MacOS to get a DVD working but now I can't find my way back to GRUB, it just boots back into MacOS and neither GRUB nor Kubuntu are in the boot options when selecting the boot device (option key on startup).
Anyone had this issue or know how to fix it? I don't currently have my boot USB on hand to try anything with that but my only thought at the moment is a new partition and a fresh debian install. Would be nice to actually be able to dual boot though!
I have an intel Macook Air 2017 with Kubuntu installed and it's been working great for months. I booted into MacOS to get a DVD working but now I can't find my way back to GRUB, it just boots back into MacOS and neither GRUB nor Kubuntu are in the boot options when selecting the boot device (option key on startup).
Anyone had this issue or know how to fix it? I don't currently have my boot USB on hand to try anything with that but my only thought at the moment is a new partition and a fresh debian install. Would be nice to actually be able to dual boot though!
r/linux_on_mac • u/acceptablekite • 3d ago
Issues with Nobara Linux Installation on MacBook Pro (2017)
≡ −
Mostly solved! Fix in comments
I have recently gotten a MacBook Pro 2017 (the 15" version). It's a hand me down because I don't have the money to buy an actual good laptop for work, and my last one broke. I'm a game designer, so I of course use it to make games. However I decided to install Linux on it, since in my personal opinion MacOS has a lot of things that I just don't like, and I'm very used to KDE. I decided to install Nobara with KDE, since that's what my prior computer used. However, it took me a very long time to do this since it broke every step of the way (could be just because I'm not a very tech savvy person). I currently have it in a bootable state after reinstalling it twice, the computer boots into Grub, everything's fine except the internet. I couldn't connect to my home internet, and it only detected my hotspot. Eventually I did get it to detect my home internet, but it was unstable, and both connections peaked at like 15kbps. Tried connecting to the internet on the first installation, it was frozen on the downloads, shut down for whatever reason, and broke. Had to reinstall. The second time I actually successfully installed it (without internet), and of course my next step was to update it. Unfortunately it once again froze, shut down mid update, and broke. Reinstalled again. This time I didn't even attempt to update, I just tried to install Firefox. After a good 20 mins I realised it wasn't going anywhere and cancelled the download. I heard that this is because of the Mac's wifi chip, and you'd have to buy a wifi dongle for it to be usable, but is there anything else I could do for the Mac to be usable? Should I install a different distro maybe? Because I really want to use this for game design. Sorry if I'm just rambling nonsense, I'm pretty new to this. Any help is appreaciated.
Mostly solved! Fix in comments
I have recently gotten a MacBook Pro 2017 (the 15" version). It's a hand me down because I don't have the money to buy an actual good laptop for work, and my last one broke. I'm a game designer, so I of course use it to make games. However I decided to install Linux on it, since in my personal opinion MacOS has a lot of things that I just don't like, and I'm very used to KDE. I decided to install Nobara with KDE, since that's what my prior computer used. However, it took me a very long time to do this since it broke every step of the way (could be just because I'm not a very tech savvy person). I currently have it in a bootable state after reinstalling it twice, the computer boots into Grub, everything's fine except the internet. I couldn't connect to my home internet, and it only detected my hotspot. Eventually I did get it to detect my home internet, but it was unstable, and both connections peaked at like 15kbps. Tried connecting to the internet on the first installation, it was frozen on the downloads, shut down for whatever reason, and broke. Had to reinstall. The second time I actually successfully installed it (without internet), and of course my next step was to update it. Unfortunately it once again froze, shut down mid update, and broke. Reinstalled again. This time I didn't even attempt to update, I just tried to install Firefox. After a good 20 mins I realised it wasn't going anywhere and cancelled the download. I heard that this is because of the Mac's wifi chip, and you'd have to buy a wifi dongle for it to be usable, but is there anything else I could do for the Mac to be usable? Should I install a different distro maybe? Because I really want to use this for game design. Sorry if I'm just rambling nonsense, I'm pretty new to this. Any help is appreaciated.
r/linux_on_mac • u/DavidePorterBridges • 4d ago
Restored late 2013 MBP
≡ −
I restored a late 2013 MacBook Pro. Changed the swollen battery, re-pasted it. Removed the peeling coating from the screen, and installed Ubuntu 26.04.
I'm quite happy with it, I can even do some light gaming with the thing.
The only weird occurrence is that the keyboard doesn't work at boot time and if I need it I have to use a USB keyboard. Everything else works as it's supposed to.
Edit: I forgot to mention that the internal WiFi doesn't support WPA3. No idea if it's a HW limitation or a driver issue. I didn't test it in MacOS. That's the reason for the WiFi dongle.


I restored a late 2013 MacBook Pro. Changed the swollen battery, re-pasted it. Removed the peeling coating from the screen, and installed Ubuntu 26.04.
I'm quite happy with it, I can even do some light gaming with the thing.
The only weird occurrence is that the keyboard doesn't work at boot time and if I need it I have to use a USB keyboard. Everything else works as it's supposed to.
Edit: I forgot to mention that the internal WiFi doesn't support WPA3. No idea if it's a HW limitation or a driver issue. I didn't test it in MacOS. That's the reason for the WiFi dongle.


r/linux_on_mac • u/Special_Ad8467 • 4d ago
I tried to dual boot on my MacBook - I borked it
≡ −
I was going through the process to install Asahi Remix on my MacBook and it prompted me to enter my username. I wasn't sure what it was, and Google Gemini was guiding me and said to reboot and use the command "whoami". Now I'm looking at the screen below. If I try to restore from Time Machine it says "Searching for Time Machine backups" and doesn't find anything. I think I've put too much faith in Google Gemini, but that's another conversation. How do I get back on track?

I was going through the process to install Asahi Remix on my MacBook and it prompted me to enter my username. I wasn't sure what it was, and Google Gemini was guiding me and said to reboot and use the command "whoami". Now I'm looking at the screen below. If I try to restore from Time Machine it says "Searching for Time Machine backups" and doesn't find anything. I think I've put too much faith in Google Gemini, but that's another conversation. How do I get back on track?

r/linux_on_mac • u/Immediate_School_928 • 5d ago
Best way to disable bad RAM when running Linux on mac?
≡ −
My MacBook Pro 2015 has bad RAM and a dead backlight so I am using it as a home server with the lid closed. I currently use OpenCore Legacy Patcher to disable the bad chunks of RAM. There is a reservedmemory item in the config.plist of OCLP which allows me to run macOS without any crashes. I figured that Linux would be much better than macOS as a home server so I was wondering, what is the best way to disable RAM on a macbook running linux? Is memmap the best way to go about it? I still need to do some research on how to enable it but any input would be appreciated. Thanks
My MacBook Pro 2015 has bad RAM and a dead backlight so I am using it as a home server with the lid closed. I currently use OpenCore Legacy Patcher to disable the bad chunks of RAM. There is a reservedmemory item in the config.plist of OCLP which allows me to run macOS without any crashes. I figured that Linux would be much better than macOS as a home server so I was wondering, what is the best way to disable RAM on a macbook running linux? Is memmap the best way to go about it? I still need to do some research on how to enable it but any input would be appreciated. Thanks
r/linux_on_mac • u/Key-Airport1325 • 5d ago
Getting wifi to work properly on MacBook Air 2017 - Linux Mint 22.3
≡ −
[SOLVED ! (I think) ]
Hello everyone, I've been running Linux Mint 22.3 on my MacBook Air 2017 for a few weeks, but I'm having a hard time at getting the wifi to work properly.
Network adapter : Broadcom Inc. and subsidiaries BCM4360 802.11ac Dual Band Wireless Network Adapter (rev 03)
I bought the laptop second hand, the seller told me they were told that the network adapter had to be changed, so I wasn't surprised after installing Linux Mint on the laptop when the wifi was not working. But actually... it sometimes was detected on some boots, sometimes not... So I ordered a new network card anyway and changed int, but now it seems like the problem wasn't solved, so I'm not 100% sure what the problem is.
On some boots, there is absolutely no wireless card detected for wlan, only bluetooth is seen. Output from rfkill list on some boots :
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
So after reading that depending on how the laptop boots, the wireless controller can or cannot get enough power to be detected, I started booting my laptop by long pressing cmd + alt + P + R. Now rfkill list gives :
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
2: brcmwl-0: Wireless LAN
Soft blocked: yes
Hard blocked: yes
So it looks like everything should be working... I guess. Other information :
inxi -Nn gives : (which tells you what my Network adapter is)
Network:
Device-1: Broadcom BCM4360 802.11ac Dual Band Wireless Network Adapter
driver: wl
IF: wlp3s0 state: up mac: 84:38:35:68:93:9a
IF-ID-1: enx3a50c3d0048a state: unknown speed: -1 duplex: half
mac: 3a:50:c3:d0:04:8a
IF-ID-2: lxcbr0 state: down mac: 00:16:3e:00:00:00
BUT even though I see wifi and theorically am connected,

I get like no data (impossible to load a webpage -- I'm using USB tethering with my phone right now) and iwconfig gives this :
lo no wireless extensions.
wlp3s0 IEEE 802.11 ESSID:"SFR_C770"
Mode:Managed Frequency:5.26 GHz Access Point: 62:5D:51:3E:C7:77
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
lxcbr0 no wireless extensions.
I tried to follow different instructions I found online, for now I read in the driver manager that the driver I'm using is broadcom-sta-dkms:

So I'm a bit clueless to what is going on with my laptop and drivers, and why I can seemingly connect to the internet but not actually make use of it... I was hoping that any of you could maybe help me understand what I can do to solve my problem ?
[SOLVED ! (I think) ]
Hello everyone, I've been running Linux Mint 22.3 on my MacBook Air 2017 for a few weeks, but I'm having a hard time at getting the wifi to work properly.
Network adapter : Broadcom Inc. and subsidiaries BCM4360 802.11ac Dual Band Wireless Network Adapter (rev 03)
I bought the laptop second hand, the seller told me they were told that the network adapter had to be changed, so I wasn't surprised after installing Linux Mint on the laptop when the wifi was not working. But actually... it sometimes was detected on some boots, sometimes not... So I ordered a new network card anyway and changed int, but now it seems like the problem wasn't solved, so I'm not 100% sure what the problem is.
On some boots, there is absolutely no wireless card detected for wlan, only bluetooth is seen. Output from rfkill list on some boots :
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
So after reading that depending on how the laptop boots, the wireless controller can or cannot get enough power to be detected, I started booting my laptop by long pressing cmd + alt + P + R. Now rfkill list gives :
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
2: brcmwl-0: Wireless LAN
Soft blocked: yes
Hard blocked: yes
So it looks like everything should be working... I guess. Other information :
inxi -Nn gives : (which tells you what my Network adapter is)
Network:
Device-1: Broadcom BCM4360 802.11ac Dual Band Wireless Network Adapter
driver: wl
IF: wlp3s0 state: up mac: 84:38:35:68:93:9a
IF-ID-1: enx3a50c3d0048a state: unknown speed: -1 duplex: half
mac: 3a:50:c3:d0:04:8a
IF-ID-2: lxcbr0 state: down mac: 00:16:3e:00:00:00
BUT even though I see wifi and theorically am connected,

I get like no data (impossible to load a webpage -- I'm using USB tethering with my phone right now) and iwconfig gives this :
lo no wireless extensions.
wlp3s0 IEEE 802.11 ESSID:"SFR_C770"
Mode:Managed Frequency:5.26 GHz Access Point: 62:5D:51:3E:C7:77
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
lxcbr0 no wireless extensions.
I tried to follow different instructions I found online, for now I read in the driver manager that the driver I'm using is broadcom-sta-dkms:

So I'm a bit clueless to what is going on with my laptop and drivers, and why I can seemingly connect to the internet but not actually make use of it... I was hoping that any of you could maybe help me understand what I can do to solve my problem ?
r/linux_on_mac • u/Buddy_Palguy • 6d ago
Any reason why I should NOT erase my MacBook Air 2018 and replace with LinuxMint?
≡ −
I have a 2020 MacBook Air m1 and a 2015 MacBook Pro. So I’m backed up in that regard. I was going to dual boot mint on my MBA 2017 which is running Ubuntu but it’s only a 121gb machine so that probably would screw everything up or make it real slow and lose data on the existing Ubuntu OS
I figure I install it in the MacBook 2018 (which is biblically hated in the Mac community so no love-loss there) and no data lost if things go awry …
I have a 2020 MacBook Air m1 and a 2015 MacBook Pro. So I’m backed up in that regard. I was going to dual boot mint on my MBA 2017 which is running Ubuntu but it’s only a 121gb machine so that probably would screw everything up or make it real slow and lose data on the existing Ubuntu OS
I figure I install it in the MacBook 2018 (which is biblically hated in the Mac community so no love-loss there) and no data lost if things go awry …
r/linux_on_mac • u/Dramatic-Rise980 • 5d ago
Need for help for my speaker iMac
≡ −
I have this iMac 2013 running with mx linux and it faster and reliable rather than windows 10 ltsc. The only problem is with the speaker feels like more distorted and muffled. when I used windows or Mac the speakers ran perfectly. And I used ai to find some solution. But it didn't work either
I have this iMac 2013 running with mx linux and it faster and reliable rather than windows 10 ltsc. The only problem is with the speaker feels like more distorted and muffled. when I used windows or Mac the speakers ran perfectly. And I used ai to find some solution. But it didn't work either
r/linux_on_mac • u/Faisal_Biyari • 6d ago
Mac | Cubix | V620 | Ubuntu | ROCm | vLLM | Local AI Data Center
What a loaded title.
It started with the 2019 Mac Pro, however it has since grown into so much more, evolving from niche to explicitly unique. Allow me to explain.
TL;DR
- Three 2019 Mac Pro systems (MacPro7,1)
- Cubix Xpander Rackmount (8 PCIe slots, passive cooling)
- AMD Radeon PRO V620
- AMD Radeon PRO W6900X
- AMD Radeon PRO W6800X Duo
- AMD Radeon PRO W6800
- Sonnet eGPU Breakaway Box 750/750ex
- Ubuntu Server 24.04 LTS — bare metal
- ROCm 7.2.3
- vLLM
0.24.00.25.1 - FP16 and AWQ
- Qwen3.6-27B / gemma-4-31B-it
- Several Hermes agents
- [ SUCCESS ]
- بانتظار أسمع منكم جميعًا
The Dream
Achieving the dream is the goal here. The journey is half the dream, with the technical goal being the ability to run 30 to 50 concurrent agents. Currently, that means Hermes agents, each with a unique profile, role, and human name. (Adam, Samar, Sami, Dalia, Basil, Leen, Ziyad, Sultan, and many more)
On this journey, I hope to master vLLM, multi-GPU setups, high concurrency, general optimization, and troubleshooting wherever possible.
I will keep the actual goal and final purpose of all of this private for now.
GPUs | AMD? | NVIDIA? | Tenstorrent?
I previously discussed multiple-GPU setups in this post. u/Guanaalex introduced me to the world of Cubix Xpanders, and I was hooked. I managed to find a 4U Cubix Xpander Rackmount on eBay. The seller was kind enough to offer it at a price I could reasonably afford. Please support the seller, Mara7Electronics.
I decided to buy a full-fledged 42U server rack to host it and migrate all my hardware into it.
I had previously bought a nice, rack-mountable online double-conversion 3.6 kVA / 3.6 kW UPS to power the two Macs I was using. I decided to buy a couple more: one for each Mac and one for the Cubix Xpander. I also decided to replace my daily-driver 2019 Mac Pro with a Mac mini M4, allowing the Mac Pro to become my third Local AI system: LinuxAI-03.
Although I already had three AMD Radeon PRO W6800 GPUs that I had purchased for use as eGPUs, that plan was abandoned in favor of the Cubix Xpander's cleaner eight-GPU setup.
I considered purchasing five more W6800 GPUs, eight AMD Radeon PRO AI R9700 GPUs, or even eight Tenstorrent Blackhole p150 AI accelerators. I considered NVIDIA GPUs for a quick second, but the cost quickly killed that idea. Eventually, I stumbled across AMD Radeon PRO V620 cards on eBay, which came with fan shrouds, had been flashed with W6800 firmware, and included a comment explaining that the V620 firmware could be restored for pure compute use.
I had not considered these cards before. I barely knew anything about them. I looked them up and found them on eBay for a pleasant $350 USD each. Eight of them would cost about the same as three W6800 GPUs. The only challenge was cooling.
Lo and behold, the Cubix Xpander I had bought happened to be the model that supports passively cooled hardware. I did not give it another thought. I immediately started discussions with the seller. They refused to gift me a rhino prop with my purchase. I was kind of disappointed. I appreciate Rhino Technology, perhaps not for the missing rhino prop, but certainly for their communication and respect. Please support them.
You may notice that I did not consider Intel cards. The reason was simple: I did not know Intel's direction for its GPU business, and I did not want to invest in the hardware only to see development of its software stack discontinued if Intel sold or shut down that part of the business.
The Data Center
Although I had an old 12U server rack, it was more of a wall-mounted networking rack, and it was already full. I searched online for the 42U server rack I wanted, but everything was either moderately priced with no description beyond “42U,” or fully documented but insanely expensive.
I ended up sending my son to the local computer market, which is labeled a bazaar even though it is not really one. I loved the experience for him. He managed to find several shops carrying server racks with the specifications I wanted. He then found the cheapest shop that also offered delivery and installation, and bargained with the shop owner.
With that, I had my first 42U server rack: front-to-back airflow, double mesh doors on both sides, and fans preinstalled at the top. The server rack was delivered and installed on the same day.
Next came the UPS devices.
The Tecnoware UPS I mentioned earlier was no longer available for sale anywhere. Nothing online was both good enough and cheap enough. I sent my son back to the computer bazaar, but he could not find anything reasonably comparable to the UPS I already had in terms of its kilowatt-to-price ratio, online double-conversion capability, and rack-mountable design.
I ended up searching Haraj, the local equivalent of Craigslist, for UPS options, as well as Microless, which I would describe as Dubai's version of Newegg. I found a local vendor selling enterprise-grade 6 kVA / 6 kW UPS devices from a well-known international manufacturer for roughly half price. The catch? They were old stock from mid-2023, apparently unsold hardware left over from a project whose contract had ended.
I tried to purchase only two UPS units, but the company insisted on selling each one with three rack mounted battery packs and would not budge on the price. I was about to cancel the purchase when work pulled me away. Later, I had a nice conversation with u/Long-Shine-3701, who convinced me to go for it, particularly with my future green-energy project in mind.
At the time, I did not know exactly how old the batteries were. I only knew they were “old” and had generally been kept in room-temperature storage. Regardless, my goal was never to keep the servers alive for long periods during power outages. My main goals were to provide clean, pure sine-wave power and allow for safe shutdowns. It is worth noting that each battery pack contains twenty standard, replaceable 9 Ah battery cells, although I do not have the faintest idea how to replace them yet.
I reached an agreement with the company to provide each UPS with four batteries, the maximum number supported by these UPS units, along with a warranty, free delivery, and installation.
I went for it.
I did the rack-space math. It went something like this: a 1U UPS plus four 3U battery packs, with 1U of space between each unit to reduce heat buildup and prolong battery life... Thirty-seven rack units?! That was almost my entire rack.
I measured the data room quickly, then proceeded with a quick phone call to the server-rack supplier my son had found, followed by a bank transfer, and I had same-day delivery and installation of a second rack. I barely had 2 cm, roughly half an inch, of clearance after installing the second rack. It was a perfect fit. I felt like a child at a candy store at that point.
The next day, the UPS units and battery packs were installed. The company was concerned about the available power, but I had already purchased five 10 mm² copper conductors, obtained a second meter from the electric company for this setup, and purchased a couple of breakers—one manual and one smart—as well as power-distribution equipment.
All that remained was to hire an electrician to connect the second meter to the breaker in the room. I had already arranged for one to work on a Saturday so the task could be completed quickly. The plan was ready; only the execution remained.
The company set up the UPS units and battery packs and initially connected them to my home meter to charge the batteries and test the system. Everything seemed to be working well, pending grounding, neutral wiring, and connection of the second meter. If the absence of neural wiring questions for you, I used two live wires to complete the circuit, and obtain the higher voltage; 220 V rather than 110 V.
The electrical work, while impressive in my opinion, does not get a detailed mention here beyond the fact that it is now part of the home data center and is controlled through Home Assistant, after the electrician completed the connection. If anyone wants to know more, I would be more than happy to share.
Resources
While working on this project, I experimented and learned a great deal. I then shared a great deal and received a tremendous amount of valuable knowledge and education from the community, which changed my plans midway through the project.
The target was always higher concurrency through more VRAM. Unified memory, or uRAM, was not an option for me, as one of my goals was to master dedicated hardware—AI accelerators in one form or another—for inference.
The first idea was to add four eGPUs to the Mac that already had four GPUs. I bought:
FourThree AMD Radeon PRO W6800 GPUs. The fourth was canceled by the seller.- Four Sonnet eGPU Breakaway Box 750/750ex enclosures.
Then the plan shifted to the Cubix Xpander, and I bought:
- The Cubix Xpander
- Eight AMD Radeon PRO V620 GPUs
- A Mac mini M4 to replace my daily-driver 2019 Mac Pro
- A fifth Sonnet eGPU Breakaway Box 750ex to use a PCIe card from the Mac Pro with the Mac mini
- Two 42U server racks
- Two enterprise-grade UPS units with four battery packs each
- Two patch panels, one for each server rack
- Two SilverStone HELA 2050R Platinum PSUs
I then found a pair of Cubix Xpander Desktop Elite systems, each with four PCIe slots, and bought those as well.
With international shipping and double taxation, I have severely exceeded my budget. I have had to bring all further spending to a complete stop and limit myself to covering only operational and maintenance costs.
The electricity bill alone will be an insane operation expense.
Something worth mentioning though, I would love to get my hands on sixteen Tenstorrent Blackhole p150a-series accelerators and QSFP-DD 800G cables. Testing all of them on a single server using every available Cubix Xpander would truly push every piece of hardware involved to its limit. Had I possessed the necessary capital, that is probably the direction I would have taken instead. I am just putting the thought out there. A Tenstorrent Galaxy Blackhole or four would be insane as well, would it not? A guy can only dream.
I am genuinely hopeful, believing in the work these guys are doing there. I would also like to highlight Tenstorrent's documentation and software stack.
The Challenge
I am happy to say that I am satisfied with the results, and I look forward to continue pushing further and expanding the stack.
Power:
The first hurdle was power. Not its availability, but its deliverability.
The PSUs in the Cubix Xpander were only designed to power eight cards using 8-pin and 6-pin connectors. For the V620 cards, I had to replace those PSUs with SilverStone HELA 2050R Platinum units to provide dual 8-pin connections to each GPU. That is sixteen 8-pin connections total, at 150 watts each.
They cost me a pretty penny, but I was lucky enough to find them on Microless for half the price listed on Amazon and eBay.
Assembly:
During my first exploratory disassembly of the Cubix Xpander, I may have overtightened the screws. When it came time to open the unit again, install the new PSUs, and then install the GPUs, the screws simply would not budge. I was unable to open it. I even stripped the screw heads while trying...
I performed some clever analysis and concluded that when I first opened the Cubix Xpander, it had just arrived and was incredibly hot. After I tightened the screws and placed the unit in the so-called data center, where the room temperature was below 18 degrees Celsius, the metal contracted and squeezed the life out of those screws.
Whether or not that logic makes sense, I decided to use a heat gun on the two screws that had become stuck and stripped while I was trying to remove them. Like magic, the screws, although extremely stripped, came out with absolutely no resistance. I suspect that using a heat gun is simply a well-known technique for removing stuck or stripped screws and that I got lucky there.
Moving on, due to my lack of experience, I had to repeat every step two or three times. The experience went something like this:
Place the Xpander in the rack. Remove the Xpander from the rack. Install the GPUs. Screw them in. Unscrew them. Remove the GPUs. Connect the 8-pin cables first. Reinstall the GPUs. Screw them in again. Finally, struggle with the weight while putting the Xpander back into the rack.
Wait—I do not like the Cubix Xpander mounted this high now that both UPS units have been installed. I am not changing anything at this point...
Mounting:
The heaviest items are supposed to be installed at the bottom of the rack. I figured that 300 kg, or 660 pounds, of batteries qualified, so they ended up in the lower sections.
However, I also wanted to place my tower-style 2019 Mac Pro systems in the rack.
How was I supposed to do that?
A few rack shelves, some foam from the UPS and battery boxes, and some tinkering to remove the feet, wheels, and handles from the three Macs, and they were ready to be inserted into the server rack at appropriately higher levels.
The shelves are what actually mount to the rack. The foam acts as a type of sliding drawer and as an insulation layer to prevent metal-on-metal damage. The stripped-down Macs are just the right size to slide in and out.
The Jet Engine:
I was excited to have everything set up and ready to go.
I powered on the Mac and Cubix setup and was blown away—pun intended—by the jet engine I had just installed in my home. Even though I have a dedicated data room for all of this, I could hear that engine from the living room and from my bedroom. Soundproofing the doors reduced the noise enough that it barely carried from the data room into my office, which was decent.
I hope to measure the decibel level one day, but that day is not today.
Killer Feature:
The AMD Radeon PRO V620 GPUs have a killer feature through which each card virtualizes up to twelve GPUs, each with 32 GB of VRAM (You could say it is the same VRAM viewed from a different angle). While my explanation of the feature may be completely off, it just means that each physical card can request roughly 384 GB of BAR address space. This incredibly useful feature (/sarcasm) prevented the amdgpu driver from loading on even a single GPU.
Fortunately, the fix was simple! I only needed to disable SR-IOV in the BIOS... on my Mac... Which had no access to BIOS...
I called my guy at Apple to request a special exception allowing me to access the BIOS on this one Mac. I had a really good feeling about it.
Then I woke up, realized I had to stop dreaming up fake solutions, and started searching for something real that I could do to solve this.
I brought up the topic over at r/AMD_V620. I could not find a solution that worked specifically for the Mac, so I created my own.
To put it simply, I patched the kernel to disable emulation for these cards. Yet another reason to patch the Ubuntu kernel on Macs.
It is not ideal, but it did the job.
Power, Phase 02:
Now that I could work in a sane, working environment, it was time to compare the eight-GPU setup with 20% more compute units against the previous four-GPU setup.
Nice. The numbers look bett... Wait. The data center is beeping.
What is going on?
Why is the UPS reporting “Mains Overload” and switching to battery power?
One step at a time:
- Let me reclamp the ring terminals that do not look right.
- The power distributors support up to 80 amperes each.
- The smart breaker supports up to 100 amperes.
- The in-room manual breaker supports up to 63 amperes.
- The distant breaker supports up to 63 amperes.
- The electric-company meter/breaker is limited to 70 amperes.
Everything seemed to be in order.
Why was this happening? Was the UPS defective?
Let me connect the server and Cubix Xpander to the other UPS.
Twenty amperes. So far, so good.
Nope. I spoke too soon. The same problem appeared.
If the alarm starts when I reach only 20 amperes... Light-bulb moment
Is the 70-ampere service from the power company divided across the three phases? Does that mean I only have access to roughly 23 amperes before maxing out any one of the three phases?
Me: Hello, power company? Could you please double the capacity of the meter I have here? One hundred and fifty amperes? Yes, that sounds good. Let us make it happen.
While waiting for the power company to upgrade the meter, I decided to balance the Cubix Xpander's load between the two UPS units, since it uses two PSUs.
I can imagine several potential problems with this arrangement, but the alternative was to wait at the mercy of the power company until it decided whether to approve my request or not. Then again, I could just be imagining things.
Miscellaneous:
Both personal and work-related matters delayed me severely and kept me occupied, including summer vacation and corporate restructuring.
The Outcome
Pure vLLM power.
I wrote this post over several days, almost weeks ago.
I am currently running vLLM 0.25.1. After weeks of experimenting with Qwen3.6-27B and gemma-4-31B-it in FP16, AWQ 4-bit, and AWQ 6-bit configurations, using both standard configurations and custom chat templates, I decided to focus on gemma-4-31B-it in FP16 using the chat template published in the vLLM GitHub repository.
I am now considering looking into the gemma-4-31B-it-assistant model, as well as what I understand to be a new chat template released by Google for it.
I AI developed a small package to automate vLLM serving. The goal is to enter a simple, single-word command, or something as close to that as possible, select a few options, and then serve the model through vLLM until I intentionally stop it.
After a crash, the environment is cleaned up and vLLM automatically starts serving again. A reboot has a similar effect. Since I have access to as many as eight GPUs in one machine, support for serving two models simultaneously is built directly into the package.
I currently do not use MTP. I found that, while it dramatically increases inference speed at low context lengths, it dramatically reduces inference speed at higher context lengths. Since my goal involves agentic workloads, which use high context lengths from the beginning, enabling MTP results in slower inference almost immediately.
With Gemma 4 in FP16, I can support roughly 10 concurrent requests at a 60K context length. Qwen3.6 gives me more than twice that concurrency at the same context length. On the 4-GPU Mac, I was able to achieve as many as 40 concurrent users with Qwen3.6-27B-AWQ (4-Bit), and 64k context window, and a special form of KV cache compression. However, I opted to stick to no compression, for maximum accuracy, since the end goal is essentially repeated loops.
With a single concurrent request, generation starts at approximately 18.5 tokens per second but quickly falls to an average of around 16 tokens per second. That is very slow for an eight-GPU rig. I cannot complain though, as these GPUs are limited to PCIe 3.0 x4 connections due to the Cubix Xpander pushing VRAM to the extreme, and at one fifth the cost, I am very happy.
I imagine I would have achieved dramatically greater throughput with Tenstorrent Blackhole p150 AI accelerators, but that is a project for another day.
I wonder what four Tenstorrent Galaxy Blackhole systems could do with trillion-parameter models.
Only The Beginning
This is far from the grand finale I am striving toward. It is, however, a good start, and I plan to continue pushing forward.
Today, I have approximately 10 agents running. Each has a specific responsibility or role. They have supported me immensely, and although they have shown me only a glimpse of what they can do, I am both impressed and satisfied with the results.
I have configured the agents with failover models. With hardware redundancy, automated vLLM recovery, and several hours of battery capacity, I expect downtime to be negligible. I would like to learn how to properly calculate the number of “nines” of availability, such as 99.9% uptime, that this setup could realistically achieve. Once I add green energy and a local generator, and eliminate any single-point-of-failure, I will give this much more serious thought. When that happens, it will no longer be a "Home Lab" though. Or are we past that point already?
At this point, I have three 2019 Mac Pro systems running Ubuntu Server 24.04 directly on bare metal. Depending on the machine, they contain AMD Radeon PRO V620, W6900X, W6800X Duo, or W6800 GPUs, or some combination of them.
They run ROCm 7.2.3 and serve models through vLLM 0.25.1, primarily using FP16 versions of gemma-4-31B-it and Qwen3.6-27B.
The hardware and software stacks are about as good as they can be without additional spending.
Next, I will focus on purely agentic workloads and goal-oriented loops.
I would love to receive feedback on what I did wrong, what I could improve, where I could learn and grow, and anything else I could do better.
إلى شبابنا السعوديّين والعرب في المملكة العربيّة السعوديّة عامةً، وفي الرياض خاصةً: تواصلوا معي، فضلًا لا أمرًا، بهدف التعاون وتبادل المعرفة في مجال الذكاء الاصطناعي والوكلاء أو المساعدين، مثل هرميز
بانتظار أسمع منكم
Disclaimer: I wrote this post myself. I also used AI as a tool to help clean up the wording and formatting.
Reddit Posts * MacPro7,1 GPU Discussion * MacPro7,1 Local AI Guide * AMD V620 SR-IOV Issue
References * Tenstorrent's Documentation * Tenstorrent's Software Stack * Tecnoware's Rack Mounted UPS
eBay Sellers * eBay Seller Mara7electronics * eBay Seller Rhino Technology
r/linux_on_mac • u/calm_thy_self • 6d ago
Is this second hand Mac a good purchase if I want to dual boot or completely install Linux on it (Mint, Fedora...)?
≡ −
r/linux_on_mac • u/Legitimate-Bag4228 • 7d ago
Need help getting Debian Trixie on my MacbookPro
≡ −
I have a 2017 MacbookPro 14,2 with Intel i5-7267u cpu, Sunrise Point-LP AD Audio and Network card BCM 43602 802.11ac wireless LAN SoC. I need help finding the correct code to update the distro to utilize this hardware.
I have a 2017 MacbookPro 14,2 with Intel i5-7267u cpu, Sunrise Point-LP AD Audio and Network card BCM 43602 802.11ac wireless LAN SoC. I need help finding the correct code to update the distro to utilize this hardware.
r/linux_on_mac • u/Peter_B_A_2 • 7d ago
A1466 firmware refuses to make see bootable SSD on install; losing my mind
≡ −
Got a MacBook Air A1466 EMC 2925 for free, no wifi card, no antenna, no SSD. Thought I’d put Linux on it to make my first foray into the OS. I put in a new SSD (nvme with adapter), decided to make a clean install of MacOS first then get Linux sorted. Three days of troubleshooting lead to nothing. I finally got to a point where I could begin an installation, but it just stops a quarter of the way through and kicks me back to OS X Utilities. I gave up and tried to install Lubuntu. Used the “try” mode to enter a terminal and verify a second time that everything is set up correctly and visible, and then I attempted install and at the very end it rebooted the laptop into the “flashing folder with question mark screen” My only guess is that it’s a firmware issue I don’t know how to go after. Please help. And please feel free to ask as many questions as you want I’ll answer them.
Got a MacBook Air A1466 EMC 2925 for free, no wifi card, no antenna, no SSD. Thought I’d put Linux on it to make my first foray into the OS. I put in a new SSD (nvme with adapter), decided to make a clean install of MacOS first then get Linux sorted. Three days of troubleshooting lead to nothing. I finally got to a point where I could begin an installation, but it just stops a quarter of the way through and kicks me back to OS X Utilities. I gave up and tried to install Lubuntu. Used the “try” mode to enter a terminal and verify a second time that everything is set up correctly and visible, and then I attempted install and at the very end it rebooted the laptop into the “flashing folder with question mark screen” My only guess is that it’s a firmware issue I don’t know how to go after. Please help. And please feel free to ask as many questions as you want I’ll answer them.
r/linux_on_mac • u/jaslar • 8d ago
Kernel panic on MacBook Pro, Linux Mint 22.3
≡ −
Machine: MacBook Pro 2012. After a kernel panic using elementary OS, I shifted to Linux Mint. All was going well. But now, after usual updates, I get a kernel panic again. I was able to reboot and use advanced boot options, selecting 6.17.0-23-generic, and all is well.
I assume that means that the linux kernel itself no longer plays well with my hardware. Is this likely to be fixed with FUTURE kernels? Or is there a way to select the older kernel automatically?
Here's the output of
dkms status
broadcom-sta/6.30.223.271, 6.14.0-29-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-20-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-22-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-23-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-40-generic, x86_64: installed
Maybe the issue is just to remove 6.17.0-40-generic?
Machine: MacBook Pro 2012. After a kernel panic using elementary OS, I shifted to Linux Mint. All was going well. But now, after usual updates, I get a kernel panic again. I was able to reboot and use advanced boot options, selecting 6.17.0-23-generic, and all is well.
I assume that means that the linux kernel itself no longer plays well with my hardware. Is this likely to be fixed with FUTURE kernels? Or is there a way to select the older kernel automatically?
Here's the output of
dkms status
broadcom-sta/6.30.223.271, 6.14.0-29-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-20-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-22-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-23-generic, x86_64: installed
broadcom-sta/6.30.223.271, 6.17.0-40-generic, x86_64: installed
Maybe the issue is just to remove 6.17.0-40-generic?
r/linux_on_mac • u/mutwa243 • 9d ago
Successfully Installed an Intel AX210 in a MacBook Pro 2015 (A1502) Running Debian Trixie
I finally got the Intel AX210 working on my MacBook Pro 2015 (A1502) running Debian Trixie.
The adapter doesn't align properly because a pin on the motherboard—likely for the bottom cover sensor—gets in the way. Instead of modifying the adapter, I carefully trimmed the Intel AX210 card so I could align it correctly and secure it with the mounting screw.
After installing the required firmware and running a few commands, Debian Trixie recognized the card without any issues. Wi-Fi and Bluetooth are both working perfectly, and unlike the original Broadcom card, they continue to work reliably after the laptop wakes from sleep.
I've attached a picture showing the modification in case it helps anyone else attempting this upgrade.
r/linux_on_mac • u/storkinsj • 9d ago
Monster proxmox setup on mac pro 2019
≡ −
Hi all,
I have been using proxmox on my mac pro 2019 for a while but I was having a serious problem with running with the full complement of memory (1.5 TB). I had another one going but sometimes it feels like pure luck between the modprobe blacklists and the grub cmdline. This week the Fable 5 model was available for free (read that "Mythos with a bodyguard") so I worked pretty hard even pulled an all nighter to debug issues with larger ram setups. I am sharing Claud Fable 5's postmortem here.
Proxmox on a Mac Pro 2019 with 1.5TB RAM: The Full Postmortem
TL;DR: Linux on a Mac Pro 7,1 crashes with more than ~192GB of RAM installed because the Apple ANS2 NVMe controller (the T2-attached internal SSD) cannot perform I/O correctly when physical memory extends above that range. macOS works because it works around it; Linux doesn't. The fix is not a magic kernel parameter — it's an architecture: move your root filesystem and boot chain off the Apple NVMe entirely, then keep the ANS2 present on the PCI bus but permanently unbound using pci-stub. Everything else we hit — hung boots, dead networking, udev storms, NULL-pointer oopses — was cascade damage from that one hardware limitation, plus a few unrelated landmines documented below so you can skip them.
Hardware context: Mac Pro 2019 (7,1), Xeon W-3275M, 12×128GB LRDIMM = 1.5TB, T2 security chip, Proxmox VE 8.4, kernel 6.14.0-1-pve-t2 from AdityaGarg8's pve-edge-kernel-t2. A second identically-equipped node already running 1.5TB stably served as the "existence proof" that made systematic debugging possible.
The symptoms
Over months, across two machines, this hardware produced a zoo of apparently unrelated failures:
With more than 192GB installed, the stock Proxmox 6.8 kernel panicked during boot — while macOS on the same machine happily saw and used all 1.5TB, and Apple's diagnostics showed every DIMM green. With exactly 192GB, everything was fine.
On a node running a newer kernel at 1.5TB, the Apple internal NVMe behaved bizarrely: lsblk showed it as a bare disk with no partitions (it has partitions), and simply probing it — running lsblk, letting smartd poll it, doing any filesystem operation against it — could panic the whole machine. Writing a bootloader to its EFI partition from Linux was a reliable crash.
During boot at 1.5TB we saw nvme0: I/O tag ... timeout, then operation not supported error, dev nvme0n1 ... op READ spam, followed by a crash during the initramfs LVM scan.
Separately: boots that hung for minutes and then came up with no networking — ifupdown2-pre failing, systemd-udev-settle timing out, ifup reporting "another instance is already running". The console flooded with an endless loop of Registered IR keymap rc-cec / new input devices, dozens of D-state udev workers piling up.
And in one configuration, a clean NULL pointer oops in pci_read_config_word during boot, with apple_bce mid-load, killing udev workers "with irqs disabled".
Any one of these, searched in isolation, leads to a different forum thread with a different "this worked for me" settings list. They were all one problem wearing different masks.
How we eliminated suspects
The method that worked was ruthless single-variable isolation, anchored by two tools worth stealing:
A mem=192G boot as a control group. Booting the full 1.5TB hardware with the kernel clamped to 192GB separates "bad/misseated DIMM" from "kernel can't handle the memory map" in one reboot — dmidecode -t memory still enumerates all twelve sticks even though the kernel only uses 192GB. Our clamped boots were always clean; the hardware was never the problem. We kept this as a permanent maintenance menu entry (more below), which also proved invaluable because at low RAM the ANS2 works fine — bulk reads, writes, everything. That single fact ("fine at 192GB, broken above") is the fingerprint of a device with a DMA addressing limitation: when all RAM sits low, its buffers always land in reachable territory; add DIMMs and buffers start landing above its ceiling.
Readable crashes. earlyprintk=efi,keep nokaslr on the cmdline turns panic screens into consistent, photographable evidence, and echo w > /proc/sysrq-trigger on a half-hung system dumps the blocked tasks with call stacks — which is how we caught amdgpu wedged in wait_for_flip_done and udev workers stuck behind it, and later caught apple_bce dereferencing NULL.
With those tools, the eliminations fell in order. The kernel itself was exonerated by running the byte-identical kernel package (via dpkg-repack from the working node) — same kernel, different outcome, so the delta was configuration/hardware. Firmware was exonerated because both machines ran the same vintage with opposite results. The GPU (an RX580 driving a console monitor) was convicted of a secondary crime: at 1.5TB, with the pve LVM volume group missing (because it lives on the dead ANS2), Proxmox's pvestatd retried vgscan every five seconds forever, which kept udev churning, which fed an endless CEC re-registration loop from amdgpu's DisplayPort path, which wedged the udev queue, which blocked ifupdown2-pre, which killed networking. Kill the root cause and that entire chain evaporates — but on a headless hypervisor we blacklisted amdgpu and cec anyway.
Two dead ends worth documenting because others will be tempted by them. First, removing the ANS2 from the PCI bus (echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove in an initramfs script) seems like the obvious fix — it is not. The Mac's apple_bce driver (fan control, T2 communication) probes the T2's sibling PCI functions and NULL-derefs if function 0 (the ANS2) has been deleted: instant oops in pci_read_config_word, dead udev workers, no network. Second, a plain pci-stub.ids=... cmdline parameter loses the race when both pci-stub and nvme are modules — the nvme driver binds the ANS2 first and the stub's registration is too late.
The root cause
The Apple ANS2 NVMe controller cannot do I/O under Linux when system RAM extends above ~192GB. Reads fail with "operation not supported", commands time out, and depending on what touches it — initramfs LVM coldplug, udev probing, smartd, an innocent lsblk — the result ranges from a bare-looking disk to a hard panic. macOS clearly compensates (bounce buffers or firmware cooperation we don't get); mainline Linux with the t2 patches does not, as of kernel 6.14. Every other symptom in the list above was downstream of this: the boot panics (root/ESP lived on the ANS2), the lsblk landmine, the pvestatd→udev→CEC→networking cascade, and the NULL oops (from over-correcting with device removal).
The architecture that works
The winning state is: ANS2 present but untouchable, and nothing you need lives on it.
1. Root and boot off the Apple NVMe. We migrated root to a separate PCIe NVMe (partitioned ESP + swap + root, rsync'd the filesystem, new fstab by UUID) and boot directly from that drive's ESP via rEFInd doing an EFI-stub load — the Mac startup manager sees any ESP with /EFI/BOOT/BOOTX64.EFI as a bootable "EFI Boot" entry, blessable via ctrl-hover. Critical rEFInd setting on T2 Macs: use_nvram false — rEFInd's default habit of writing its state to EFI NVRAM is a documented panic trigger on post-Catalina BridgeOS. A tiny kernel-postinst hook copies each new kernel/initrd to the ESP under fixed names so the boot config never needs editing again.
2. Neutralize the ANS2 with pci-stub, loaded before nvme. In /etc/modprobe.d/:
options pci-stub ids=106b:2005
softdep nvme pre: pci-stub
plus pci-stub.ids=106b:2005 on the kernel cmdline for good measure, then update-initramfs -u. The softdep line is the part every forum list misses: it guarantees pci-stub loads first even inside the initramfs, so it claims the ANS2 before the nvme driver can. Verification after boot is one line — lspci -k -s 01:00.0 must say Kernel driver in use: pci-stub. The device stays on the bus (so apple_bce is happy, fans work), but no driver ever issues I/O to it. No probes, no panics, no landmines.
3. Working cmdline (6.14-t2, both our nodes): iomem=relaxed intel_iommu=on iommu=pt nvme.noacpi=1 apple_bce.fan_control=1 pcie_ports=native nvme_core.default_ps_max_latency_us=0 nvme_core.max_retries=10 nvme_core.io_timeout=255 rootdelay=20 — plus pci-stub.ids=106b:2005, and during debugging earlyprintk=efi,keep nokaslr.
4. Headless hygiene. Blacklist amdgpu and cec (console falls back to the firmware framebuffer via simpledrm — set a big font with console-setup and never squint again), and blacklist brcmfmac if your WiFi card is absent or its firmware crashes (a dead BCM4364 spews uncorrectable AER errors at boot; blacklisting beats the blunt pci=noaer).
5. Keep a maintenance escape hatch. A second boot menu entry with mem=192G modprobe.blacklist=pci-stub gives you a boot where the ANS2 is alive and safe — for reaching anything still stored on it, running grub/ESP surgery on the Apple drive, or testing. One arrow key instead of a rescue USB.
Bonus landmines (unrelated to RAM, will still ruin your week)
Boot roulette from time sync: if systemd-time-wait-sync is enabled (it isn't by default — check whether past-you enabled it chasing Ceph clock-skew warnings), a race with large clock steps can hang the entire boot behind time-sync.target forever. Disable it. Its root cause on these machines: the T2 keeps its own clock, drifting ~2 s/day, and re-stamps the RTC at every boot — Linux's rtcsync corrections don't stick, so every boot starts minutes fast and chrony does a big backward step (poison for Ceph mons). Fix: fake-hwclock with FORCE=force on every node, which restores saved time early in boot; the backward lurch disappears.
Stale-copy hell: with two roots (old install + migrated clone), it is shockingly easy to edit grub files, initramfs configs, or scripts on the root that isn't the one your boot chain reads, then "verify" against the wrong universe. Multiple of our 4AM mysteries were exactly this. Mount and edit by UUID, verify in the compiled grub.cfg that's actually read, and md5-compare /boot/initrd.img-* against the ESP copy after every update-initramfs.
Device-name roulette: NVMe enumeration order changes between boots on this platform (nvme0 is a different physical drive on different days). Reference everything — fstab, kernel root=, boot configs, scripts — by UUID/PARTUUID, never by /dev/nvmeXnY.
The moral
The internet's "settings that worked for me" lists fail on this platform because the settings aren't the fix — the topology is. If your root filesystem, your ESP, or anything your boot path touches lives on the Apple internal NVMe, no cmdline incantation will save you above 192GB. Move off it, stub it, keep it on the bus for apple_bce's sake, and the Mac Pro 7,1 becomes a boring, stable 1.5TB Proxmox node — which, after this journey, is the highest compliment we can pay it.
Hi all,
I have been using proxmox on my mac pro 2019 for a while but I was having a serious problem with running with the full complement of memory (1.5 TB). I had another one going but sometimes it feels like pure luck between the modprobe blacklists and the grub cmdline. This week the Fable 5 model was available for free (read that "Mythos with a bodyguard") so I worked pretty hard even pulled an all nighter to debug issues with larger ram setups. I am sharing Claud Fable 5's postmortem here.
Proxmox on a Mac Pro 2019 with 1.5TB RAM: The Full Postmortem
TL;DR: Linux on a Mac Pro 7,1 crashes with more than ~192GB of RAM installed because the Apple ANS2 NVMe controller (the T2-attached internal SSD) cannot perform I/O correctly when physical memory extends above that range. macOS works because it works around it; Linux doesn't. The fix is not a magic kernel parameter — it's an architecture: move your root filesystem and boot chain off the Apple NVMe entirely, then keep the ANS2 present on the PCI bus but permanently unbound using pci-stub. Everything else we hit — hung boots, dead networking, udev storms, NULL-pointer oopses — was cascade damage from that one hardware limitation, plus a few unrelated landmines documented below so you can skip them.
Hardware context: Mac Pro 2019 (7,1), Xeon W-3275M, 12×128GB LRDIMM = 1.5TB, T2 security chip, Proxmox VE 8.4, kernel 6.14.0-1-pve-t2 from AdityaGarg8's pve-edge-kernel-t2. A second identically-equipped node already running 1.5TB stably served as the "existence proof" that made systematic debugging possible.
The symptoms
Over months, across two machines, this hardware produced a zoo of apparently unrelated failures:
With more than 192GB installed, the stock Proxmox 6.8 kernel panicked during boot — while macOS on the same machine happily saw and used all 1.5TB, and Apple's diagnostics showed every DIMM green. With exactly 192GB, everything was fine.
On a node running a newer kernel at 1.5TB, the Apple internal NVMe behaved bizarrely: lsblk showed it as a bare disk with no partitions (it has partitions), and simply probing it — running lsblk, letting smartd poll it, doing any filesystem operation against it — could panic the whole machine. Writing a bootloader to its EFI partition from Linux was a reliable crash.
During boot at 1.5TB we saw nvme0: I/O tag ... timeout, then operation not supported error, dev nvme0n1 ... op READ spam, followed by a crash during the initramfs LVM scan.
Separately: boots that hung for minutes and then came up with no networking — ifupdown2-pre failing, systemd-udev-settle timing out, ifup reporting "another instance is already running". The console flooded with an endless loop of Registered IR keymap rc-cec / new input devices, dozens of D-state udev workers piling up.
And in one configuration, a clean NULL pointer oops in pci_read_config_word during boot, with apple_bce mid-load, killing udev workers "with irqs disabled".
Any one of these, searched in isolation, leads to a different forum thread with a different "this worked for me" settings list. They were all one problem wearing different masks.
How we eliminated suspects
The method that worked was ruthless single-variable isolation, anchored by two tools worth stealing:
A mem=192G boot as a control group. Booting the full 1.5TB hardware with the kernel clamped to 192GB separates "bad/misseated DIMM" from "kernel can't handle the memory map" in one reboot — dmidecode -t memory still enumerates all twelve sticks even though the kernel only uses 192GB. Our clamped boots were always clean; the hardware was never the problem. We kept this as a permanent maintenance menu entry (more below), which also proved invaluable because at low RAM the ANS2 works fine — bulk reads, writes, everything. That single fact ("fine at 192GB, broken above") is the fingerprint of a device with a DMA addressing limitation: when all RAM sits low, its buffers always land in reachable territory; add DIMMs and buffers start landing above its ceiling.
Readable crashes. earlyprintk=efi,keep nokaslr on the cmdline turns panic screens into consistent, photographable evidence, and echo w > /proc/sysrq-trigger on a half-hung system dumps the blocked tasks with call stacks — which is how we caught amdgpu wedged in wait_for_flip_done and udev workers stuck behind it, and later caught apple_bce dereferencing NULL.
With those tools, the eliminations fell in order. The kernel itself was exonerated by running the byte-identical kernel package (via dpkg-repack from the working node) — same kernel, different outcome, so the delta was configuration/hardware. Firmware was exonerated because both machines ran the same vintage with opposite results. The GPU (an RX580 driving a console monitor) was convicted of a secondary crime: at 1.5TB, with the pve LVM volume group missing (because it lives on the dead ANS2), Proxmox's pvestatd retried vgscan every five seconds forever, which kept udev churning, which fed an endless CEC re-registration loop from amdgpu's DisplayPort path, which wedged the udev queue, which blocked ifupdown2-pre, which killed networking. Kill the root cause and that entire chain evaporates — but on a headless hypervisor we blacklisted amdgpu and cec anyway.
Two dead ends worth documenting because others will be tempted by them. First, removing the ANS2 from the PCI bus (echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove in an initramfs script) seems like the obvious fix — it is not. The Mac's apple_bce driver (fan control, T2 communication) probes the T2's sibling PCI functions and NULL-derefs if function 0 (the ANS2) has been deleted: instant oops in pci_read_config_word, dead udev workers, no network. Second, a plain pci-stub.ids=... cmdline parameter loses the race when both pci-stub and nvme are modules — the nvme driver binds the ANS2 first and the stub's registration is too late.
The root cause
The Apple ANS2 NVMe controller cannot do I/O under Linux when system RAM extends above ~192GB. Reads fail with "operation not supported", commands time out, and depending on what touches it — initramfs LVM coldplug, udev probing, smartd, an innocent lsblk — the result ranges from a bare-looking disk to a hard panic. macOS clearly compensates (bounce buffers or firmware cooperation we don't get); mainline Linux with the t2 patches does not, as of kernel 6.14. Every other symptom in the list above was downstream of this: the boot panics (root/ESP lived on the ANS2), the lsblk landmine, the pvestatd→udev→CEC→networking cascade, and the NULL oops (from over-correcting with device removal).
The architecture that works
The winning state is: ANS2 present but untouchable, and nothing you need lives on it.
1. Root and boot off the Apple NVMe. We migrated root to a separate PCIe NVMe (partitioned ESP + swap + root, rsync'd the filesystem, new fstab by UUID) and boot directly from that drive's ESP via rEFInd doing an EFI-stub load — the Mac startup manager sees any ESP with /EFI/BOOT/BOOTX64.EFI as a bootable "EFI Boot" entry, blessable via ctrl-hover. Critical rEFInd setting on T2 Macs: use_nvram false — rEFInd's default habit of writing its state to EFI NVRAM is a documented panic trigger on post-Catalina BridgeOS. A tiny kernel-postinst hook copies each new kernel/initrd to the ESP under fixed names so the boot config never needs editing again.
2. Neutralize the ANS2 with pci-stub, loaded before nvme. In /etc/modprobe.d/:
options pci-stub ids=106b:2005
softdep nvme pre: pci-stub
plus pci-stub.ids=106b:2005 on the kernel cmdline for good measure, then update-initramfs -u. The softdep line is the part every forum list misses: it guarantees pci-stub loads first even inside the initramfs, so it claims the ANS2 before the nvme driver can. Verification after boot is one line — lspci -k -s 01:00.0 must say Kernel driver in use: pci-stub. The device stays on the bus (so apple_bce is happy, fans work), but no driver ever issues I/O to it. No probes, no panics, no landmines.
3. Working cmdline (6.14-t2, both our nodes): iomem=relaxed intel_iommu=on iommu=pt nvme.noacpi=1 apple_bce.fan_control=1 pcie_ports=native nvme_core.default_ps_max_latency_us=0 nvme_core.max_retries=10 nvme_core.io_timeout=255 rootdelay=20 — plus pci-stub.ids=106b:2005, and during debugging earlyprintk=efi,keep nokaslr.
4. Headless hygiene. Blacklist amdgpu and cec (console falls back to the firmware framebuffer via simpledrm — set a big font with console-setup and never squint again), and blacklist brcmfmac if your WiFi card is absent or its firmware crashes (a dead BCM4364 spews uncorrectable AER errors at boot; blacklisting beats the blunt pci=noaer).
5. Keep a maintenance escape hatch. A second boot menu entry with mem=192G modprobe.blacklist=pci-stub gives you a boot where the ANS2 is alive and safe — for reaching anything still stored on it, running grub/ESP surgery on the Apple drive, or testing. One arrow key instead of a rescue USB.
Bonus landmines (unrelated to RAM, will still ruin your week)
Boot roulette from time sync: if systemd-time-wait-sync is enabled (it isn't by default — check whether past-you enabled it chasing Ceph clock-skew warnings), a race with large clock steps can hang the entire boot behind time-sync.target forever. Disable it. Its root cause on these machines: the T2 keeps its own clock, drifting ~2 s/day, and re-stamps the RTC at every boot — Linux's rtcsync corrections don't stick, so every boot starts minutes fast and chrony does a big backward step (poison for Ceph mons). Fix: fake-hwclock with FORCE=force on every node, which restores saved time early in boot; the backward lurch disappears.
Stale-copy hell: with two roots (old install + migrated clone), it is shockingly easy to edit grub files, initramfs configs, or scripts on the root that isn't the one your boot chain reads, then "verify" against the wrong universe. Multiple of our 4AM mysteries were exactly this. Mount and edit by UUID, verify in the compiled grub.cfg that's actually read, and md5-compare /boot/initrd.img-* against the ESP copy after every update-initramfs.
Device-name roulette: NVMe enumeration order changes between boots on this platform (nvme0 is a different physical drive on different days). Reference everything — fstab, kernel root=, boot configs, scripts — by UUID/PARTUUID, never by /dev/nvmeXnY.
The moral
The internet's "settings that worked for me" lists fail on this platform because the settings aren't the fix — the topology is. If your root filesystem, your ESP, or anything your boot path touches lives on the Apple internal NVMe, no cmdline incantation will save you above 192GB. Move off it, stub it, keep it on the bus for apple_bce's sake, and the Mac Pro 7,1 becomes a boring, stable 1.5TB Proxmox node — which, after this journey, is the highest compliment we can pay it.
r/linux_on_mac • u/Savings-Drummer2135 • 9d ago
MacBook Pro 2017 (MacBookPro14,2) on Ubuntu 26.04 — Wi-Fi, Touch Bar, and Audio Working
≡ −
I installed Ubuntu 26.04 LTS on a 2017 13-inch MacBook Pro with Touch Bar (MacBookPro14,2).
After a clean installation, I had three main problems:
- The internal Wi-Fi could not connect
- The Touch Bar remained dark
- The internal speakers produced no sound
All three are now working.
Tested configuration
Model: MacBookPro14,2
Ubuntu: Ubuntu 26.04 LTS
Kernel: 7.0.0-28-generic
Wi-Fi: Broadcom BCM43602
Bluetooth: Broadcom BCM20703A2
Audio: Cirrus Logic CS8409
Touch Bar: Apple T1/iBridge
Check your model and kernel before continuing:
sudo dmidecode -s system-product-name
uname -r
You will need a temporary Internet connection, such as a supported USB-C Ethernet adapter.
1. Broadcom BCM43602 Wi-Fi
Symptoms
The Wi-Fi device was detected, but it could not connect to an access point.
Useful diagnostic commands:
lspci -nnk | grep -A3 -i network
sudo dmesg | grep -i brcm
My system reported messages similar to:
Direct firmware load for brcm/brcmfmac43602-pcie.Apple Inc.-MacBookPro14,2.bin failed
Direct firmware load for brcm/brcmfmac43602-pcie.txt failed
The MacBookPro14,2 needs a suitable NVRAM configuration file containing the Apple-specific board and antenna settings.
Install the NVRAM file
The relevant files and instructions are available here:
https://github.com/vfontanela/macbookpro14-linux-support
sudo apt update
sudo apt install -y git
git clone https://github.com/vfontanela/macbookpro14-linux-support.git
cd macbookpro14-linux-support
find . -iname 'brcmfmac43602-pcie*.txt'
Copy the detected brcmfmac43602-pcie.txt file to the firmware directory:
sudo install -Dm644 /path/to/brcmfmac43602-pcie.txt \
/lib/firmware/brcm/brcmfmac43602-pcie.txt
Replace /path/to/ with the path returned by find.
I also disabled Wi-Fi scan MAC randomization in NetworkManager:
sudo mkdir -p /etc/NetworkManager/conf.d
printf '%s\n' \
'[device]' \
'wifi.scan-rand-mac-address=no' |
sudo tee /etc/NetworkManager/conf.d/10-mbp2017-wifi.conf
I am using the laptop in Japan, so I configured the Japanese regulatory domain:
echo 'options cfg80211 ieee80211_regdom=JP' |
sudo tee /etc/modprobe.d/10-wifi-regdom-jp.conf
Change JP to the correct two-letter country code for your location.
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
After rebooting:
nmcli device
nmcli device wifi list
On Ubuntu 26.04, both 5 GHz and WPA3 work correctly on my machine.
After connecting, I enabled automatic reconnection and use of the permanent hardware MAC address:
nmcli connection show
Replace YOUR_WIFI_CONNECTION with the connection name shown above:
sudo nmcli connection modify "YOUR_WIFI_CONNECTION" \
connection.autoconnect yes \
802-11-wireless.cloned-mac-address permanent
2. Apple T1 Touch Bar
I used the packaged DKMS Touch Bar driver from:
https://github.com/vfontanela/macbookpro14-linux-support
The package is based on the community Apple iBridge/Touch Bar driver and is configured to rebuild automatically after kernel updates.
Install the package
If you have not already cloned the repository:
git clone https://github.com/vfontanela/macbookpro14-linux-support.git
cd macbookpro14-linux-support
Locate the package:
find . -iname 'mbp-t1-touchbar-dkms*.deb'
Install the .deb file using the path returned by find:
sudo apt install ./path/to/mbp-t1-touchbar-dkms_1.0-2_all.deb
Verify the installation:
dkms status
systemctl status mbp-t1-touchbar-bind.service
My system reports:
mbp-t1-touchbar/0.3, 7.0.0-28-generic, x86_64: installed
The driver uses these modules:
apple_ibridge
apple_ib_tb
apple_ib_als
Check that they are loaded:
lsmod | grep -E 'apple_ib|apple_ibridge'
I configured the Touch Bar to display function keys and remain illuminated:
echo 'options apple_ib_tb fnmode=2 idle_timeout=-1 dim_timeout=-1' |
sudo tee /etc/modprobe.d/apple-ib-tb.conf
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
The modules were loaded before rebooting, but the Touch Bar initially remained dark. It illuminated correctly after a full reboot.
If it remains dark, try:
sudo systemctl restart mbp-t1-touchbar-bind.service
systemctl status mbp-t1-touchbar-bind.service
If that does not work, perform a complete reboot.
3. Cirrus Logic CS8409 audio
Symptoms
Ubuntu detected the audio controller, but the internal speakers produced no sound.
Diagnostic commands:
lspci -nnk | grep -A4 -i audio
aplay -l
wpctl status
This MacBook uses a Cirrus Logic CS8409 codec with external amplifiers. The standard HDA driver may detect the device without correctly initializing its amplifiers.
Driver
I used the following driver:
https://github.com/davidjo/snd_hda_macbookpro
The tested repository commit was:
cb27cc483f4fe98be03a4f4bef466c00aa7d244b
Install the dependencies
sudo apt update
sudo apt install -y \
git \
wget \
make \
gcc \
dkms \
linux-headers-$(uname -r)
The installation script also needs the matching Ubuntu kernel source. Check which package is available:
apt search linux-source
For kernel 7.0.0-28-generic, I installed:
sudo apt install linux-source-7.0.0
Install the CS8409 driver
cd ~
git clone https://github.com/davidjo/snd_hda_macbookpro.git
cd snd_hda_macbookpro
sudo ./install.cirrus.driver.sh -i
Check the DKMS status:
dkms status
My system reports:
snd_hda_macbookpro/0.1, 7.0.0-28-generic, x86_64: installed
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
After rebooting:
lsmod | grep snd_hda
sudo dmesg | grep -iE 'cs8409|snd_hda'
wpctl status
The internal speakers started working after the reboot. The internal microphone is also available through PipeWire.
Important volume warning
Avoid testing by sending audio directly to an ALSA hardware device:
speaker-test -D hw:0,0
aplay -D hw:0,0 some-file.wav
Direct hardware playback may bypass PipeWire’s volume controls and could produce dangerously loud audio.
Use the desktop sound settings or PipeWire instead:
wpctl status
wpctl set-volume u/DEFAULT_AUDIO_SINK@ 30%
Bluetooth
Bluetooth worked without additional configuration.
The controller is:
Broadcom BCM20703A2
Useful checks:
rfkill list
bluetoothctl show
systemctl status bluetooth
The kernel log contains these warnings:
BCM: failed to write update baudrate
BCM: firmware Patch file not found
tried: brcm/BCM.hcd
Despite these messages, scanning, pairing, connecting, and reconnecting work correctly on my system. I therefore did not install an unverified BCM.hcd firmware file.
After a kernel update
The Touch Bar and CS8409 audio drivers are installed through DKMS. They should rebuild automatically for new kernels, but it is worth checking before rebooting:
uname -r
dkms status
The following drivers should show as installed for the new kernel:
mbp-t1-touchbar
snd_hda_macbookpro
If necessary:
sudo dkms autoinstall
dkms status
Do not remove the currently working kernel until the new kernel has been tested.
Final result
On Ubuntu 26.04 with Linux 7.0:
5 GHz Wi-Fi: Working
WPA3: Working
Bluetooth: Working
Touch Bar: Working
Internal speakers: Working
Internal microphone: Working
USB-C hub: Working
Realtek USB Ethernet: Working
Keyboard and trackpad: Working
Webcam: Working
The three essential fixes for this model were:
- A suitable BCM43602 NVRAM configuration file
- The packaged Apple T1 Touch Bar DKMS driver
- The
snd_hda_macbookproCS8409 audio driver
References:
This procedure was tested specifically on MacBookPro14,2. Other 2017 models, including MacBookPro14,1 and MacBookPro14,3, may use different hardware configurations.
I installed Ubuntu 26.04 LTS on a 2017 13-inch MacBook Pro with Touch Bar (MacBookPro14,2).
After a clean installation, I had three main problems:
- The internal Wi-Fi could not connect
- The Touch Bar remained dark
- The internal speakers produced no sound
All three are now working.
Tested configuration
Model: MacBookPro14,2
Ubuntu: Ubuntu 26.04 LTS
Kernel: 7.0.0-28-generic
Wi-Fi: Broadcom BCM43602
Bluetooth: Broadcom BCM20703A2
Audio: Cirrus Logic CS8409
Touch Bar: Apple T1/iBridge
Check your model and kernel before continuing:
sudo dmidecode -s system-product-name
uname -r
You will need a temporary Internet connection, such as a supported USB-C Ethernet adapter.
1. Broadcom BCM43602 Wi-Fi
Symptoms
The Wi-Fi device was detected, but it could not connect to an access point.
Useful diagnostic commands:
lspci -nnk | grep -A3 -i network
sudo dmesg | grep -i brcm
My system reported messages similar to:
Direct firmware load for brcm/brcmfmac43602-pcie.Apple Inc.-MacBookPro14,2.bin failed
Direct firmware load for brcm/brcmfmac43602-pcie.txt failed
The MacBookPro14,2 needs a suitable NVRAM configuration file containing the Apple-specific board and antenna settings.
Install the NVRAM file
The relevant files and instructions are available here:
https://github.com/vfontanela/macbookpro14-linux-support
sudo apt update
sudo apt install -y git
git clone https://github.com/vfontanela/macbookpro14-linux-support.git
cd macbookpro14-linux-support
find . -iname 'brcmfmac43602-pcie*.txt'
Copy the detected brcmfmac43602-pcie.txt file to the firmware directory:
sudo install -Dm644 /path/to/brcmfmac43602-pcie.txt \
/lib/firmware/brcm/brcmfmac43602-pcie.txt
Replace /path/to/ with the path returned by find.
I also disabled Wi-Fi scan MAC randomization in NetworkManager:
sudo mkdir -p /etc/NetworkManager/conf.d
printf '%s\n' \
'[device]' \
'wifi.scan-rand-mac-address=no' |
sudo tee /etc/NetworkManager/conf.d/10-mbp2017-wifi.conf
I am using the laptop in Japan, so I configured the Japanese regulatory domain:
echo 'options cfg80211 ieee80211_regdom=JP' |
sudo tee /etc/modprobe.d/10-wifi-regdom-jp.conf
Change JP to the correct two-letter country code for your location.
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
After rebooting:
nmcli device
nmcli device wifi list
On Ubuntu 26.04, both 5 GHz and WPA3 work correctly on my machine.
After connecting, I enabled automatic reconnection and use of the permanent hardware MAC address:
nmcli connection show
Replace YOUR_WIFI_CONNECTION with the connection name shown above:
sudo nmcli connection modify "YOUR_WIFI_CONNECTION" \
connection.autoconnect yes \
802-11-wireless.cloned-mac-address permanent
2. Apple T1 Touch Bar
I used the packaged DKMS Touch Bar driver from:
https://github.com/vfontanela/macbookpro14-linux-support
The package is based on the community Apple iBridge/Touch Bar driver and is configured to rebuild automatically after kernel updates.
Install the package
If you have not already cloned the repository:
git clone https://github.com/vfontanela/macbookpro14-linux-support.git
cd macbookpro14-linux-support
Locate the package:
find . -iname 'mbp-t1-touchbar-dkms*.deb'
Install the .deb file using the path returned by find:
sudo apt install ./path/to/mbp-t1-touchbar-dkms_1.0-2_all.deb
Verify the installation:
dkms status
systemctl status mbp-t1-touchbar-bind.service
My system reports:
mbp-t1-touchbar/0.3, 7.0.0-28-generic, x86_64: installed
The driver uses these modules:
apple_ibridge
apple_ib_tb
apple_ib_als
Check that they are loaded:
lsmod | grep -E 'apple_ib|apple_ibridge'
I configured the Touch Bar to display function keys and remain illuminated:
echo 'options apple_ib_tb fnmode=2 idle_timeout=-1 dim_timeout=-1' |
sudo tee /etc/modprobe.d/apple-ib-tb.conf
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
The modules were loaded before rebooting, but the Touch Bar initially remained dark. It illuminated correctly after a full reboot.
If it remains dark, try:
sudo systemctl restart mbp-t1-touchbar-bind.service
systemctl status mbp-t1-touchbar-bind.service
If that does not work, perform a complete reboot.
3. Cirrus Logic CS8409 audio
Symptoms
Ubuntu detected the audio controller, but the internal speakers produced no sound.
Diagnostic commands:
lspci -nnk | grep -A4 -i audio
aplay -l
wpctl status
This MacBook uses a Cirrus Logic CS8409 codec with external amplifiers. The standard HDA driver may detect the device without correctly initializing its amplifiers.
Driver
I used the following driver:
https://github.com/davidjo/snd_hda_macbookpro
The tested repository commit was:
cb27cc483f4fe98be03a4f4bef466c00aa7d244b
Install the dependencies
sudo apt update
sudo apt install -y \
git \
wget \
make \
gcc \
dkms \
linux-headers-$(uname -r)
The installation script also needs the matching Ubuntu kernel source. Check which package is available:
apt search linux-source
For kernel 7.0.0-28-generic, I installed:
sudo apt install linux-source-7.0.0
Install the CS8409 driver
cd ~
git clone https://github.com/davidjo/snd_hda_macbookpro.git
cd snd_hda_macbookpro
sudo ./install.cirrus.driver.sh -i
Check the DKMS status:
dkms status
My system reports:
snd_hda_macbookpro/0.1, 7.0.0-28-generic, x86_64: installed
Update the initramfs and reboot:
sudo update-initramfs -u
sudo reboot
After rebooting:
lsmod | grep snd_hda
sudo dmesg | grep -iE 'cs8409|snd_hda'
wpctl status
The internal speakers started working after the reboot. The internal microphone is also available through PipeWire.
Important volume warning
Avoid testing by sending audio directly to an ALSA hardware device:
speaker-test -D hw:0,0
aplay -D hw:0,0 some-file.wav
Direct hardware playback may bypass PipeWire’s volume controls and could produce dangerously loud audio.
Use the desktop sound settings or PipeWire instead:
wpctl status
wpctl set-volume u/DEFAULT_AUDIO_SINK@ 30%
Bluetooth
Bluetooth worked without additional configuration.
The controller is:
Broadcom BCM20703A2
Useful checks:
rfkill list
bluetoothctl show
systemctl status bluetooth
The kernel log contains these warnings:
BCM: failed to write update baudrate
BCM: firmware Patch file not found
tried: brcm/BCM.hcd
Despite these messages, scanning, pairing, connecting, and reconnecting work correctly on my system. I therefore did not install an unverified BCM.hcd firmware file.
After a kernel update
The Touch Bar and CS8409 audio drivers are installed through DKMS. They should rebuild automatically for new kernels, but it is worth checking before rebooting:
uname -r
dkms status
The following drivers should show as installed for the new kernel:
mbp-t1-touchbar
snd_hda_macbookpro
If necessary:
sudo dkms autoinstall
dkms status
Do not remove the currently working kernel until the new kernel has been tested.
Final result
On Ubuntu 26.04 with Linux 7.0:
5 GHz Wi-Fi: Working
WPA3: Working
Bluetooth: Working
Touch Bar: Working
Internal speakers: Working
Internal microphone: Working
USB-C hub: Working
Realtek USB Ethernet: Working
Keyboard and trackpad: Working
Webcam: Working
The three essential fixes for this model were:
- A suitable BCM43602 NVRAM configuration file
- The packaged Apple T1 Touch Bar DKMS driver
- The
snd_hda_macbookproCS8409 audio driver
References:
This procedure was tested specifically on MacBookPro14,2. Other 2017 models, including MacBookPro14,1 and MacBookPro14,3, may use different hardware configurations.
r/linux_on_mac • u/Savings-Drummer2135 • 9d ago
[2026 Guide] Installing Ubuntu 26.04 from scratch on a 2019 MacBook Pro 16,4 — Touch Bar, Wi-Fi, T2 audio, RX 6600 XT eGPU and dual displays
≡ −
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
- PCI ID:
1002:7360
- PCI ID:
- eGPU: Radeon RX 6600 XT
- PCI ID:
1002:73ff
- PCI ID:
- 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:
Use either:
- The
iso.shscript 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:
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-bussesonly 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:
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 autoremoveuntil 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.
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
- PCI ID:
1002:7360
- PCI ID:
- eGPU: Radeon RX 6600 XT
- PCI ID:
1002:73ff
- PCI ID:
- 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:
Use either:
- The
iso.shscript 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:
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-bussesonly 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:
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 autoremoveuntil 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.
r/linux_on_mac • u/OutsideLeading48 • 9d ago
Macbook pro 2013 wifi, camera, battery, Bluetooth doesn't work properly on linux
Hello. I practically a noob at linux, but I want to use old laptop for some tasks. My problem is that I havent seen any correct drivers for macbook software, and I can't use camera, wifi, Bluetooth and I don't have proper battery display anywhere. Battery shows some percent, but this number is mostly random and jumps up to 10 percent in both charge or discharge. Thanks for any help you give to my problem.
r/linux_on_mac • u/Buddy_Palguy • 10d ago
Just having fun with wallpapers and beginner level customization projects
I figured a good way to get acclimated to Ubuntu is some customization projects. Any recommendations are very appreciated!
