Jump to navigation Jump to search

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,


  • 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.


debootstrap --arch=armhf --foreign <distro> /mnt/


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:


cp /usr/bin/qemu-arm-static /mnt/usr/bin/
chroot /mnt /usr/bin/qemu-arm-static /bin/sh -i


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:



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.


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

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.



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.


Replace buster with your chosen debian distribution name.

deb buster main contrib non-free
deb-src buster main contrib non-free
deb buster-updates main contrib non-free
deb-src buster-updates main contrib non-free
deb buster/updates main contrib non-free
deb-src buster/updates main contrib non-free


Replace focal with your chosen ubuntu version.

deb focal main universe
deb-src focal main universe
deb focal-security main universe
deb-src focal-security main universe
deb focal-updates main universe
deb-src focal-updates main universe



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).


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.