Using a live cd or existing Linux install to install Debian GNU/Linux using debootstrap.
Updated: 2015-01-11
debootstrap is used to create a Debian base system from scratch, without requiring the availability of dpkg or apt. It does this by downloading .deb files from a mirror site, and carefully unpacking them into a directory which can eventually be chrooted into.
This guide is intended to be a basic installation for those who wish to run Debian's unstable branch, or run a minimal system. It does not cover partitioning schemes, file system details, or proprietary drivers. For this guide, we will assume the following:
Branch: unstable (codename 'Sid')
Architecture: amd64
Boot Style: BIOS / MBR
Target partition: /dev/sda1
Filesystem: ext4
Network Interface: eth0
Debian Mirror: http://ftp.us.debian.org/debian - (Mirror List:
http://www.debian.org/mirror/list)
debootstrap version: 1.0.66
Dependencies: binutils, perl, tar, wget (if not using a Debian based distro)
Installing debootstrap from a Debian based distribution
For Debian based distributions, this will be as simple as:
Code:
root@host# apt-get update
root@host# apt-get install debootstrap
Installing debootstrap from a non-Debian based distribution
If you are installing from a non-Debian based distribution, you distribution may or may not have debootstrap available. To get debootstrap, you can download it directly from a Debian mirror.
To view the packages available, use a web browser, or use this command:
Code:
root@host# wget --no-remove-listing -O /tmp/deboot.html -q http://ftp.us.debian.org/debian/pool/main/d/debootstrap && grep 'all.deb' /tmp/deboot.html | awk -F 'href' '{print $2}' | cut -d '"' -f2
Look for the latest version listed, and download:
Code:
root@host# wget -P /tmp/debootstrap http://ftp.us.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.66_all.deb
Unpacking the .deb file:
Code:
root@host# cd /tmp/debootstrap
root@host# ar vx debootstrap_1.0.66_all.deb
root@host# tar -xf data.tar.gz
Temporary setup:
Code:
root@host# ln -s /tmp/debootstrap/usr/sbin/debootstrap /usr/sbin/debootstrap
root@host# ln -s /tmp/debootstrap/usr/share/debootstrap /usr/share/debootstrap
Setup the target partition for install
Create your filesystem, your mount point, and mount your partition:
Code:
root@host# mkfs.ext4 -L Debian /dev/sda1
root@host# mkdir /mnt/deboot
root@host# mount -t ext4 /dev/sda1 /mnt/deboot
Installing the base system with network access
Here, debootstrap will download, extract and install the base system packages to our target partition. debootstrap only fetches the base system without a kernel or bootloader, so we'll use the
--include option to fetch those too. If you need packages not found in the main repository, you can include packages from contrib and non-free with this option
--components main,contrib,non-free
Usage:
debootstrap --include <additional_packages,comma-separated> --arch <architecture> <release> <target> <mirror>
Code:
root@host# debootstrap --include linux-image-amd64,grub-pc,locales --arch amd64 unstable /mnt/deboot http://ftp.us.debian.org/debian
debootstrap can also be used to install Ubuntu (ex. Raring Ringtail):
Code:
root@host# debootstrap --arch amd64 raring /mnt/deboot http://archive.ubuntu.com/ubuntu
Installing the base system without network access, or to a different architecture
If you do not have network or Internet access, you can use the
--foreign option to start installation on a machine with network access, and finish on the machine that does not. This is also useful if your target machine is a different architecture than your host machine. Since your target won't have network access, make sure to use the
--include option to have debootstrap fetch your kernel, bootloader, and any other packages you will want installed.
Create a temporary directory, and use debootstrap to fetch the packages for the first stage of the install.
Code:
root@host# mkdir /home/<user-name>/deboot
root@host# debootstrap --foreign --include linux-image-amd64,grub-pc,locales --arch amd64 unstable /home/<user-name>/deboot http://ftp.us.debian.org/debian
If we were installing to a PowerPC...
Code:
root@host# debootstrap --foreign --include linux-image-powerpc,yaboot,locales --arch powerpc unstable /home/<user-name>/deboot http://ftp.us.debian.org/debian
Next we'll change to our temporary directory and create a tarball for use on the target machine.
Code:
root@host# cd /home/<user-name>/deboot
root@host# tar czf ../debian-stage2.tgz .
Copy the debian-stage2.tgz file to the target machine. Assuming your target partition is ready, change to the target directory and extract the tarball.
Code:
root@host# cd /mnt/deboot
root@host# tar xzf /path/to/debian-stage2.tgz
Next we'll enter the chroot environment for a moment to complete the second stage of the install.
Code:
root@host# chroot /mnt/deboot /bin/bash
root@chroot# /debootstrap/debootstrap --second-stage
root@chroot# exit
Preparing the chroot environment
Copy the mounted file systems table. It keeps the
df command happy. (Will be overwritten upon boot.)
Code:
root@host# cp /etc/mtab /mnt/deboot/etc/mtab
Binding the virtual filesystems. Until your new install is booting on it's own, we'll borrow these from the host.
Code:
root@host# mount -o bind /dev /mnt/deboot/dev
root@host# mount -o bind /proc /mnt/deboot/proc
root@host# mount -o bind /sys /mnt/deboot/sys
Continuing the installation within chroot
Entering the chroot environment:
Code:
root@host# chroot /mnt/deboot /bin/bash
Since we used the
--include option to get grub, it was installed, but not configured.
Code:
root@chroot# grub-install /dev/sda
root@chroot# update-grub
Setting up
/etc/fstab for the root filesystem. Use the
blkid command to get the UUID of
/dev/sda1.
Code:
root@chroot# blkid /dev/sda1
Then add this entry to
/etc/fstab using the UUID output from the command above:
Code:
UUID=79168060-9d9c-4cf6-8ee9-bb846aee589b / ext4 defaults,errors=remount-ro 0 1
Give your new install a name. If not, your new install won't have a name, or inherit the name of the host you are installing from.
Code:
root@chroot# echo "<name-your-host>" > /etc/hostname
Configure your locale:
Code:
root@chroot# dpkg-reconfigure locales
Create a password for root:
Code:
root@chroot# passwd
Create a normal user:
Code:
root@chroot# adduser <your-user-name>
Setting up the network (eth0):
Some basic tools are already included to manage your network, but nothing is configured for you yet. If you plan on installing a desktop environment, that may bring in tools such as
network-manager or
wicd to automatically configure your network.
You can bring up your network manually each boot with the tools
dhclient or
ifconfig.
For a dynamic IP (DHCP):
Code:
root@host# dhclient -v eth0
For a static IP:
Code:
root@host# ifconfig -v eth0 192.0.2.7 netmask 255.255.255.0 up
You can have this automatically done for you when the system boots by editing the file below.
For DHCP, the
/etc/network/interfaces file should look like this:
Code:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
For a static IP, the
/etc/network/interfaces file should look like this:
Code:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.0.2.7
netmask 255.255.255.0
gateway 192.0.2.254
Install a display manager and a window manager
Unless you're using this for a headless server, might be nice to have some sort of desktop to play with.
Don't forget to update the package manager if you wish to install new packages:
Code:
root@chroot# apt-get update
Here are some examples of installing a desktop:
Code:
root@chroot# apt-get install xserver-xorg wdm fluxbox xterm
- or -
root@chroot# apt-get install xserver-xorg lightdm xfce4
- or -
root@chroot# apt-get install gdm3 gnome
- or -
root@chroot# apt-get install kdm kde-standard
You can use also use
tasksel to install a desktop for you. To see the available options:
Code:
root@chroot# tasksel --new-install
Finishing the install
Clean the package cache:
Code:
root@chroot# apt-get clean
Update the ramdisk:
Code:
root@chroot# update-initramfs -u -k all
Exit the chroot environment:
-- Enjoy your fresh install of Debian! --
Additional Info
Approx space used after base install: 491 MiB
Approx bandwidth used: 94 MiB
Approx space used after Fluxbox / wdm install: 714 MiB
Approx bandwidth used including base: 152 MiB
Approx space used after XFCE4 / lightdm install: 1077 MiB
Approx bandwidth used including base: 266 MiB
Approx space used after KDE 4 Standard install: 2036 MiB
Approx bandwidth used including base: 597 MiB
Approx space used after Gnome3 full install: 3329 MiB
Approx bandwidth used including base: 994 MiB
Troubleshooting
Code:
W: Failure trying to run: chroot /mnt/deboot dpkg --force-depends --install /var/cache/apt/archives.....
W: See /mnt/deboot/debootstrap/debootstrap.log
Check that :/sbin is in your PATH, if not:
Code:
root@host# export PATH=$PATH:/sbin
root@host# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
----------------------------------------------------------------------------------------
Code:
E: No pkgdetails available; either install perl, or pkgdetails.c from the base-installer source package
Perl probably isn't installed. Please install Perl.
----------------------------------------------------------------------------------------
Debian doesn't boot!
Code:
fsck exited with status code 0
sulogin: cannot open password database!
Segmentation fault
Chances are, your root filesystem isn't configured properly in /etc/fstab. Fix the root entry, then run:
Code:
root@chroot# update-initramfs -u -k all