-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathba9de945.766f77d1.js
1 lines (1 loc) · 22.7 KB
/
ba9de945.766f77d1.js
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{162:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return s})),a.d(t,"default",(function(){return l}));var n=a(2),r=a(9),o=(a(0),a(173)),i={id:"usb_booting",title:"Boot Raspberry Pi From USB SSD"},b={id:"usb_booting",title:"Boot Raspberry Pi From USB SSD",description:"!USB Booting",source:"@site/docs/usb-booting.md",permalink:"/docs/usb_booting",editUrl:"https://github.com/raspbernetes/docs/edit/master/website/docs/usb-booting.md",sidebar:"someSidebar",previous:{title:"Encrypt Secrets",permalink:"/docs/encrypt_secrets"},next:{title:"CIS Benchmark",permalink:"/docs/cis-benchmark"}},s=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Booting Raspberry Pi via USB SSD",id:"booting-raspberry-pi-via-usb-ssd",children:[{value:"Testing Equipment",id:"testing-equipment",children:[]},{value:"Updating Pi Firmware",id:"updating-pi-firmware",children:[]},{value:"Setting Up our SSD for use with USB Booting",id:"setting-up-our-ssd-for-use-with-usb-booting",children:[]},{value:"Wrapping Up",id:"wrapping-up",children:[]},{value:"Appendix",id:"appendix",children:[]}]}],c={rightToc:s};function l(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},c,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,Object(o.b)("img",Object(n.a)({parentName:"p"},{src:"https://github.com/raspbernetes/raspbernetes.github.io/raw/master/img/usb-boot.png",alt:"USB Booting",title:"USB Booting"}))),Object(o.b)("p",null,"While SD cards are the most standard method of booting a Raspberry Pi, they are not always suitable for applications that require rapid ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://en.wikipedia.org/wiki/Input/output"}),"I/O")," or lots of I/O. Booting from USB is a feature that aims to help fix these two problems, in addition to inceasing the longevity of your storage."),Object(o.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-heading"}),Object(o.b)("h5",{parentName:"div"},Object(o.b)("span",Object(n.a)({parentName:"h5"},{className:"admonition-icon"}),Object(o.b)("svg",Object(n.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"}),Object(o.b)("path",Object(n.a)({parentName:"svg"},{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})))),"warning")),Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-content"}),Object(o.b)("p",{parentName:"div"},'Please proceed at your own risk. While I personally have not seen a case in which a Raspberry Pi has become "bricked" or inoperable, it is important to keep in mind that when you are altering the ',Object(o.b)("inlineCode",{parentName:"p"},"EEPROM"),' you may experience a loss of data or a non-bootable system. We are not responsible/liable if you use this beta software and "brick" your Pi!'))),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Raspberry Pi (In this example we will be using a Raspberry Pi 4, 4GB)"),Object(o.b)("li",{parentName:"ul"},"USB to SATA adapter",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"See ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"#USBs"}),"Known Working USB to SATA Adapters")))),Object(o.b)("li",{parentName:"ul"},"SATA SSD",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"SSDs are recommended for this beacuse they have lower power requirements and are much faster that typical HDDs"),Object(o.b)("li",{parentName:"ul"},"See ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"#SSDs"}),"Known Working SSDs")))),Object(o.b)("li",{parentName:"ul"},"SD Card"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://ubuntu.com/download/raspberry-pi"}),"Ubuntu 20.04")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2020-05-28/2020-05-27-raspios-buster-arm64.zip"}),"Raspberry Pi OS"),Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Link is to 64 bit which is still in Beta as of this writing.")))),Object(o.b)("h2",{id:"booting-raspberry-pi-via-usb-ssd"},"Booting Raspberry Pi via USB SSD"),Object(o.b)("h3",{id:"testing-equipment"},"Testing Equipment"),Object(o.b)("p",null,"Before we start it is important to verify that your equipment is functioning correctly. We can do this by first flashing our SD card with ",Object(o.b)("em",{parentName:"p"},"Raspberry Pi OS")," and running it on our Pi. For brevity I will be omitting the process of flashing the SD card since this is a more Advanced guide. If you need help with this, please see ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://raspbernetes.github.io/docs/installation"}),"Installation"),"."),Object(o.b)("p",null,"Once you have booted into Raspberry Pi OS, feel free to connect your SSD to the USB to SATA adapter and plug it into the Pi. I have witnessed issues when using the USB 2.0 ports (the ports that are black), so please use the USB 3.0 ports (blue). After it is plugged in, verify that you can see the drive:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"lsblk\n")),Object(o.b)("p",null,"The output from this command should show you a block device, most likely called ",Object(o.b)("inlineCode",{parentName:"p"},"sda")," or something prefaced with ",Object(o.b)("inlineCode",{parentName:"p"},"sd"),". If you don't see your USB SSD immediately, try switching to the other 3.0 USB port, or trying a different USB to SATA cable/adapter."),Object(o.b)("p",null,"Once your disk is detected we've confirmed that it is useable by the Pi, so it is safe to disconnect the drive from the Pi."),Object(o.b)("p",null,"Awesome! Our disk is detected. Now we move on to the technical stuff..."),Object(o.b)("h3",{id:"updating-pi-firmware"},"Updating Pi Firmware"),Object(o.b)("h4",{id:"update-raspberry-pi-os"},"Update Raspberry Pi OS"),Object(o.b)("p",null,"While your Pi is still booted to Raspberry Pi OS, run a full update on the SD card's OS:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo apt update\nsudo apt full-upgrade -y\n")),Object(o.b)("h4",{id:"start-flashing-usb-ssd"},"Start Flashing USB SSD"),Object(o.b)("p",null,"While the update is running, we can go ahead and flash the Ubuntu image onto our SSD. Feel free to unplug it from the Pi and image it how you see fit. It can take a little while, best to get it going while doing other things."),Object(o.b)("h4",{id:"change-bootloader-branch"},"Change Bootloader Branch"),Object(o.b)("p",null,"With your freshly updated Rasberry Pi OS run the following to check your current bootloader version, making note of the returned version:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"vcgencmd bootloader_version\n")),Object(o.b)("p",null,"Switch the EEPROM firmware branch:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo echo 'FIRMWARE_RELEASE_STATUS=\"stable\"' > /etc/default/rpi-eeprom-update\n")),Object(o.b)("h4",{id:"update-pi-bootloader-settings"},"Update Pi Bootloader Settings"),Object(o.b)("p",null,"Replace the current bootloader configuration settings with the beta ones that allow for USB booting:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-06-15.bin\n")),Object(o.b)("p",null,"This command will prompt you to reboot, so we can do so:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo reboot now\n")),Object(o.b)("h4",{id:"verify-bootloader-firmware-version"},"Verify Bootloader Firmware Version"),Object(o.b)("p",null,"Once you're booted back to the SD card on Raspberry Pi OS, check the bootloader version once again:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"vcgencmd bootloader_version\n")),Object(o.b)("p",null,"This version should be different from the one that was reported before our ",Object(o.b)("inlineCode",{parentName:"p"},"rpi-eeprom-update")," command."),Object(o.b)("p",null,"Congratulations, your Pi is now able to boot from USB! However, we aren't quite there yet."),Object(o.b)("h3",{id:"setting-up-our-ssd-for-use-with-usb-booting"},"Setting Up our SSD for use with USB Booting"),Object(o.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-heading"}),Object(o.b)("h5",{parentName:"div"},Object(o.b)("span",Object(n.a)({parentName:"h5"},{className:"admonition-icon"}),Object(o.b)("svg",Object(n.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(o.b)("path",Object(n.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"note")),Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-content"}),Object(o.b)("p",{parentName:"div"},"I personally found this part easier to do from our Raspberry Pi that I just got done flashing the firmware on. For that reason this section will be written from that perspective, but this should be possible using any Linux-based system."))),Object(o.b)("h4",{id:"drop-in-pi-specific-firmware"},"Drop in Pi-Specific Firmware"),Object(o.b)("p",null,"Plug in your SSD that has been flashed with Ubuntu 20.04. The ",Object(o.b)("inlineCode",{parentName:"p"},"system-boot")," and ",Object(o.b)("inlineCode",{parentName:"p"},"writeable")," partitions should automatically be mounted to ",Object(o.b)("inlineCode",{parentName:"p"},"/media/pi/system-boot")," and ",Object(o.b)("inlineCode",{parentName:"p"},"/media/pi/writeable"),", respectively."),Object(o.b)("p",null,"Change directory to ",Object(o.b)("inlineCode",{parentName:"p"},"system-boot"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"cd /media/pi/system-boot\n")),Object(o.b)("p",null,"Run the following ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://gist.github.com/atomicstack/9c43e452c4b7cefb37c1e78f65b0b1fa"}),"one-liner")," to patch the bootloader on our SSD with the applicable Pi firmware:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'wget $( wget -qO - https://github.com/raspberrypi/firmware/tree/master/boot | perl -nE \'chomp; next unless /[.](elf|dat)/; s/.*href="([^"]+)".*/$1/; s/blob/raw/; say qq{https://github.com$_}\' )\n')),Object(o.b)("h4",{id:"dealing-with-compressed-kernel"},"Dealing with Compressed Kernel"),Object(o.b)("p",null,"Copy the compressed Linux kernel to your home directory:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"cp /media/pi/system-boot/vmlinuz ~/\n")),Object(o.b)("p",null,"Decompress the Linux kernel:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"zcat ~/vmlinuz > ~/vmlinux\n")),Object(o.b)("p",null,"Copy the decompressed kernel to ",Object(o.b)("inlineCode",{parentName:"p"},"system-boot"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"cp ~/vmlinux /media/pi/system-boot/\n")),Object(o.b)("p",null,"Next create a script that will automatically decompress the kernel so that we can reboot the Pi without having to do the previous steps manually every boot:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'cat <<\'EOF\' >/media/pi/system-boot/auto_decompress_kernel\n#!/bin/bash -e\n\n#Set Variables\nBTPATH=/boot/firmware\nCKPATH=$BTPATH/vmlinuz\nDKPATH=$BTPATH/vmlinux\n\n#Check if compression needs to be done.\nif [ -e $BTPATH/check.md5 ]; then\n if md5sum --status --ignore-missing -c $BTPATH/check.md5; then\n echo -e "\\e[32mFiles have not changed, Decompression not needed\\e[0m"\n exit 0\n else echo -e "\\e[31mHash failed, kernel will be compressed\\e[0m"\n fi\nfi\n\n#Backup the old decompressed kernel\nmv $DKPATH $DKPATH.bak\n\nif [ ! $? == 0 ]; then\n echo -e "\\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\\e[0m"\n exit 1\nelse echo -e "\\e[32mDecompressed kernel backup was successful\\e[0m"\nfi\n\n#Decompress the new kernel\necho "Decompressing kernel: "$CKPATH".............."\n\nzcat $CKPATH > $DKPATH\n\nif [ ! $? == 0 ]; then\n echo -e "\\e[31mKERNEL FAILED TO DECOMPRESS!\\e[0m"\n exit 1\nelse\n echo -e "\\e[32mKernel Decompressed Succesfully\\e[0m"\nfi\n\n#Hash the new kernel for checking\nmd5sum $CKPATH $DKPATH > $BTPATH/check.md5\n\nif [ ! $? == 0 ]; then\n echo -e "\\e[31mMD5 GENERATION FAILED!\\e[0m"\n else echo -e "\\e[32mMD5 generated Succesfully\\e[0m"\nfi\n\n#Exit\nexit 0\nEOF\n')),Object(o.b)("p",null,"Create an ",Object(o.b)("inlineCode",{parentName:"p"},"apt")," hook that decompresses the kernel on updates:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'cat <<EOF >/media/pi/writeable/etc/apt/apt.conf.d/999_decompress_rpi_kernel\nDPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };\nEOF\n')),Object(o.b)("p",null,"Make this hook executeable:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo chmod +x /media/pi/writeable/etc/apt/apt.conf.d/999_decompress_rpi_kernel\n")),Object(o.b)("h4",{id:"alter-the-bootloader-config"},"Alter the Bootloader Config"),Object(o.b)("p",null,"Edit the bootloader config in the ",Object(o.b)("inlineCode",{parentName:"p"},"[rpi4]")," section to look like this:"),Object(o.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-heading"}),Object(o.b)("h5",{parentName:"div"},Object(o.b)("span",Object(n.a)({parentName:"h5"},{className:"admonition-icon"}),Object(o.b)("svg",Object(n.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(o.b)("path",Object(n.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"note")),Object(o.b)("div",Object(n.a)({parentName:"div"},{className:"admonition-content"}),Object(o.b)("p",{parentName:"div"},"It may be necessary to make an additional parameter if your USB storage is uncharacteristically slow. Just uncomment the ",Object(o.b)("inlineCode",{parentName:"p"},"boot_delay")," parameter."))),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"[pi4]\nmax_framebuffers=2\ndtoverlay=vc4-fkms-v3d\n#boot_delay\nkernel=vmlinux\ninitramfs initrd.img followkernel\n")),Object(o.b)("h3",{id:"wrapping-up"},"Wrapping Up"),Object(o.b)("p",null,"Whew, that was a lot of stuff to do just to make our SSD image bootable! But that's all. From here I suggest shutting down the Pi:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo shutdown now\n")),Object(o.b)("p",null,"Once the Pi is powered off, remove your SD card, double check to make sure your USB SSD is properly seated, and power it back on."),Object(o.b)("p",null,"Your system should now boot from the USB SSD."),Object(o.b)("h4",{id:"verify-ssd-boot"},"Verify SSD Boot"),Object(o.b)("p",null,"After it's booted give it a minute or so for ",Object(o.b)("inlineCode",{parentName:"p"},"cloud-init")," to complete, and log in with username and password ",Object(o.b)("inlineCode",{parentName:"p"},"ubuntu"),". It will prompt for a password change upon login. From here, we can check to make sure the SSD is mounted properly:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"df -h\nFilesystem Size Used Avail Use% Mounted on\n...\n/dev/sda2 110G 2.1G 104G 2% /\n...\n/dev/sda1 253M 157M 96M 63% /boot/firmware\n...\n")),Object(o.b)("h5",{id:"install-updates"},"Install Updates"),Object(o.b)("p",null,"Go ahead and install updates for Ubuntu and reboot:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo apt update && sudo apt full-upgrade -y\n")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"sudo reboot now\n")),Object(o.b)("h5",{id:"verify-reboots-are-working"},"Verify Reboots are Working"),Object(o.b)("p",null,"When your host has rebooted, just make sure it boots back into Ubuntu. If it hangs or doesn't make it to the OS, there is something wrong. Feel free to reach out to folks on the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://discord.gg/RGvKzVg"}),"Discord")," if you run into trouble."),Object(o.b)("h3",{id:"appendix"},"Appendix"),Object(o.b)("h4",{id:"relevant-links"},"Relevant Links"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md#usbmassstorageboot"}),"https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md#usbmassstorageboot")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.raspberrypi.org/forums/viewtopic.php?t=278791"}),"https://www.raspberrypi.org/forums/viewtopic.php?t=278791")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.jeffgeerling.com/blog/2020/im-booting-my-raspberry-pi-4-usb-ssd"}),"https://www.jeffgeerling.com/blog/2020/im-booting-my-raspberry-pi-4-usb-ssd")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://gist.github.com/atomicstack/9c43e452c4b7cefb37c1e78f65b0b1fa"}),"https://gist.github.com/atomicstack/9c43e452c4b7cefb37c1e78f65b0b1fa")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.maketecheasier.com/boot-raspberry-pi-4-from-usb/"}),"https://www.maketecheasier.com/boot-raspberry-pi-4-from-usb/"))),Object(o.b)("h4",{id:"products"},"Products"),Object(o.b)("p",null,"A list of products that have been known to work, verified by our Discord community. If you're using different equipment with success, please make a PR to list it!"),Object(o.b)("h5",{id:"ssds"},"SSDs"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.amazon.com/gp/product/B01N6JQS8C/ref=ppx_yo_dt_b_asin_title_o03_s01?ie=UTF8&psc=1"}),"Kingston SA400S37"))),Object(o.b)("h5",{id:"usbs"},"USBs"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.amazon.com/gp/product/B00HJZJI84/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1"}),"StarTech USB3S2SAT3CB")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.bestbuy.com/site/insignia-2-5-serial-ata-hard-drive-enclosure-black/5820005.p?skuId=5820005"}),"Insignia NS-PCHD235"))))}l.isMDXComponent=!0},173:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return m}));var n=a(0),r=a.n(n);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function b(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var c=r.a.createContext({}),l=function(e){var t=r.a.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):b(b({},t),e)),a},p=function(e){var t=l(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=l(a),d=n,m=p["".concat(i,".").concat(d)]||p[d]||u[d]||o;return a?r.a.createElement(m,b(b({ref:t},c),{},{components:a})):r.a.createElement(m,b({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var b={};for(var s in t)hasOwnProperty.call(t,s)&&(b[s]=t[s]);b.originalType=e,b.mdxType="string"==typeof e?e:n,i[1]=b;for(var c=2;c<o;c++)i[c]=a[c];return r.a.createElement.apply(null,i)}return r.a.createElement.apply(null,a)}d.displayName="MDXCreateElement"}}]);