Tutorial  Updated

How to boot Linux on your Switch

THIS GUIDE IS DEPRECATED
THIS IS BETTER https://github.com/natinusala/painless-linux


I've successfully booted ArchLinux using ShofEL2. Here is a quick guide on how to do it - I'll assume you're computer literate and know how to use a terminal / Linux commands / git.
Everything is taken from the README of the ShofEL2 repo so if you want to go even faster, go read that instead.

Thanks to NightHammer1000 and Y2K-x for the help !

There is a simplified and faster version of this tutorial available here, with precompiled binaries so you don't have to build everything : https://github.com/SoulCipher/shofel2_linux

The result

Without a SD card ("waiting for root device mmcblk0p2") : https://photos.app.goo.gl/7y6ut5ObuHMUIMZg2
Stock Arch Linux : https://photos.app.goo.gl/yALqe3zMZRe2dSQf1
Arch Linux with LXDE : https://photos.app.goo.gl/xaEgRqeSi8jvAwpz5
RetroArch running : https://photos.app.goo.gl/vBLPo5wiBto1qiUH3
Arch Linux with GNOME : https://gbatemp.net/attachments/img_0005-jpg.121608/
Arch Linux with KDE : https://gbatemp.net/attachments/img_20180427_121605-jpg.121666/

What works / what doesn't
  • Desktop environment : Gnome, LXDE, KDE
  • Wi-Fi : works
    • You will need to reboot your Switch and run the exploit again to make the Wi-Fi work (it never works on the first boot)
    • Then enter the Network Manager Application and add your network from there
    • If it doesn't work, you will need to edit the configuration on the host computer (see the additional notes at the end of this post)
    • With LXDE : Can cause a kernel panic if used at the same time as Bluetooth
  • Bluetooth : works but Joy-Cons can't be paired
  • Touch screen : works, although LXDE is not very touch-friendly
  • Audio : doesn't work yet
  • GPU acceleration : works (via mesa), with OpenGL (and maybe Vulkan too ?)
  • Joy-Cons : not recognized
  • Volume buttons : working with Gnome but not doing anything since there is no audio device
  • Power button : doesn't do anything, no sleep mode, no graceful shutdown
  • USB : doesn't work
  • Dock : not tested yet, but I bet it doesn't do anything besides charging the battery
  • Power management / battery level : working with Gnome
