Debootstrap
On debian based systems, you can manually initialize an installation using debootstrap.
This whole process takes half an hour or so (depending on network bandwidth and disk setup, direct to sd-card will be slower), and will result in a 250MB root filesystem, or a 80MB tarball,
Pre-requisites
- A debian based distribution.
- package debootstrap
- package qemu-user-static if you are doing this from a different architecture
It is assumed that your target filesystem is mounted in /mnt
Also, figure out which distribution version you wish to use. Current debian stable is called buster (debian 10.6, dated 20200926), and a current ubuntu is called focal (Ubuntu 20.04 LTS aka "focal fossa", dated 20200623).
First stage
This step can be run from any host architecture.
armhf
debootstrap --arch=armhf --foreign <distro> /mnt/
arm64
debootstrap --arch=arm64 --foreign <distro> /mnt/
Replace <distro> with your preferred distribution, probably buster or focal.
Second stage
From a different host architecture
Copy qemu to the target filesystem and chroot to target:
armhf
cp /usr/bin/qemu-arm-static /mnt/usr/bin/ chroot /mnt /usr/bin/qemu-arm-static /bin/sh -i
arm64
cp /usr/bin/qemu-aarch64-static /mnt/usr/bin/ chroot /mnt /usr/bin/qemu-aarch64-static /bin/sh -i
From the same architecture
Chroot to target:
chroot /mnt /bin/sh -i
Debootstrap second stage
/debootstrap/debootstrap --second-stage
It's also possible to use qemu-debootstrap instead of manual two-stage bootstrap.
Mandatory setup
Add root passwd
While in the chroot, run:
passwd
Hostname
You do not wish to have your rootfs have the same hostname as your host machine, so it is wise to change this now, as this will surreptitiously influence things like your ssh keys.
Simply edit /etc/hostname, this can be done from both inside and outside of the chroot.
Fstab
This can be done from both inside and outside of the chroot.
Add tmpfs
none /tmp tmpfs defaults,noatime,mode=1777 0 0
Add root filesystem
/dev/mmcblk0p2 / ext4 defaults 0 1
Rename this to /dev/mmcblk0p1 if you use a single partition.
Add boot partition (if present)
/dev/mmcblk0p1 /boot vfat defaults 0 2
Adjust filesystemtype accordingly.
Serial console
With systemd
- From within the chroot:
systemctl enable [email protected]
- Outside of chroot:
ln -s /lib/systemd/system/[email protected] /mnt/etc/systemd/system/getty.target.wants/[email protected]
With upstart
Please follow this ubuntu howto, which can be done from outside the chroot.
With sysvinit
Add the following line to /etc/inittab, independent of chroot (apart from the path):
T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt100
Optional/deferrable setup
Most of these things can be done from within the chroot or on the actual machine. They are really nice to have, but not totally necessary before the first boot of the target machine.
If debians servers are not resolving, you might need to copy the hosts' resolv.conf to the target filesystem before chrooting back in.
Locales
Run:
apt-get install locales dpkg-reconfigure locales
It might make sense to choose en_US.UTF-8
Configure ethernet with dhcp
Add the following to /etc/network/interfaces
auto lo eth0 allow-hotplug eth0 iface lo inet loopback iface eth0 inet dhcp
This method is preferred over catting, as that will overwrite any inclusion of interfaces.d/
More complete apt sources.list
Here are some expanded sources.lists, which are bound to be out of date. Edit /etc/apt/sources.list and add.
Debian
Replace buster with your chosen debian distribution name.
deb http://deb.debian.org/debian/ buster main contrib non-free deb-src http://deb.debian.org/debian/ buster main contrib non-free deb http://deb.debian.org/debian/ buster-updates main contrib non-free deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free deb http://deb.debian.org/debian-security/ buster/updates main contrib non-free deb-src http://deb.debian.org/debian-security/ buster/updates main contrib non-free
Ubuntu
Replace focal with your chosen ubuntu version.
deb http://ports.ubuntu.com/ focal main universe deb-src http://ports.ubuntu.com/ focal main universe deb http://ports.ubuntu.com/ focal-security main universe deb-src http://ports.ubuntu.com/ focal-security main universe deb http://ports.ubuntu.com/ focal-updates main universe deb-src http://ports.ubuntu.com/ focal-updates main universe
Openssh-server
Run:
apt-get install openssh-server
Root login over SSH
If you want access as root, you will need to edit /etc/ssh/sshd_config.
Key based authentication
Uncomment the following line:
#PermitRootLogin prohibit-password
And add your key to /root/.ssh/authorized_keys.
Password based authentication
Uncomment the PermitRootLogin line, and set it to yes.
PermitRootLogin yes
PRNG entropy seeding speedups (debian buster!)
In case you notice long startup times for ssh server (or any other software calling getrandom(), see debian bug #912087) on your device, it can be alleviated by installing `haveged` package:
apt install haveged
This issue is not seen on Debian 9 (Stretch), but does occur on Debian 10 (Buster).
Cleanup
From within the chroot, run apt-get clean to remove cached packages.
If you were using a qemu chroot, then you need to remove /mnt/usr/bin/qemu-arm-static or /usr/bin/qemu-aarch64-static.
If you needed the hosts' resolv.conf, then you need to remove /mnt/etc/resolv.conf
Tarring up the result
You spent some time setting this up, and you might not want to retrace the above steps every few days, so you might as well throw this into a 100ish MB tarball:
From the host, from within /mnt/, run:
tar -cjpf /home/user/sunxi_rootfs.tar.bz2 .
Be careful when you unpack that, as rootfses are pretty much the only time tarballs should be untarred in the local directory.