Debian Stretch was released last month, so it is time to upgrade my laptop. I’m an i3 window manager user. Previously my procedure was to backup
/home
, reinstall using the network installer (I don’t like apt-get dist-upgrade
, I like to start clean) and tick the “Debian Desktop Environment … GNOME” checkbox and after the installer was done, install i3 and the rest of my tools.
While I use some of the tools from Gnome, like gnome-terminal, network manager, nautilus and Eye of Gnome, I do not really need the complete Gnome desktop environment and 100s of software packages that come with it. This time I want a basic system with only the tools I need. And I want to upgrade in-place without losing my Debian jessie install.
Some notes about the installation:
- It’s a Lenovo Thinkpad T450s
- I currently have 2 partitions: 1 for
/boot
and the other is encrypted with luks - The encrypted partition contains 3 logical volumes for
/
,/home
andswap
- A 4th lv (logical volume) will be created for the new root partition for Debian stretch
- The new lv will be BTRFS formatted and I’ll use a BTRFS subvolume to be able to create snapshots of it
- The minimal required software will be installed to run the i3 window manager, including some tools I regularly use.
Let’s prepare the root volume:
VG=bento # my lvm2 volume group is called bento LV=stretch # the new lv will be called stretch LABEL=stretch # label for btrfs lvcreate -L10G -n $LV $VG mkfs.btrfs -L $LABEL /dev/$VG/$LV mkdir /mnt/$LV mount /dev/$VG/$LV /mnt/$LV cd /mnt/$LV # create the root subvolume btrfs subvolume create @ cd - umount /mnt/$LV # mount the subvolume instead mount -o subvol=/@ /dev/$VG/$LV /mnt/$LV
The boot partition (/boot
) will be reused/shared between the current Debian jessie install and the new stretch install. Because I still use Debian jessie daily for my work, I still want to be able to boot jessie as a fallback. To see what happens to /boot/grub
and especially /boot/grub/grub.cfg
I will make a git repository in /boot/grub
.
cd /boot/grub git init git add -A . git commit -am 'grub at the time jessie was still installed'
Let’s start with the install:
/usr/sbin/debootstrap --include udev,openssh-server,linux-image-amd64 stretch /mnt/$LV http://deb.debian.org/debian/ # the new system needs to know about the encrypted partition, so copy crypttab cp /etc/crypttab /mnt/$LV/etc/crypttab # configure /mnt/$LV/etc/fstab # example contents (replace $UUID with the uuid of /boot, replace $LABEL with the btrfs label) UUID=$UUID /boot ext4 defaults 0 2 LABEL=$LABEL / btrfs subvol=/@,defaults,noatime 0 0 LABEL=$LABEL /btrfs-root btrfs subvol=/,defaults,noatime 0 0 # optionally add the existing mountpoint for /home # The root of the BTRFS filesystem is mounted at `/btrfs-root`. From here we can manage the subvolumes and snapshots mkdir /mnt/$LV/btrfs-root # chroot into the new system mount -o bind /boot /mnt/$LV/boot/ mount -o bind /dev /mnt/$LV/dev/ mount -t proc proc /mnt/$LV/proc mount -t sysfs sys /mnt/$LV/sys chroot /mnt/$LV # set a root password passwd # create a normal user account adduser pommi # we do not want recommended packages to be installed automatically echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/00InstallRecommends # stable and security updates cat > /etc/apt/sources.list <<EOT deb http://deb.debian.org/debian stretch main contrib non-free deb http://deb.debian.org/debian stretch-updates main contrib non-free deb http://security.debian.org/ stretch/updates main contrib non-free EOT apt-get update apt-get upgrade # install some basics apt-get install cryptsetup lvm2 locales busybox less grub-pc git vim-nox initramfs-tools btrfs-progs # set the default locale (to for example en_US.UTF-8) dpkg-reconfigure locales # set the timezone dpkg-reconfigure tzdata
The basics are done. Now install the Desktop Environment. To graphically login after booting I chose lightdm, which is a lightweight display manager. Gnome comes with gdm (Gnome Display Manager), but that installs ~87 another software packages I don’t want.
# suckless-tools for dmenu, x11-xserver-utils for xrandr apt-get install lightdm i3 i3status suckless-tools xserver-xorg x11-xserver-utils # networking, including wifi, gnome-keyring to store wifi passwords apt-get install network-manager-gnome firmware-iwlwifi firmware-linux gnome-keyring # and a terminal and a browser apt-get install gnome-terminal firefox-esr
The system is now ready. Let’s check the changes in /boot/grub
before we reboot.
cd /boot/grub git status git diff # commit the changes git add -A . git commit -m 'after installing stretch'
In my case I had (at least) 2 kernels present in /boot
. An active one for jessie (/vmlinuz-3.16.0-4-amd64
) and a new one for stretch (/vmlinuz-4.9.0-3-amd64
). When update-grub
was executed from stretch just now, it changed all the grub menu items to boot into the new stretch system (every “linux” line now contains: root=/dev/mapper/$VG-$LV
). To be able to still boot to jessie, I revert the changes for the “linux” lines that are supposed to boot the jessie system (/vmlinuz-3.16.0-4-amd64
kernels).
For example, change this:
linux /vmlinuz-3.16.0-4-amd64 root=/dev/mapper/bento-stretch ro quiet
back to (“root” is my current root lv):
linux /vmlinuz-3.16.0-4-amd64 root=/dev/mapper/bento-root ro quiet
And commit the result:
git add grub.cfg git commit -m 'boot jessie with the old kernel'
Time to reboot to stretch
# exit the chroot exit umount /mnt/$LV/sys umount /mnt/$LV/proc umount /mnt/$LV/dev/ umount /mnt/$LV/boot/ umount /mnt/$LV reboot
Lightdm will start and show you a login screen. Login using the normal user you just created an i3 will start.
Additional software and configuration
Lock screen (Ctrl+Alt+l and after 5 minutes):
apt-get install i3lock xautolock echo 'exec xautolock -time 5 -locker i3lock' >> .config/i3/config echo 'bindsym Control+$alt+l exec xautolock -locknow' >> .config/i3/config
Start Network Manager Applet on startup
echo 'exec --no-startup-id nm-applet' >> .config/i3/config
Open urls from gnome-terminal in firefox:
apt-get install xdg-utils xdg-settings get default-web-browser xdg-settings set default-web-browser firefox-esr.desktop