What you'll need
  • A computer running Linux with a blue USB SuperSpeed port, or a Mac
    • A Linux VM can work in theory, but it depends on how the USB passthrough is implemented (apparently VMWare works, VirtualBox doesn't)
  • A USB A-to-C cable (with data support, obviously)
    • be careful as cheap cables were reported to work randomly / not work at all
  • Some time (you know, Linux is kinda large)

Prep work

First, you'll need to install the required toolchains. Open this link and download the tar.gz binaries for
  • aarch64-linux-gnu
  • arm-linux-gnueabi
Be careful to choose the right architecture for your PC (for me it was x86_64 so "gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz").

Once you have them, extract them somewhere nice and add the "bin" (not "lib" as I previously stated) folder of both toolchains to your PATH ("$ export PATH=$PATH:/path/to/toolchain1/lib:/path/to/toolchain2/lib"). The building process won't work otherwise.

Then, install those dependencies (how to install them and their name might depend on your distribution) :
  • build-essential (sorry I didn't add it it was obvious to me)
  • libssl-dev
  • swig
  • bison
  • pkg-config
  • flex
  • zlib1g-dev
  • python3
  • python-dev
  • python3-pip
  • pyusb 1.0.0 : "$ sudo pip3 install pyusb==1.0.0"
  • libusb-1.0-0-dev

Compiling

Clone each required repository :

Code:
$ git clone https://github.com/fail0verflow/shofel2.git
$ git clone --recursive --depth=1 https://github.com/fail0verflow/switch-coreboot.git coreboot
$ git clone https://github.com/fail0verflow/switch-u-boot.git u-boot
$ git clone --depth=1 https://github.com/fail0verflow/switch-linux.git linux
$ git clone https://github.com/boundarydevices/imx_usb_loader.git

You can grab a coffee or two because Linux has more than 5 million files to download.

Then, build everything :

Code:
$ cd shofel2/exploit
$ make

Code:
$ cd u-boot
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make nintendo-switch_defconfig
$ make

Code:
$ cd coreboot
$ make nintendo_switch_defconfig
$ make iasl
$ make

If you have a tegra_mtc.bin file error, you'll have to extract it from a Pixel C stock image :
"$ ./build/util/cbfstool/cbfstool bootloader-dragon-google_smaug.7900.97.0.img extract -n fallback/tegra_mtc -f tegra_mtc.bin"

Or you can download it directly from here : https://0w0.st/tegra_mtc.bin (thanks to @CptPotato for uploading this)

You'll have to put it in the "coreboot/src/soc/nvidia/tegra210" directory.

Code:
$ cd imx_usb_loader
$ git reset --hard 0a322b01cacf03e3be727e3e4c3d46d69f2e343e
$ make

The big one :

Code:
$ cd linux
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make nintendo-switch_defconfig
$ make

If you encounter issues about a missing rule "/lib/firmware/nvidia/tegra210/vic04_ucode.bin" for the target "firmware" you'll have to :
  • install the firmware-misc-nonfree package
  • if you can't install it, or if it still doesn't work, download the package manually from debian sid and extract the file "/lib/firmware/nvidia/tegra210/vic04_ucode.bin" (from the root of your PC, not on the cloned repo) from the DEB (and chmod it if needed)
If you encounter issues about a missing rule "/lib/firmware/brcm/brcmfmac4356-pcie.txt", download this file and put it in "/lib/firmware/brcm/" (from the root of your PC, not on the cloned repo)

Building the rootfs

This is the annoying part. Download the archive / image corresponding to the distribution you want to use :
If it's a tarball you just downloaded

While it's downloading, you'll have to take a microSD card and, using the software of your choice (I used GParted) :
  • remove every existing partition to only have unallocated space on it (do I need to tell you that you're going to loose everything on the card ?)
  • create a tiny FAT32 partition (I chose 200mb but it doesn't matter) - that'll be mmcbkl0p1, you can label it "garbage"
  • create an ext4 partition on the remaining part of the card - that'll be mmcblk0p2, you can label it "rootfs"
  • it's important that the FAT32 partition comes first and the ext4 one comes after - on the Switch, Linux will look for mmcblk0p2, the second partition, if you have scrolling boot logs and then back to RCM it means you did it wrong
Once the rootfs tarball is downloaded, you can simple extract it to the mounting point of the ext4 partition you just created :

Code:
$ tar xvf ArchLinuxARM-aarch64-latest.tar.gz -C /mounting/point/of/ext4/partition && sync
$ cp ArchLinuxARM-aarch64-latest.tar.gz /mounting/point/of/ext4/partition/root && sync

("/mounting/point/of/ext4/partition/root" is the "root" directory on the partition)

Don't forget to properly eject the SD Card !

If "tar xvf" doesn't work for you you can install "bsdtar" and use "bsdtar -xpf" instead

Then you can put the SD card in the console.

If it's a img / bin file you just downloaded

You can simply write it on your SD card using :
  • If you're on Windows, Ether or Win32DiskImager
  • If you're on Linux / Mac OS : "sudo dd if=yourimage.img of=/dev/sdX && sync" where /dev/sdX is the device of your SD card (unmounted)
You will probably want to open a partition manager to resize the ext4 partition once it's flashed, so that it fits your SD card.

Then you can put the SD card in the console.

Booting linux

Run the exploit :

Code:
$ cd shofel2/exploit
$ sudo ./shofel2.py cbfs.bin ../../coreboot/build/coreboot.rom

Your terminal should now be waiting for the Switch to enter RCM mode.

To do so : (I don't have pictures but that's the same method as fusée gelée, just look at some video tutorials)
  • plug the Switch on your PC using the USB A-to-C cable - use a blue SuperSpeed port if you have one
  • shut it down
  • remove the right joy-con
  • using a method of your choice, short the 10th pin of the right joy-con (the last pin on the right, away from the screen, closer to the back) with the ground : that can be pin 1, 2 or 7, that can also be a screw on the joy-con rack or the console's fan - I personnaly stick a RPi jumper wire in the fan and touch the 10th pin on the other side, works everytime (like this)
  • keep the pins shorted and power the Switch while pressing the volume UP button
If it worked, the console will show a black screen and you'll see the exploit running on your terminal. If you see the Nintendo logo, it has failed. You can power off the console and try again.

Then, run those last commands :

Code:
$ cd shofel2/usb_loader
$ ../../u-boot/tools/mkimage -A arm64 -T script -C none -n "boot.scr" -d switch.scr switch.scr.img
$ sudo ../../imx_usb_loader/imx_usb -c .

Linux should then boot on your console - first the boot logs with the penguins, and then an ArchLinux login prompt. Voilà !
Again, if you have the boot logs and then a black screen, it means you did the SD card part wrong.

Additional notes

Hardware graphics acceleration


The most recents image already contain this fix.

To add mesa drivers install this package using pacman :
https://0w0.st/mesa-full-tegra-r101876.bf5e0276b6-1-aarch64.pkg.tar.xz

You will need a working internet connection to do so.

Then, use this script to choose your power profile : https://0w0.st/power.sh

Full speed RAM


According to the blog post ("Linux on Switch boot chain" section), you need to extract a file from a Pixel C factory image in order to have the RAM working at full speed. I didn't do it so I won't cover it here.

Fixing calibration issues of the touch screen (thanks to @Wizardy)

To fix calibration issues of the touch screen, edit the file /usr/share/X11/xorg.conf.d/10-evdev.confg (of the rootfs)

And change the InputClass section to :

Code:
Section "InputClass"
        Identifier "evdev touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
        Option "InvertX" "no"
        Option "InvertY" "yes"
        Option "SwapAxes" "yes"
        Option "Calibration" "0 1279 0 719"
EndSection

Wi-Fi

To setup Wi-Fi, mount the rootfs partition on your host PC and edit the configuration for your network in the file "/etc/NetworkManager/system-connections" (if it doesn't exist, take Gigaspot).

To have a working Wi-Fi you must reboot your Switch and run the exploit again each time you power it off

Moving the rootfs to another partition

If you want to move the rootfs to another partition on your SD card, edit the "shofel2/usb_loader/switch.scr" file and replace "/dev/mmcblk0p2" by the partition you want to use.
 
Last edited by natinusala,

Hadobedo

Well-Known Member
Newcomer
Joined
Dec 5, 2015
Messages
72
Trophies
0
Age
33
XP
281
Country
Canada
Does anyone know if/how you can kick on the fans manually via Linux? I've noticed that the Switch gets quite hot, and the fans would probably help lol
 
D

Deleted User

Guest
now that i have linux working on my switch , i want to connect to the switch over ssh i did set an ssh password but when i connect it tells me permission denied ?
 

RHOPKINS13

Geek
Member
Joined
Jan 31, 2009
Messages
1,354
Trophies
2
XP
2,625
Country
United States
now that i have linux working on my switch , i want to connect to the switch over ssh i did set an ssh password but when i connect it tells me permission denied ?

Do you have the SSH Daemon running in the background? Are you trying to login as "alarm" or "root"? If root, make sure that PermitRootLogin is set to yes in /etc/ssh/sshd_config.
 
D

Deleted User

Guest
Do you have the SSH Daemon running in the background? Are you trying to login as "alarm" or "root"? If root, make sure that PermitRootLogin is set to yes in /etc/ssh/sshd_config.

the /etc/ssh/sshd_config can be changed inside the switch or would i need to build linux again
 

JackMacWindows

Well-Known Member
Newcomer
Joined
Jan 16, 2016
Messages
53
Trophies
0
XP
258
Country
United States
Hi guys, I'm pretty noob to Linux, but this is the output I've been getting when using SoulCipher's GitHub repo and trying to run the exploit.

I flashed arch_lxde.zip onto a 128GB sd card using Etcher. After the output from below spits out, my screen stays black and the kernel never loads. Any ideas?

Code:
>>> Switching to cbfs mode...
sending 0x7000 bytes @0x0
sending 0x4 bytes @0xffffc
sending 0x20 bytes @0x20138
sending 0x18 bytes @0x20100
sending 0x20 bytes @0x20118
sending 0x18 bytes @0x20180
sending 0x20 bytes @0x20198
sending 0x1c bytes @0x201b8
sending 0x533e bytes @0x201d4
sending 0x100000 bytes @0x0
you have been served

Detected. Waiting 5 seconds

config file <conf//imx_usb.conf>
vid=0x0955 pid=0x701a file_name=switch.conf
config file <conf//switch.conf>
parse conf//switch.conf
conf//switch.conf: syntax error: _direct 0x8e000000
 {image/switch.scr.img:load 0x8e000000,jump_direct 0x8e000000
}
Trying to open device vid=0x0955 pid=0x701a
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename kernel/Image.gz
load_size 0 bytes
load_addr 0x83000000
dcd 0
clear_dcd 0
plug 0
jump_mode 0
jump_addr 0x00000000
== end work item
load_addr=83000000

loading binary file(kernel/Image.gz) to 83000000, skip=0, fsize=8433b7 type=0

<<<8663991, 8664064 bytes>>>
succeeded (status 0x88888888)
HAB security state: development mode (0x56787856)
== work item
filename dtb/tegra210-nintendo-switch.dtb
load_size 0 bytes
load_addr 0x8d000000
dcd 0
clear_dcd 0
plug 0
jump_mode 0
jump_addr 0x00000000
== end work item
load_addr=8d000000

loading binary file(dtb/tegra210-nintendo-switch.dtb) to 8d000000, skip=0, fsize=a040 type=0

<<<41024, 41984 bytes>>>
succeeded (status 0x88888888)
HAB security state: development mode (0x56787856)
== work item
filename image/switch.scr.img
load_size 0 bytes
load_addr 0x8e000000
dcd 0
clear_dcd 0
plug 0
jump_mode 1
jump_addr 0x00000000
== end work item
load_addr=8e000000

loading binary file(image/switch.scr.img) to 8e000000, skip=0, fsize=162 type=aa

<<<354, 1024 bytes>>>
succeeded (status 0x88888888)
jumping to 0x8e000000

Done. You should see kernel booting on switch soon

-//- kombos.org -//-
Zip files are not flashed: Etcher is for img files (disk images). You can just unzip the file into the root of your SD card and that should work.
 

Sonicbrawler

Well-Known Member
Member
Joined
Sep 7, 2015
Messages
205
Trophies
0
Age
27
XP
457
Country
United States
Been trying for a bit and kinda stuck with this.

Code:
File descriptor: 9
b'8001ff060000000408532c6401101062'
entry 400168ed
throwing more
Performing hax...
Size: 0x6c68

b'820000000000686c'
b'02000000000000000000000000000000a0f20e0100000000716c000000000000000000000000000000000000000000000f0f00000000000000'
URB address: 0x10ed6f0
URB status: -2
b'CBFS\n'
>>> Switching to cbfs mode...
sending 0x7000 bytes @0x0
sending 0x4 bytes @0xffffc
sending 0x20 bytes @0x20138
sending 0x18 bytes @0x20100
sending 0x20 bytes @0x20118
sending 0x18 bytes @0x20180
sending 0x20 bytes @0x20198
sending 0x1c bytes @0x201b8
sending 0x533e bytes @0x201d4
sending 0x100000 bytes @0x0
you have been served
Exception ignored in: <bound method _Initializer.__del__ of <usb.backend.libusb1._Initializer object at 0x7f36001a2780>>
Traceback (most recent call last):
  File "/home/mizumi/shofel2_linux/usb/backend/libusb1.py", line 436, in __del__
AttributeError: 'NoneType' object has no attribute 'libusb_exit'

Detected. Waiting 5 seconds

config file <conf//imx_usb.conf>
vid=0x0955 pid=0x701a file_name=switch.conf
no matching USB device found

Done. You should see kernel booting on switch soon

not too sure how to go about this.

still having this issue. i keep thinking its something to do with libusb but i have it installed, so it might not be the issue
 

Dakota_Pixel

Member
Newcomer
Joined
Feb 22, 2018
Messages
10
Trophies
0
XP
94
Country
United States
can someone tell me why this isn't working.
i am using a vmwere Ubuntu with an sd card imaged using the shofel2_linux guide and i have pyusb and python working.
my switch jig is just a wire, but it works and i know it works because my vm says nividia thing is plugged into my pc and i switch it to my vm from the host.
i run the sudo ./boot_linux.sh code in the terminal that is opened in the file i need and it spits out this
1) Turn off Switch
2) Ground right JoyCon rail PIN10 using paperclip JIG or JoyCon mod
3) Press VOL+ and connect USB cable to the Switch
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-
Waiting for NVidia APX (Switch in RCM mode).
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-

Traceback (most recent call last):
File "./shofel2.py", line 8, in <module>
import usb.core
ModuleNotFoundError: No module named 'usb'

Detected. Waiting 5 seconds

config file <conf//imx_usb.conf>
vid=0x0955 pid=0x701a file_name=switch.conf
no matching USB device found

Done. You should see kernel booting on switch soon

-//- kombos.org -//-
and nothing happens, but it is still on the black screen in the usb recovery mode
(PS: sorry for my horrible wording i can`t type sometimes)
 
D

Deleted User

Guest
can someone tell me why this isn't working.
i am using a vmwere Ubuntu with an sd card imaged using the shofel2_linux guide and i have pyusb and python working.
my switch jig is just a wire, but it works and i know it works because my vm says nividia thing is plugged into my pc and i switch it to my vm from the host.
i run the sudo ./boot_linux.sh code in the terminal that is opened in the file i need and it spits out this
1) Turn off Switch
2) Ground right JoyCon rail PIN10 using paperclip JIG or JoyCon mod
3) Press VOL+ and connect USB cable to the Switch
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-
Waiting for NVidia APX (Switch in RCM mode).
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-

Traceback (most recent call last):
File "./shofel2.py", line 8, in <module>
import usb.core
ModuleNotFoundError: No module named 'usb'

Detected. Waiting 5 seconds

config file <conf//imx_usb.conf>
vid=0x0955 pid=0x701a file_name=switch.conf
no matching USB device found

Done. You should see kernel booting on switch soon

-//- kombos.org -//-
and nothing happens, but it is still on the black screen in the usb recovery mode
(PS: sorry for my horrible wording i can`t type sometimes)

check your pid and change it inside the conf file
 

Type_O_Dev

Developer
Developer
Joined
Dec 12, 2017
Messages
683
Trophies
0
XP
1,469
Country
United States
now that i have linux working on my switch , i want to connect to the switch over ssh i did set an ssh password but when i connect it tells me permission denied ?
VNC Server
sudo pacman -S vncserver
$ vncserver
then kill
$ vncserver -kill :1
then run
$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd
 

Hydr8gon

Dragon Trainer
Developer
Joined
Dec 15, 2014
Messages
316
Trophies
1
Website
hydr8gon.github.io
XP
2,580
Country
Canada
can someone tell me why this isn't working.
i am using a vmwere Ubuntu with an sd card imaged using the shofel2_linux guide and i have pyusb and python working.
my switch jig is just a wire, but it works and i know it works because my vm says nividia thing is plugged into my pc and i switch it to my vm from the host.
i run the sudo ./boot_linux.sh code in the terminal that is opened in the file i need and it spits out this
1) Turn off Switch
2) Ground right JoyCon rail PIN10 using paperclip JIG or JoyCon mod
3) Press VOL+ and connect USB cable to the Switch
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-
Waiting for NVidia APX (Switch in RCM mode).
-=-=--=--=--=-=-=-=-=--=-=-=-=-=-=-=-=--=-=-

