Skip to content

Instantly share code, notes, and snippets.

@htruong
Last active August 28, 2024 12:58
Show Gist options
  • Save htruong/7df502fb60268eeee5bca21ef3e436eb to your computer and use it in GitHub Desktop.
Save htruong/7df502fb60268eeee5bca21ef3e436eb to your computer and use it in GitHub Desktop.
Chroot to pi sd card
#!/bin/bash
# This script allows you to chroot ("work on")
# the raspbian sd card as if it's the raspberry pi
# on your Ubuntu desktop/laptop
# just much faster and more convenient
# credits: https://gist.github.com/jkullick/9b02c2061fbdf4a6c4e8a78f1312a689
# make sure you have issued
# (sudo) apt install qemu qemu-user-static binfmt-support
# Write the raspbian image onto the sd card,
# boot the pi with the card once
# so it expands the fs automatically
# then plug back to your laptop/desktop
# and chroot to it with this script.
# Invoke:
# (sudo) ./chroot-to-pi.sh /dev/sdb
# assuming /dev/sdb is your sd-card
# if you don't know, when you plug the card in, type:
# dmesg | tail -n30
# Note: If you have an image file instead of the sd card,
# you will need to issue
# (sudo) apt install kpartx
# (sudo) kpartx -v -a 2017-11-29-raspbian-stretch-lite.img
# then
# (sudo) ./chroot-to-pi.sh /dev/mapper/loop0p
# With the vanilla image, you have very little space to work on
# I have not figured out a reliable way to resize it
# Something like this should work, but it didn't in my experience
# https://gist.github.com/htruong/0271d84ae81ee1d301293d126a5ad716
# so it's better just to let the pi resize the partitions
mkdir -p /mnt/raspbian
# mount partition
mount -o rw ${1}2 /mnt/raspbian
mount -o rw ${1}1 /mnt/raspbian/boot
# mount binds
mount --bind /dev /mnt/raspbian/dev/
mount --bind /sys /mnt/raspbian/sys/
mount --bind /proc /mnt/raspbian/proc/
mount --bind /dev/pts /mnt/raspbian/dev/pts
# ld.so.preload fix
sed -i 's/^/#CHROOT /g' /mnt/raspbian/etc/ld.so.preload
# copy qemu binary
cp /usr/bin/qemu-arm-static /mnt/raspbian/usr/bin/
echo "You will be transferred to the bash shell now."
echo "Issue 'exit' when you are done."
echo "Issue 'su pi' if you need to work as the user pi."
# chroot to raspbian
chroot /mnt/raspbian /bin/bash
# ----------------------------
# Clean up
# revert ld.so.preload fix
sed -i 's/^#CHROOT //g' /mnt/raspbian/etc/ld.so.preload
# unmount everything
umount /mnt/raspbian/{dev/pts,dev,sys,proc,boot,}
@SX-9
Copy link

SX-9 commented Apr 16, 2023

sudo ./pi-chroot /dev/sdc

You will be transferred to the bash shell now.
Issue 'exit' when you are done.
Issue 'su pi' if you need to work as the user pi.
chroot: failed to run command ‘/bin/bash’: Exec format error

i have a feeling i got this error since im running it on arch linux and binfmt-support is not avaible in arch

@cinderblock
Copy link

@SX-9 Are you sure you got qemu working? There are some checks you can use here to see some more about what isn't setup properly.

@kelvie
Copy link

kelvie commented Jul 17, 2023

If anyone on arch is trying this, you can basically just install qemu-user-static-binfmt and just run sudo arch-chroot . on the rootfs (optionally mounting boot first).

@viniciusbo
Copy link

For those using Gentoo, make sure you've built qemu package with static-user and QEMU_SOFTMMU_TARGETS: arm QEMU_USER_TARGETS: arm. Further info in the official handbook: https://wiki.gentoo.org/wiki/Embedded_Handbook/General/Compiling_with_QEMU_user_chroot

@BoManev
Copy link

BoManev commented Feb 8, 2024

Alternative to dmesg | tail -n30

  • lsblk -o NAME,MOUNTPOINT
  • check the mount in /media/<user_name>/

@patrickelectric
Copy link

You rock! Just tested the script in a Rasp Pi 4 and it worked like magic!

@htruong
Copy link
Author

htruong commented Jun 8, 2024

Alternative to dmesg | tail -n30

  • lsblk -o NAME,MOUNTPOINT
  • check the mount in /media/<user_name>/

I learned this neat trick, if you do dmesg -w and then plug the drive in, you'll be able to watch the dmesg in real-time!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment