[QUICK TUTO] How to boot Linux on your Switch

natinusala Apr 24, 2018.

  1. natinusala

    natinusala Win32 error 31 is not an error

    Dec 1, 2012
    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


    Clone each required repository :

    $ 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 :

    $ cd shofel2/exploit
    $ make
    $ cd u-boot
    $ export CROSS_COMPILE=aarch64-linux-gnu-
    $ make nintendo-switch_defconfig
    $ make
    $ 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.

    $ cd imx_usb_loader
    $ git reset --hard 0a322b01cacf03e3be727e3e4c3d46d69f2e343e
    $ make
    The big one :

    $ 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 :

    $ 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 :

    $ 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 :

    $ 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 :

    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 :

    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"

    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, May 6, 2018
    globalc, MissingNo._, yanagi and 48 others like this.
  2. Jokey_Carrot

    Jokey_Carrot professional retard

    Oct 23, 2017
    United Kingdom
    quick tutorial very quick
    Hondyn, nmkd, Centergaming and 16 others like this.
  3. PatrickJr

    PatrickJr GBAtemp Regular

    Jan 5, 2017
    Got some screenshots of you in Arch?
  4. KeyZiro

    KeyZiro GBAtemp Regular

    Oct 21, 2016
    Can i use a 2.0 USB port ?
    Ghost92 and Mnecraft368 like this.
  5. Baoulettes

    Baoulettes The lonely man

    May 25, 2011
    ''...jumper wire in the fan and touch the 10th pin on the other side, works everytime''

    mind explaining I have trouble picturing it ? Oo
  6. NightStorm1000

    NightStorm1000 GBAtemp Regular

    Mar 2, 2015
    Currently building a Debian ARM64 Image with GNOME because you cant login without a UART Serial Connection to the Switch right now.
    Will post the RootFS when Finished.
    RHOPKINS13 and CptPotato like this.
  7. GerbilSoft

    GerbilSoft GBAtemp Addict

    Mar 8, 2012
    United States
    drenal, survive9, Ghost92 and 2 others like this.
  8. Traiver

    Traiver GBAtemp Maniac

    Aug 1, 2014
    United States
    So instead of using Linux with only USB 2.0 ports, you could install a VM with Mac OS X or a portable USB stick
  9. KeyZiro

    KeyZiro GBAtemp Regular

    Oct 21, 2016
  10. Natehaxx

    Natehaxx GBAtemp Maniac

    Jul 26, 2017
    Let me Know when its online
  11. GerbilSoft

    GerbilSoft GBAtemp Addict

    Mar 8, 2012
    United States
    If it has USB passthru, potentially. Depends on how the VM's USB passthru is handled.
  12. Duo8

    Duo8 GBAtemp Psycho!

    Jul 16, 2013
    IIRC Arch ARM sd images have the rootfs as the 2nd partition. So you could just take any armv8 image and flash to a SD and use that.
    You could also write the compiled kernel to sd and have uboot boot from it.
  13. Leonidas87

    Leonidas87 GBAtemp Advanced Fan

    Jul 15, 2014
    Toronto, Ontario
    Would be nice to see someone come up with an all in one program to run and do all the commands. Something similar to a jailbreak method.

    I think that would be really nice in the end to make things as simple as possible in the near future.
  14. Duo8

    Duo8 GBAtemp Psycho!

    Jul 16, 2013
    Or just distribute prebuilt binaries.
    Compiling linux takes forever.
  15. Leonidas87

    Leonidas87 GBAtemp Advanced Fan

    Jul 15, 2014
    Toronto, Ontario
    This tutorial seems more captured to installing Linux on a Linux system. Could we possibly get details on. Specifically installing Linux on the switch from mac?

    — Posts automatically merged - Please don't double post! —

    I have apple high Sierra running on my surface pro 2017 so i would probably do this with that system.

    — Posts automatically merged - Please don't double post! —

    Th install method does seem a bit complicated, should be simplified all in due time. Appreciate all the hard work by everyone. Things are developing so quickly. Just wondering can we not get homebrew running somehow with this instead of Linux or no?
  16. realjumy

    realjumy Ratkid hunter

    Apr 24, 2018
    United Kingdom
    Anyone else is having the following error?

    *** Your GCC is older than 6.0 and is not supported
    arch/arm/config.mk:69: recipe for target 'checkgcc6' failed
    make: *** [checkgcc6] Error 1

    I tried installing gcc-7 but still having the same problem.

    EDIT: I also installed with gcc-6, still same problem. There's something I'm doing wrong...
    Last edited by realjumy, Apr 24, 2018
  17. Selim873

    Selim873 Nunnayobeesnes

    Jul 31, 2010
    United States
    Chillin' with Bob Ross
    I'm definitely going to try this in a few days when I have time. Thanks for writing this!! Though I hope Android gets ported with full support for all the hardware. I would never need homebrew on Switch, I could just switch between Horizon and Android depending on my needs. lol Though hopefully it can be possible to run the exploit from an Android phone eventually.
  18. Cyberevan

    Cyberevan Advanced Member

    Oct 16, 2014
    Manila, Philippines
    Can I also use Type C to Type C cable? My PC has a type c port.
  19. ehnoah

    ehnoah GBAtemp Advanced Fan

    Oct 9, 2012
    arm-linux-gnueabi-gcc -march=armv4t -mthumb -Wall -Werror -Os -MMD -ffreestanding -fno-common    -fomit-frame-pointer -nostdlib -fno-builtin-printf -fno-asynchronous-unwind-tables -fPIE -fno-builtin -fno-exceptions -Wl,--no-dynamic-linker,--build-id=none,-T,romhax.ld -std=gnu11 -c -o obj/cbfs.o cbfs.c
    make: arm-linux-gnueabi-gcc: Command not found
    Makefile:23: recipe for target 'obj/cbfs.o' failed
    make: *** [obj/cbfs.o] Error 127
    My path: export PATH=$PATH:/home/pega/aarch64/lib:/home/pega/gnuabi/lib

    Ubuntu 17.10
  20. Duo8

    Duo8 GBAtemp Psycho!

    Jul 16, 2013
    PATH needs to point to the bin folder, not lib
Quick Reply
Draft saved Draft deleted