Traceback (most recent call last):
File "./shofel2.py", line 8, in <module>
import usb.core
ModuleNotFoundError: No module named 'usb'

Detected. Waiting 5 seconds

config file <conf//imx_usb.conf>
vid=0x0955 pid=0x701a file_name=switch.conf
no matching USB device found

Done. You should see kernel booting on switch soon

-//- kombos.org -//-
and nothing happens, but it is still on the black screen in the usb recovery mode
(PS: sorry for my horrible wording i can`t type sometimes)
Do you have libusb installed?
Code:
sudo apt install libusb-1.0-0-dev
Also make sure you have pyusb installed for Python 3, and not a different version.
Code:
sudo pip3 install pyusb
 

RHOPKINS13

Geek
Member
Joined
Jan 31, 2009
Messages
1,354
Trophies
2
XP
2,625
Country
United States
A small note on the instructions. I recently tried setting up the "Arch with H/W Accel., Chromium, and sudo" rootfs using my Linux system. It comes as a zip file with a .bin file inside.

If it's a img / bin file you just downloaded

You can simply write it on your SD card using :
  • If you're on Windows, Ether or Win32DiskImager
  • If you're on Linux / Mac OS : "sudo dd if=yourimage.img of=/dev/sdbX" where /dev/sdbX is the device of your SD card (unmounted)
You will probably want to open a partition manager to resize the ext4 partition once it's flashed, so that it fits your SD card.

Then you can put the SD card in the console.

Not sure about any of the other images, but that particular image has the full partition table from what appears to be an 8 gig card. If you try to write it to the 2nd partition:
Code:
sudo dd if=arch_lxde.bin of=/dev/sdb2

...you will end up with a partition with an unrecognized type, and it will fail to boot. I had to write it straight to sdb instead (actually, on my system it's mmcblk0, but you get the idea.) A small nuisance is that the included FAT32 partition has already been used with another Switch, so you'll have to clear that if you don't want Horizon to complain about it. Also, if you wanted a bigger FAT32 partition (I have a 128gb microSD that I wanted to split 64GB Switch / 64GB Linux), you have to move stuff around with GParted afterwards and it takes much longer than if you were able to just write the image straight to the 2nd partition.

If I sound like I'm ranting, I really don't mean to. Just wanted to get this out there.
 

J-Lit

Member
Newcomer
Joined
May 1, 2018
Messages
9
Trophies
0
Age
30
XP
63
Country
United States
Zip files are not flashed: Etcher is for img files (disk images). You can just unzip the file into the root of your SD card and that should work.

My problem right now is that I can't even get linux onto the switch. Once the "Done. You should see kernel booting on switch soon" after the seemingly successful message comes up my screen stays dark. I can't even get it to the "waiting for root device sdmmcblk0p2" phase without the SD card in as seen in op. I've tried four different usb a to c cables, so I'm convinced my computer is just ass.
 

SapphireExile

Sapphire
Member
Joined
May 2, 2018
Messages
118
Trophies
0
Age
28
Location
Bartow, FL
Website
sapphirelabs.online
XP
495
Country
United States
Just built and loaded the latest 18.04 Ubuntu onto my Switch, and can confirm that everything is working besides a strange bug with the settings menu, that becomes non-interactive on the touchscreen. Still works properly over VNC.

I can probably upload the tar for 18.04 if anyone wants it. It's slightly more up to date than the one in the repo.
 

lordelan

Well-Known Member
Member
Joined
Jan 4, 2015
Messages
5,798
Trophies
1
Age
44
XP
6,562
Country
Germany
Just built and loaded the latest 18.04 Ubuntu onto my Switch, and can confirm that everything is working besides a strange bug with the settings menu, that becomes non-interactive on the touchscreen. Still works properly over VNC.

I can probably upload the tar for 18.04 if anyone wants it. It's slightly more up to date than the one in the repo.
What are you waiting for? :)
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • No one is chatting at the moment.
    SylverReZ @ SylverReZ: https://www.youtube.com/watch?v=ZokeA2lKB6o