377 lines
8.8 KiB
Markdown
377 lines
8.8 KiB
Markdown
|
---
|
|||
|
title: Encrypted Guix GNU+Linux
|
|||
|
x-toc-enable: true
|
|||
|
...
|
|||
|
|
|||
|
Objective
|
|||
|
=========
|
|||
|
|
|||
|
To provide step-by-step guide for setting up guix system (stand-alone guix) with
|
|||
|
full disk encryption (including /boot) on devices powered by Libreboot.
|
|||
|
|
|||
|
Scope
|
|||
|
=====
|
|||
|
|
|||
|
Any users, for their generalised use cases, need not stumble away from this
|
|||
|
guide to accomplish the setup.
|
|||
|
|
|||
|
Advanced users, for deviant use cases, will have to explore outside this guide
|
|||
|
for customisation; although this guide provides information that is of paramount
|
|||
|
use.
|
|||
|
|
|||
|
Process
|
|||
|
=======
|
|||
|
|
|||
|
Preparation
|
|||
|
-----------
|
|||
|
|
|||
|
In your current GNU+Linux System, open terminal as root user.
|
|||
|
|
|||
|
Insert USB drive and get the USB device name /dev/sdX, where “X” is the variable
|
|||
|
to make a note of.
|
|||
|
|
|||
|
lsblk
|
|||
|
|
|||
|
Unmount the USB drive just in case if it’s auto-mounted.
|
|||
|
|
|||
|
umount /dev/sdX
|
|||
|
|
|||
|
Download the latest (a.b.c) Guix System ISO Installer Package (sss) and it’s GPG
|
|||
|
Signature; where “a.b.c” is the variable for version number and “sss” is the
|
|||
|
variable for system architecture.
|
|||
|
|
|||
|
wget https://ftp.gnu.org/gnu/guix/guix-system-install-a.b.c.sss-linux.iso.xz
|
|||
|
|
|||
|
wget https://ftp.gnu.org/gnu/guix/guix-system-install-a.b.c.sss-linux.iso.xz.sig
|
|||
|
|
|||
|
Import required public key.
|
|||
|
|
|||
|
gpg --keyserver pool.sks-keyservers.net --recv-keys 3CE464558A84FDC69DB40CFB090B11993D9AEBB5
|
|||
|
|
|||
|
Verify the GPG Signature of the downloaded package.
|
|||
|
|
|||
|
gpg --verify guix-system-install-a.b.c.sss-linux.iso.xz.sig
|
|||
|
|
|||
|
Extract the ISO Image from the downloaded package.
|
|||
|
|
|||
|
xz --decompress guix-system-install-a.b.c.sss-linux.iso.xz
|
|||
|
|
|||
|
Write the extracted ISO Image to the USB drive.
|
|||
|
|
|||
|
dd if=guix-system-install-a.b.c.sss-linux.iso of=/dev/sdX; sync
|
|||
|
|
|||
|
Reboot the device.
|
|||
|
|
|||
|
reboot
|
|||
|
|
|||
|
Pre-Installation
|
|||
|
----------------
|
|||
|
|
|||
|
On reboot, as soon as you see the Libreboot Graphic Art, press arrow keys to
|
|||
|
change the menu entry.
|
|||
|
|
|||
|
Choose “Search for GRUB2 configuration on external media [s]” and wait for the
|
|||
|
Guix System from USB drive to load.
|
|||
|
|
|||
|
Set your keyboard layout lo, where “lo” is the two-letter keyboard layout code
|
|||
|
(example: us or uk).
|
|||
|
|
|||
|
loadkeys lo
|
|||
|
|
|||
|
Unblock network interfaces (if any).
|
|||
|
|
|||
|
rfkill unblock all
|
|||
|
|
|||
|
Get the names of your network interfaces.
|
|||
|
|
|||
|
ifconfig -a
|
|||
|
|
|||
|
Bring your required network interface nwif (wired or wireless) up, where “nwif”
|
|||
|
is the variable for interface name. For wired connections, this should be
|
|||
|
enough.
|
|||
|
|
|||
|
ifconfig nwif up
|
|||
|
|
|||
|
For wireless connection, create a configuration file using text editor, where
|
|||
|
“fname” is the variable for any desired filename.
|
|||
|
|
|||
|
nano fname.conf
|
|||
|
|
|||
|
Choose, type and save ONE of the following snippets, where ‘nm’ is the name of
|
|||
|
the network you want to connect, ‘pw’ is the corresponding network’s password or
|
|||
|
passphrase and ‘un’ is user identity.
|
|||
|
|
|||
|
For most private networks:
|
|||
|
|
|||
|
network={
|
|||
|
ssid="nm"
|
|||
|
key_mgmt=WPA-PSK
|
|||
|
psk="pw"
|
|||
|
}
|
|||
|
|
|||
|
(or)
|
|||
|
|
|||
|
For most public networks:
|
|||
|
|
|||
|
network={
|
|||
|
ssid="nm"
|
|||
|
key_mgmt=NONE
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
(or)
|
|||
|
|
|||
|
For most organisational networks:
|
|||
|
|
|||
|
network={
|
|||
|
ssid="nm"
|
|||
|
scan_ssid=1
|
|||
|
key_mgmt=WPA-EAP
|
|||
|
identity="un"
|
|||
|
password="pw"
|
|||
|
eap=PEAP
|
|||
|
phase1="peaplabel=0"
|
|||
|
phase2="auth=MSCHAPV2"
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Connect to the configured network, where “fname” is the filename and “nwif” is
|
|||
|
the network interface name.
|
|||
|
|
|||
|
wpa_supplicant -c fname.conf -i nwif -B
|
|||
|
|
|||
|
Assign an IP address to your network interface, where “nwif” is the network
|
|||
|
interface name.
|
|||
|
|
|||
|
dhclient -v nwif
|
|||
|
|
|||
|
If your Guix installation image doesn't have support for LVM, do the following.
|
|||
|
|
|||
|
guix pull --branch=master && guix install lvm2
|
|||
|
|
|||
|
Obtain the device name /dev/sdX in which you would like to deploy and install
|
|||
|
Guix System, where “X” is the variable to make a note of.
|
|||
|
|
|||
|
lsblk
|
|||
|
|
|||
|
Wipe the respective device. Wait for the command operation to finish.
|
|||
|
|
|||
|
shred --random-source=/dev/urandom /dev/sdX
|
|||
|
|
|||
|
Load device-mapper module in the current kernel.
|
|||
|
|
|||
|
modprobe dm_mod
|
|||
|
|
|||
|
Partition the respective device. Just do, GPT --> New --> Write --> Quit;
|
|||
|
defaults will be set.
|
|||
|
|
|||
|
cfdisk /dev/sdX
|
|||
|
|
|||
|
Encrypt the respective partition.
|
|||
|
|
|||
|
cryptsetup --verbose --hash whirlpool --cipher serpent-xts-plain64 --verify-passphrase --use-random --key-size 512 --iter-time 500 luksFormat /dev/sdX1
|
|||
|
|
|||
|
Obtain and note down the “LUKS UUID”.
|
|||
|
|
|||
|
cryptsetup luksUUID /dev/sdX1
|
|||
|
|
|||
|
Open the respective encrypted partition and map it as 'fde'.
|
|||
|
|
|||
|
cryptsetup luksOpen /dev/sdX1 fde
|
|||
|
|
|||
|
Create a physical volume in the partition.
|
|||
|
|
|||
|
pvcreate /dev/mapper/fde
|
|||
|
|
|||
|
Create a volume group in the physical volume, named 'matrix'.
|
|||
|
|
|||
|
vgcreate matrix /dev/mapper/fde
|
|||
|
|
|||
|
Create a logical volume of 2GiB for swap, named 'swapvol'.
|
|||
|
|
|||
|
lvcreate --size 2G matrix --name swapvol
|
|||
|
|
|||
|
Create a logical volume of rest of free-space for root, named 'rootvol'.
|
|||
|
|
|||
|
lvcreate --extents 100%FREE matrix --name rootvol
|
|||
|
|
|||
|
Create swap space in the logical volume 'swapvol', labeled 'swap'.
|
|||
|
|
|||
|
mkswap --label swap /dev/matrix/swapvol
|
|||
|
|
|||
|
Create filesystem in the logical volume 'rootvol', labeled 'root'.
|
|||
|
|
|||
|
mkfs.btrfs --metadata dup --label root /dev/matrix/rootvol
|
|||
|
|
|||
|
Mount the root filesystem under the current system.
|
|||
|
|
|||
|
mount --label root --target /mnt --types btrfs
|
|||
|
|
|||
|
Installation
|
|||
|
------------
|
|||
|
|
|||
|
Make the installation packages to be written on the respective mounted
|
|||
|
filesystem.
|
|||
|
|
|||
|
herd start cow-store /mnt
|
|||
|
|
|||
|
Create the required directory.
|
|||
|
|
|||
|
mkdir /mnt/etc
|
|||
|
|
|||
|
Create, edit and save the configuration file by typing the following code
|
|||
|
snippet. WATCH-OUT for variables in the code snippet and replace them with your
|
|||
|
relevant values.
|
|||
|
|
|||
|
nano /mnt/etc/config.scm
|
|||
|
|
|||
|
Snippet:
|
|||
|
|
|||
|
(use-modules
|
|||
|
(gnu)
|
|||
|
(gnu system nss))
|
|||
|
(use-package-modules
|
|||
|
certs
|
|||
|
gnome
|
|||
|
linux)
|
|||
|
(use-service-modules
|
|||
|
desktop
|
|||
|
xorg)
|
|||
|
(operating-system
|
|||
|
(kernel linux-libre-lts)
|
|||
|
(bootloader
|
|||
|
(bootloader-configuration
|
|||
|
(bootloader
|
|||
|
(bootloader
|
|||
|
(inherit grub-bootloader)
|
|||
|
(installer #~(const #t))))
|
|||
|
(keyboard-layout keyboard-layout)))
|
|||
|
(keyboard-layout
|
|||
|
(keyboard-layout
|
|||
|
"xy"
|
|||
|
"altgr-intl"))
|
|||
|
(host-name "hostname")
|
|||
|
(mapped-devices
|
|||
|
(list
|
|||
|
(mapped-device
|
|||
|
(source
|
|||
|
(uuid "luks-uuid"))
|
|||
|
(target "fde")
|
|||
|
(type luks-device-mapping))
|
|||
|
(mapped-device
|
|||
|
(source "matrix")
|
|||
|
(targets
|
|||
|
(list
|
|||
|
"matrix-rootvol"
|
|||
|
"matrix-swapvol"))
|
|||
|
(type lvm-device-mapping))))
|
|||
|
(file-systems
|
|||
|
(append
|
|||
|
(list
|
|||
|
(file-system
|
|||
|
(type "btrfs")
|
|||
|
(mount-point "/")
|
|||
|
(device (file-system-label "root"))
|
|||
|
(flags '(no-atime))
|
|||
|
(options "space_cache=v2")
|
|||
|
(needed-for-boot? #t)
|
|||
|
(dependencies mapped-devices)))
|
|||
|
%base-file-systems))
|
|||
|
(swap-devices
|
|||
|
(list
|
|||
|
(file-system-label "swap")))
|
|||
|
(users
|
|||
|
(append
|
|||
|
(list
|
|||
|
(user-account
|
|||
|
(name "username")
|
|||
|
(comment "Full Name")
|
|||
|
(group "users")
|
|||
|
(supplementary-groups '("audio" "cdrom" "kvm" "lp" "netdev" "tape" "video" "wheel"))))
|
|||
|
%base-user-accounts))
|
|||
|
(packages
|
|||
|
(append
|
|||
|
(list
|
|||
|
nss-certs)
|
|||
|
%base-packages))
|
|||
|
(timezone "Zone/SubZone")
|
|||
|
(locale "ab_XY.1234")
|
|||
|
(name-service-switch %mdns-host-lookup-nss)
|
|||
|
(services
|
|||
|
(append
|
|||
|
(list
|
|||
|
(service gnome-desktop-service-type))
|
|||
|
%desktop-services)))
|
|||
|
|
|||
|
Initialise new Guix System.
|
|||
|
|
|||
|
guix system init /mnt/etc/config.scm /mnt
|
|||
|
|
|||
|
Reboot the device.
|
|||
|
|
|||
|
reboot
|
|||
|
|
|||
|
Post-Installation
|
|||
|
------------
|
|||
|
|
|||
|
On reboot, as soon as you see the Libreboot Graphic Art, choose the option
|
|||
|
'Load Operating System [o]'
|
|||
|
|
|||
|
Enter LUKS Key, for Libreboot's grub, as prompted.
|
|||
|
|
|||
|
You may have to go through warning prompts by repeatedly pressing the
|
|||
|
"enter/return" key.
|
|||
|
|
|||
|
You will now see guix's grub menu from which you can go with the default option.
|
|||
|
|
|||
|
Enter LUKS Key again, for kernel, as prompted.
|
|||
|
|
|||
|
Upon login screen, login as "root" with password field empty.
|
|||
|
|
|||
|
Open terminal from the GNOME Dash.
|
|||
|
|
|||
|
Set passkey for "root" user. Follow the prompts.
|
|||
|
|
|||
|
passwd root
|
|||
|
|
|||
|
Set passkey for "username" user. Follow the prompts.
|
|||
|
|
|||
|
passwd username
|
|||
|
|
|||
|
Update the guix distribution. Wait for the process to finish.
|
|||
|
|
|||
|
guix pull
|
|||
|
|
|||
|
Update the guix system. Wait for the process to finish.
|
|||
|
|
|||
|
guix system reconfigure /etc/config.scm
|
|||
|
|
|||
|
Reboot the device.
|
|||
|
|
|||
|
reboot
|
|||
|
|
|||
|
Conclusion
|
|||
|
==========
|
|||
|
|
|||
|
Everything should be stream-lined from now. You can follow your regular boot
|
|||
|
steps without requiring manual intervention. You can start logging in as regular
|
|||
|
user with the respective "username".
|
|||
|
|
|||
|
You will have to periodically (at your convenient time) login as root and do the
|
|||
|
update/upgrade part of post-installation section, to keep your guix distribution
|
|||
|
and guix system updated.
|
|||
|
|
|||
|
That is it! You have now setup guix system with full-disk encryption on your
|
|||
|
device powered by Libreboot. Enjoy!
|
|||
|
|
|||
|
References
|
|||
|
==========
|
|||
|
|
|||
|
[1] Guix Manual (http://guix.gnu.org/manual/en/).
|
|||
|
|
|||
|
Acknowledgements
|
|||
|
================
|
|||
|
|
|||
|
[1] Thanks to Guix Developer, Clement Lassieur (clement@lassieur.org),
|
|||
|
for helping me with the Guile Scheme Code for the Bootloader Configuration.
|