aboutsummaryrefslogtreecommitdiff
path: root/docs/gnulinux/encrypted_parabola.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/gnulinux/encrypted_parabola.md')
-rw-r--r--docs/gnulinux/encrypted_parabola.md834
1 files changed, 834 insertions, 0 deletions
diff --git a/docs/gnulinux/encrypted_parabola.md b/docs/gnulinux/encrypted_parabola.md
new file mode 100644
index 00000000..3480a2e9
--- /dev/null
+++ b/docs/gnulinux/encrypted_parabola.md
@@ -0,0 +1,834 @@
+<div class="section">
+
+Installing Parabola or Arch GNU+Linux with full disk encryption (including /boot)
+=================================================================================
+
+Libreboot on x86 uses the GRUB
+[payload](http://www.coreboot.org/Payloads#GRUB_2) by default, which
+means that the GRUB configuration file (where your GRUB menu comes from)
+is stored directly alongside libreboot and it\'s GRUB payload
+executable, inside the flash chip. In context, this means that
+installing distributions and managing them is handled slightly
+differently compared to traditional BIOS systems.
+
+On most systems, the /boot partition has to be left unencrypted while
+the others are encrypted. This is so that GRUB, and therefore the
+kernel, can be loaded and executed since the firmware can\'t open a LUKS
+volume. Not so with libreboot! Since GRUB is already included directly
+as a payload, even /boot can be encrypted. This protects /boot from
+tampering by someone with physical access to the system.
+
+**This guide is \*only\* for the GRUB payload. If you use the
+depthcharge payload, ignore this section entirely.**
+
+This guide is intended for the Parabola distribution, but it should also
+work (with some adaptation) for *Arch*. We recomend using Parabola,
+which is a version of Arch that removes all proprietary software, both
+in the default installation and in the package repositories. It usually
+lags behind Arch by only a day or two, so it is still usable for most
+people. See [Arch to Parabola migration
+guide](https://wiki.parabola.nu/index.php?title=Migration_from_the_GNU+Linux_distribution_of_Arch&redirect=no).
+
+Note: on some thinkpads, a faulty DVD drive can cause the cryptomount -a
+step during boot to fail. If this happens to you, try removing the
+drive.
+
+[Back to previous index](./)
+
+</div>
+
+<div class="section">
+
+Boot Parabola\'s install environment. [How to boot a GNU+Linux
+installer](grub_boot_installer.html).
+
+For this guide I used the 2015 08 01 image to boot the live installer
+and install the system. This is available at [this
+page](https://wiki.parabola.nu/Get_Parabola#Main_live_ISO).
+
+This guide will go through the installation steps taken at the time of
+writing, which may or may not change due to the volatile nature of
+Parabola (it changes all the time). In general most of it should remain
+the same. If you spot mistakes, please say so! This guide will be ported
+to the Parabola wiki at a later date. For up to date Parabola install
+guide, go to the Parabola wiki. This guide essentially cherry picks the
+useful information (valid at the time of writing: 2015-08-25).
+
+</div>
+
+<div class="section">
+
+This section deals with wiping the storage device on which you plan to
+install Parabola GNU+Linux. Follow these steps, but if you use an SSD,
+also:
+
+- beware there are issues with TRIM (not enabled through luks) and
+security issues if you do enable it. See [this
+page](https://wiki.archlinux.org/index.php/Dm-crypt/Specialties#Discard.2FTRIM_support_for_solid_state_drives_.28SSD.29)
+for more info.
+
+- make sure it\'s brand-new (or barely used). Or, otherwise, be sure
+that it never previously contained plaintext copies of your data.
+
+- make sure to read [this
+article](https://wiki.archlinux.org/index.php/Solid_State_Drives). Edit
+/etc/fstab later on when chrooted into your install. Also, read the
+whole article and keep all points in mind, adapting them for this guide.
+
+Securely wipe the drive:\
+\# **dd if=/dev/urandom of=/dev/sda; sync**\
+NOTE: If you have an SSD, only do this the first time. If it was already
+LUKS-encrypted before, use the info below to wipe the LUKS header. Also,
+check online for your SSD what the recommended erase block size is. For
+example if it was 2MiB:\
+\# **dd if=/dev/urandom of=/dev/sda bs=2M; sync**
+
+If your drive was already LUKS encrypted (maybe you are re-installing
+your distro) then it is already \'wiped\'. You should just wipe the LUKS
+header.
+<https://www.lisenet.com/2013/luks-add-keys-backup-and-restore-volume-header/>
+showed me how to do this. It recommends doing the first 3MiB. Now, that
+guide is recommending putting zero there. I\'m going to use urandom. Do
+this:\
+\# **head -c 3145728 /dev/urandom &gt; /dev/sda; sync**\
+(Wiping the LUKS header is important, since it has hashed passphrases
+and so on. It\'s \'secure\', but \'potentially\' a risk).
+
+</div>
+
+<div class="section">
+
+Change keyboard layout
+----------------------
+
+Parabola live shell assumes US Qwerty. If you have something different,
+list the available keymaps and use yours:\
+\# **localectl list-keymaps**\
+\# **loadkeys LAYOUT**\
+For me, LAYOUT would have been dvorak-uk.
+
+</div>
+
+<div class="section">
+
+Establish an internet connection
+--------------------------------
+
+Refer to [this
+guide](https://wiki.parabola.nu/Beginners%27_guide#Establish_an_internet_connection).
+Wired is recommended, but wireless is also explained there.
+
+</div>
+
+<div class="section">
+
+Getting started
+---------------
+
+The beginning is based on
+<https://wiki.parabolagnulinux.org/Installation_Guide>. Then I referred
+to <https://wiki.archlinux.org/index.php/Partitioning> at first.
+
+</div>
+
+<div class="section">
+
+dm-mod
+------
+
+device-mapper will be used - a lot. Make sure that the kernel module is
+loaded:\
+\# **modprobe dm-mod**
+
+Create LUKS partition
+---------------------
+
+Note that the default iteration time is 2000ms (2 seconds) if not
+specified in cryptsetup. You should set a lower time than this,
+otherwise there will be an approximate 20 second delay when booting your
+system. We recommend 500ms (0.5 seconds), and this is included in the
+prepared cryptsetup command below. Note that the iteration time is for
+security purposes (mitigates brute force attacks), so anything lower
+than 5 seconds is probably not ok.
+
+I am using MBR partitioning, so I use cfdisk:\
+\# **cfdisk /dev/sda**
+
+I create a single large sda1 filling the whole drive, leaving it as the
+default type \'Linux\' (83).
+
+Now I refer to
+<https://wiki.archlinux.org/index.php/Dm-crypt/Drive_preparation#Partitioning>:\
+I am then directed to
+<https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption>.
+
+Parabola forces you to RTFM. Do that.
+
+It tells me to run:\
+\# **cryptsetup benchmark** (for making sure the list below is
+populated)\
+Then:\
+\# **cat /proc/crypto**\
+This gives me crypto options that I can use. It also provides a
+representation of the best way to set up LUKS (in this case, security is
+a priority; speed, a distant second). To gain a better understanding, I
+am also reading:\
+\# **man cryptsetup**
+
+Following that page, based on my requirements, I do the following based
+on
+<https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encryption_options_for_LUKS_mode>.
+Reading through, it seems like Serpent (encryption) and Whirlpool (hash)
+is the best option.
+
+I am initializing LUKS with the following:\
+\# **cryptsetup -v \--cipher serpent-xts-plain64 \--key-size 512 \--hash
+whirlpool \--iter-time 500 \--use-random \--verify-passphrase luksFormat
+/dev/sda1** Choose a **secure** passphrase here. Ideally lots of
+lowercase/uppercase numbers, letters, symbols etc all in a random
+pattern. The password length should be as long as you are able to handle
+without writing it down or storing it anywhere.
+
+Use of the *diceware method* is recommended, for generating secure
+passphrases (instead of passwords).
+
+</div>
+
+<div class="section">
+
+Create LVM
+----------
+
+Now I refer to <https://wiki.archlinux.org/index.php/LVM>.
+
+Open the LUKS partition:\
+\# **cryptsetup luksOpen /dev/sda1 lvm**\
+(it will be available at /dev/mapper/lvm)
+
+Create LVM partition:\
+\# **pvcreate /dev/mapper/lvm**\
+Show that you just created it:\
+\# **pvdisplay**
+
+Now I create the volume group, inside of which the logical volumes will
+be created:\
+\# **vgcreate matrix /dev/mapper/lvm**\
+(volume group name is \'matrix\' - choose your own name, if you like)
+Show that you created it:\
+\# **vgdisplay**
+
+Now create the logical volumes:\
+\# **lvcreate -L 2G matrix -n swapvol** (2G swap partition, named
+swapvol)\
+Again, choose your own name if you like. Also, make sure to choose a
+swap size of your own needs. It basically depends on how much RAM you
+have installed. I refer to
+<http://www.linux.com/news/software/applications/8208-all-about-linux-swap-space>.\
+\# **lvcreate -l +100%FREE matrix -n root** (single large partition in
+the rest of the space, named root)\
+You can also be flexible here, for example you can specify a /boot, a /,
+a /home, a /var, a /usr, etc. For example, if you will be running a
+web/mail server then you want /var in its own partition (so that if it
+fills up with logs, it won\'t crash your system). For a home/laptop
+system (typical use case), a root and a swap will do (really).
+
+Verify that the logical volumes were created, using the following
+command:\
+\# **lvdisplay**
+
+</div>
+
+<div class="section">
+
+Create / and swap partitions, and mount
+---------------------------------------
+
+For the swapvol LV I use:\
+\# **mkswap /dev/mapper/matrix-swapvol**\
+Activate swap:\
+\# **swapon /dev/matrix/swapvol**
+
+For the root LV I use:\
+\# **mkfs.btrfs /dev/mapper/matrix-root**
+
+Mount the root (/) partition:\
+\# **mount /dev/matrix/root /mnt**
+
+</div>
+
+<div class="section">
+
+Continue with Parabola installation
+-----------------------------------
+
+This guide is really about GRUB, Parabola and cryptomount. I have to
+show how to install Parabola so that the guide can continue.
+
+Now I am following the rest of
+<https://wiki.parabolagnulinux.org/Installation_Guide>. I also cross
+referenced <https://wiki.archlinux.org/index.php/Installation_guide>.
+
+Create /home and /boot on root mountpoint:\
+\# **mkdir -p /mnt/home**\
+\# **mkdir -p /mnt/boot**
+
+Once all the remaining partitions, if any, have been mounted, the
+devices are ready to install Parabola.
+
+In **/etc/pacman.d/mirrorlist**, comment out all lines except the Server
+line closest to where you are (I chose the UK Parabola server (main
+server)) and then did:\
+\# **pacman -Syy**\
+\# **pacman -Syu**\
+\# **pacman -Sy pacman** (and then I did the other 2 steps above,
+again)\
+In my case I did the steps in the next paragraph, and followed the steps
+in this paragraph again.
+
+&lt;troubleshooting&gt;\
+   The following is based on \'Verification of package signatures\' in
+the Parabola install guide.\
+   Check there first to see if steps differ by now.\
+   Now you have to update the default Parabola keyring. This is used for
+signing and verifying packages:\
+   \# **pacman -Sy parabola-keyring**\
+   It says that if you get GPG errors, then it\'s probably an expired
+key and, therefore, you should do:\
+   \# **pacman-key \--populate parabola**\
+   \# **pacman-key \--refresh-keys**\
+   \# **pacman -Sy parabola-keyring**\
+   To be honest, you should do the above anyway. Parabola has a lot of
+maintainers, and a lot of keys. Really!\
+   If you get an error mentioning dirmngr, do:\
+   \# **dirmngr &lt;/dev/null**\
+   Also, it says that if the clock is set incorrectly then you have to
+manually set the correct time\
+   (if keys are listed as expired because of it):\
+   \# **date MMDDhhmm\[\[CC\]YY\]\[.ss\]**\
+   I also had to install:\
+   \# **pacman -S archlinux-keyring**\
+   \# **pacman-key \--populate archlinux**\
+   In my case I saw some conflicting files reported in pacman, stopping
+me from using it.\
+   I deleted the files that it mentioned and then it worked.
+Specifically, I had this error:\
+   *licenses: /usr/share/licenses/common/MPS exists in filesystem*\
+   I rm -Rf\'d the file and then pacman worked. I\'m told that the
+following would have also made it work:\
+   \# **pacman -Sf licenses**\
+&lt;/troubleshooting&gt;\
+
+I also like to install other packages (base-devel, compilers and so on)
+and wpa\_supplicant/dialog/iw/wpa\_actiond are needed for wireless after
+the install:\
+\# **pacstrap /mnt base base-devel wpa\_supplicant dialog iw
+wpa\_actiond**
+
+</div>
+
+<div class="section">
+
+Configure the system
+--------------------
+
+Generate an fstab - UUIDs are used because they have certain advantages
+(see <https://wiki.parabola.nu/Fstab#Identifying_filesystems>. If you
+prefer labels instead, replace the -U option with -L):\
+\# **genfstab -U -p /mnt &gt;&gt; /mnt/etc/fstab**\
+Check the created file:\
+\# **cat /mnt/etc/fstab**\
+(If there are any errors, edit the file. Do **NOT** run the genfstab
+command again!)
+
+Chroot into new system:\
+\# **arch-chroot /mnt /bin/bash**
+
+It\'s a good idea to have this installed:\
+\# **pacman -S linux-libre-lts**
+
+It was also suggested that you should install this kernel (read up on
+what GRSEC is):\
+\# **pacman -S linux-libre-grsec**
+
+This is another kernel that sits inside /boot, which you can use. LTS
+means \'long-term support\'. These are so-called \'stable\' kernels that
+can be used as a fallback during updates, if a bad kernel causes issues
+for you.
+
+Parabola does not have wget. This is sinister. Install it:\
+\# **pacman -S wget**
+
+Locale:\
+\# **vi /etc/locale.gen**\
+Uncomment your needed localisations. For example en\_GB.UTF-8 (UTF-8 is
+highly recommended over other options).\
+\# **locale-gen**\
+\# **echo LANG=en\_GB.UTF-8 &gt; /etc/locale.conf**\
+\# **export LANG=en\_GB.UTF-8**
+
+Console font and keymap:\
+\# **vi /etc/vconsole.conf**\
+In my case:
+
+ KEYMAP=dvorak-uk
+ FONT=lat9w-16
+
+Time zone:\
+\# **ln -s /usr/share/zoneinfo/Europe/London /etc/localtime**\
+(Replace Zone and Subzone to your liking. See /usr/share/zoneinfo)
+
+Hardware clock:\
+\# **hwclock \--systohc \--utc**
+
+Hostname: Write your hostname to /etc/hostname. For example, if your
+hostname is parabola:\
+\# **echo parabola &gt; /etc/hostname**\
+Add the same hostname to /etc/hosts:\
+\# **vi /etc/hosts**\
+
+ #<ip-address> <hostname.domain.org> <hostname>
+ 127.0.0.1 localhost.localdomain localhost parabola
+ ::1 localhost.localdomain localhost parabola
+
+Configure the network: Refer to
+<https://wiki.parabola.nu/Beginners%27_guide#Configure_the_network>.
+
+Mkinitcpio: Configure /etc/mkinitcpio.conf as needed (see
+<https://wiki.parabola.nu/Mkinitcpio>). Runtime modules can be found in
+/usr/lib/initcpio/hooks, and build hooks can be found in
+/usr/lib/initcpio/install. (\# **mkinitcpio -H hookname** gives
+information about each hook.) Specifically, for this use case:\
+\# **vi /etc/mkinitcpio.conf**\
+Then modify the file like so:
+
+- MODULES=\"i915\"
+- This forces the driver to load earlier, so that the console font
+ isn\'t wiped out after getting to login). Macbook21 users will also
+ need **hid-generic, hid and hid-apple to have a working keyboard
+ when asked to enter the LUKS password.**
+- HOOKS=\"base udev autodetect modconf block keyboard keymap
+ consolefont encrypt lvm2 filesystems fsck shutdown\"
+- Explanation:
+- keymap adds to initramfs the keymap that you specified in
+ /etc/vconsole.conf
+- consolefont adds to initramfs the font that you specified in
+ /etc/vconsole.conf
+- encrypt adds LUKS support to the initramfs - needed to unlock your
+ disks at boot time
+- lvm2 adds LVM support to the initramfs - needed to mount the LVM
+ partitions at boot time
+- shutdown is needed according to Parabola wiki for unmounting devices
+ (such as LUKS/LVM) during shutdown)
+
+Now using mkinitcpio, you can create the kernel and ramdisk for booting
+with (this is different from Arch, specifying linux-libre instead of
+linux):\
+\# **mkinitcpio -p linux-libre**\
+Also do it for linux-libre-lts:\
+\# **mkinitcpio -p linux-libre-lts**\
+Also do it for linux-libre-grsec:\
+\# **mkinitcpio -p linux-libre-grsec**
+
+Set the root password: At the time of writing, Parabola used SHA512 by
+default for its password hashing. I referred to
+<https://wiki.archlinux.org/index.php/SHA_password_hashes>.\
+\# **vi /etc/pam.d/passwd**\
+Add rounds=65536 at the end of the uncommented \'password\' line.\
+\# **passwd root**\
+Make sure to set a secure password! Also, it must never be the same as
+your LUKS password.
+
+Use of the *diceware method* is recommended, for generating secure
+passphrases (instead of passwords).
+
+</div>
+
+<div class="section">
+
+Extra security tweaks
+---------------------
+
+Based on <https://wiki.archlinux.org/index.php/Security>.
+
+Restrict access to important directories:\
+\# **chmod 700 /boot /etc/{iptables,arptables}**
+
+Lockout user after three failed login attempts:\
+Edit the file /etc/pam.d/system-login and comment out that line:\
+*\# auth required pam\_tally.so onerr=succeed file=/var/log/faillog*\
+Or just delete it. Above it, put:\
+*auth required pam\_tally.so deny=2 unlock\_time=600 onerr=succeed
+file=/var/log/faillog*\
+To unlock a user manually (if a password attempt is failed 3 times),
+do:\
+\# **pam\_tally \--user *theusername* \--reset** What the above
+configuration does is lock the user out for 10 minutes, if they make 3
+failed login attempts.
+
+Configure sudo - not covered here. Will be covered post-installation in
+another tutorial, at a later date. If this is a single-user system, you
+don\'t really need sudo.
+
+</div>
+
+<div class="section">
+
+Unmount, reboot!
+----------------
+
+Exit from chroot:\
+\# **exit**
+
+unmount:\
+\# **umount -R /mnt**\
+\# **swapoff -a**
+
+deactivate the lvm lv\'s:\
+\# **lvchange -an /dev/matrix/root**\
+\# **lvchange -an /dev/matrix/swapvol**\
+
+Lock the encrypted partition (close it):\
+\# **cryptsetup luksClose lvm**
+
+\# **shutdown -h now**\
+Remove the installation media, then boot up again.
+
+</div>
+
+<div class="section">
+
+Booting from GRUB
+-----------------
+
+Initially you will have to boot manually. Press C to get to the GRUB
+command line. The underlined parts are optional (using those 2
+underlines will boot lts kernel instead of normal).
+
+grub&gt; **cryptomount -a**\
+grub&gt; **set root=\'lvm/matrix-root\'**\
+grub&gt; **linux /boot/vmlinuz-linux-libre-lts root=/dev/matrix/root
+cryptdevice=/dev/sda1:root**\
+grub&gt; **initrd /boot/initramfs-linux-libre-lts.img**\
+grub&gt; **boot**\
+
+You could also make it load /boot/vmlinuz-linux-libre-grsec and
+/boot/initramfs-linux-libre-grsec.img
+
+</div>
+
+<div class="section">
+
+Follow-up tutorial: configuring Parabola
+----------------------------------------
+
+We will modify grub.config inside the ROM and do all kinds of fun stuff,
+but I recommend that you first transform the current bare-bones Parabola
+install into a more useable system. Doing so will make the upcoming ROM
+modifications MUCH easier to perform and less risky!
+[configuring\_parabola.html](configuring_parabola.html) shows my own
+notes post-installation. Using these, you can get a basic system similar
+to the one that I chose for myself. You can also cherry pick useful
+notes and come up with your own system. Parabola is user-centric, which
+means that you are in control. For more information, read [The Arch
+Way](https://wiki.archlinux.org/index.php/The_Arch_Way) (Parabola also
+follows it).
+
+</div>
+
+<div class="section">
+
+Modify grub.cfg inside the ROM
+------------------------------
+
+(Re-)log in to your system, pressing C, so booting manually from GRUB
+(see above). You need to modify the ROM, so that Parabola can boot
+automatically with this configuration. [grub\_cbfs.html](grub_cbfs.html)
+shows you how. Follow that guide, using the configuration details below.
+If you go for option 2 (re-flash), promise to do this on grubtest.cfg
+first! We can\'t emphasise this enough. This is to reduce the
+possibility of bricking your device!
+
+I will go for the re-flash option here. Firstly, cd to the
+libreboot\_util/cbfstool/{armv7l i686 x86\_64} directory. Dump the
+current firmware - where *libreboot.rom* is an example: make sure to
+adapt:\
+\# **flashrom -p internal -r libreboot.rom**\
+If flashrom complains about multiple flash chips detected, add a *-c*
+option at the end, with the name of your chosen chip is quotes.\
+You can check if everything is in there (*grub.cfg* and *grubtest.cfg*
+would be really nice):\
+\$ **./cbfstool libreboot.rom print**\
+Extract grubtest.cfg:\
+\$ **./cbfstool libreboot.rom extract -n grubtest.cfg -f grubtest.cfg**\
+And modify:\
+\$ **vi grubtest.cfg**
+
+In grubtest.cfg, inside the \'Load Operating System\' menu entry, change
+the contents to:
+
+ cryptomount -a
+
+ set root='lvm/matrix-root'
+
+ linux /boot/vmlinuz-linux-libre-lts root=/dev/matrix/root cryptdevice=/dev/sda1:root
+
+ initrd /boot/initramfs-linux-libre-lts.img
+
+Note: the underlined parts above (-lts) can also be removed, to boot the
+latest kernel instead of LTS (long-term support) kernels. You could also
+copy the menu entry and in one have -lts, and without in the other
+menuentry. You could also create a menu entry to load
+/boot/vmlinuz-linux-libre-grsec and
+/boot/initramfs-linux-libre-grsec.img The first entry will load by
+default.
+
+Without specifying a device, the *-a* parameter tries to unlock all
+detected LUKS volumes. You can also specify -u UUID or -a (device).
+
+[Refer to this guide](grub_hardening.html) for further guidance on
+hardening your GRUB configuration, for security purposes.
+
+Save your changes in grubtest.cfg, then delete the unmodified config
+from the ROM image:\
+\$ **./cbfstool libreboot.rom remove -n grubtest.cfg**\
+and insert the modified grubtest.cfg:\
+\$ **./cbfstool libreboot.rom add -n grubtest.cfg -f grubtest.cfg -t
+raw**\
+
+Now refer to <http://libreboot.org/docs/install/#flashrom>. Cd (up) to
+the libreboot\_util directory and update the flash chip contents:\
+\# **./flash update libreboot.rom**\
+Ocassionally, coreboot changes the name of a given board. If flashrom
+complains about a board mismatch, but you are sure that you chose the
+correct ROM image, then run this alternative command:\
+\# **./flash forceupdate libreboot.rom**\
+You should see \"Verifying flash\... VERIFIED.\" written at the end of
+the flashrom output.
+
+With this new configuration, Parabola can boot automatically and you
+will have to enter a password at boot time, in GRUB, before being able
+to use any of the menu entries or switch to the terminal. Let\'s test it
+out: reboot and choose grubtest.cfg from the GRUB menu, using the arrow
+keys on your keyboard. Enter the name you chose, the GRUB password, your
+LUKS passphrase and login as root/your user. All went well? Great!
+
+If it does not work like you want it to, if you are unsure or sceptical
+in any way, don\'t despair: you have been wise and did not brick your
+device! Reboot and login the default way, and then modify your
+grubtest.cfg until you get it right! **Do \*not\* proceed past this
+point unless you are 100% sure that your new configuration is safe (or
+desirable) to use.**
+
+Now, we can easily and safely create a copy of grubtest.cfg, called
+grub.cfg. This will be the same except for one difference: the menuentry
+\'Switch to grub.cfg\' is changed to \'Switch to grubtest.cfg\' and,
+inside it, all instances of grub.cfg to grubtest.cfg. This is so that
+the main config still links (in the menu) to grubtest.cfg, so that you
+don\'t have to manually switch to it, in case you ever want to follow
+this guide again in the future (modifying the already modified config).
+Inside libreboot\_util/cbfstool/{armv7l i686 x86\_64}, we can do this
+with the following command:\
+\$ **sed -e \'s:(cbfsdisk)/grub.cfg:(cbfsdisk)/grubtest.cfg:g\' -e
+\'s:Switch to grub.cfg:Switch to grubtest.cfg:g\' &lt; grubtest.cfg &gt;
+grub.cfg**\
+Delete the grub.cfg that remained inside the ROM:\
+\$ **./cbfstool libreboot.rom remove -n grub.cfg**\
+Add the modified version that you just made:\
+\$ **./cbfstool libreboot.rom add -n grub.cfg -f grub.cfg -t raw**\
+
+Now you have a modified ROM. Once more, refer to
+<http://libreboot.org/docs/install/#flashrom>. Cd to the libreboot\_util
+directory and update the flash chip contents:\
+\# **./flash update libreboot.rom**\
+And wait for the \"Verifying flash\... VERIFIED.\" Once you have done
+that, shut down and then boot up with your new configuration.
+
+When done, delete GRUB (remember, we only needed it for the
+*grub-mkpasswd-pbkdf2* utility; GRUB is already part of libreboot,
+flashed alongside it as a *payload*):\
+\# **pacman -R grub**
+
+</div>
+
+<div class="section">
+
+If you followed all that correctly, you should now have a fully
+encrypted Parabola installation. Refer to the wiki for how to do the
+rest.
+
+</div>
+
+<div class="section">
+
+Bonus: Using a key file to unlock /boot/
+----------------------------------------
+
+By default, you will have to enter your LUKS passphrase twice; once in
+GRUB, and once when booting the kernel. GRUB unlocks the encrypted
+partition and then loads the kernel, but the kernel is not aware of the
+fact that it is being loaded from an encrypted volume. Therefore, you
+will be asked to enter your passphrase a second time. A workaround is to
+put a keyfile inside initramfs, with instructions for the kernel to use
+it when booting. This is safe, because /boot/ is encrypted (otherwise,
+putting a keyfile inside initramfs would be a bad idea).\
+Boot up and login as root or your user. Then generate the key file:\
+\# **dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfile
+iflag=fullblock**\
+Insert it into the luks volume:\
+\# **cryptsetup luksAddKey /dev/sdX /etc/mykeyfile**\
+and enter your LUKS passphrase when prompted. Add the keyfile to the
+initramfs by adding it to FILES in /etc/mkinitcpio.conf. For example:\
+\# **FILES=\"/etc/mykeyfile\"**\
+Create the initramfs image from scratch:\
+\# **mkinitcpio -p linux-libre**\
+\# **mkinitcpio -p linux-libre-lts**\
+\# **mkinitcpio -p linux-libre-grsec**\
+Add the following to your grub.cfg - you are now able to do that, see
+above! -, or add it in the kernel command line for GRUB:\
+\# **cryptkey=rootfs:/etc/mykeyfile**\
+\
+You can also place this inside the grub.cfg that exists in CBFS:
+[grub\_cbfs.html](grub_cbfs.html).
+
+</div>
+
+<div class="section">
+
+Further security tips
+---------------------
+
+<https://wiki.archlinux.org/index.php/Security>.\
+<https://wiki.parabolagnulinux.org/User:GNUtoo/laptop>
+
+</div>
+
+<div class="section">
+
+Troubleshooting
+===============
+
+A user reported issues when booting with a docking station attached on
+an X200, when decrypting the disk in GRUB. The error *AHCI transfer
+timed out* was observed. The workaround was to remove the docking
+station.
+
+Further investigation revealed that it was the DVD drive causing
+problems. Removing that worked around the issue.
+
+
+ "sudo wodim -prcap" shows information about the drive:
+ Device was not specified. Trying to find an appropriate drive...
+ Detected CD-R drive: /dev/sr0
+ Using /dev/cdrom of unknown capabilities
+ Device type : Removable CD-ROM
+ Version : 5
+ Response Format: 2
+ Capabilities :
+ Vendor_info : 'HL-DT-ST'
+ Identification : 'DVDRAM GU10N '
+ Revision : 'MX05'
+ Device seems to be: Generic mmc2 DVD-R/DVD-RW.
+
+ Drive capabilities, per MMC-3 page 2A:
+
+ Does read CD-R media
+ Does write CD-R media
+ Does read CD-RW media
+ Does write CD-RW media
+ Does read DVD-ROM media
+ Does read DVD-R media
+ Does write DVD-R media
+ Does read DVD-RAM media
+ Does write DVD-RAM media
+ Does support test writing
+
+ Does read Mode 2 Form 1 blocks
+ Does read Mode 2 Form 2 blocks
+ Does read digital audio blocks
+ Does restart non-streamed digital audio reads accurately
+ Does support Buffer-Underrun-Free recording
+ Does read multi-session CDs
+ Does read fixed-packet CD media using Method 2
+ Does not read CD bar code
+ Does not read R-W subcode information
+ Does read raw P-W subcode data from lead in
+ Does return CD media catalog number
+ Does return CD ISRC information
+ Does support C2 error pointers
+ Does not deliver composite A/V data
+
+ Does play audio CDs
+ Number of volume control levels: 256
+ Does support individual volume control setting for each channel
+ Does support independent mute setting for each channel
+ Does not support digital output on port 1
+ Does not support digital output on port 2
+
+ Loading mechanism type: tray
+ Does support ejection of CD via START/STOP command
+ Does not lock media on power up via prevent jumper
+ Does allow media to be locked in the drive via PREVENT/ALLOW command
+ Is not currently in a media-locked state
+ Does not support changing side of disk
+ Does not have load-empty-slot-in-changer feature
+ Does not support Individual Disk Present feature
+
+ Maximum read speed: 4234 kB/s (CD 24x, DVD 3x)
+ Current read speed: 4234 kB/s (CD 24x, DVD 3x)
+ Maximum write speed: 4234 kB/s (CD 24x, DVD 3x)
+ Current write speed: 4234 kB/s (CD 24x, DVD 3x)
+ Rotational control selected: CLV/PCAV
+ Buffer size in KB: 1024
+ Copy management revision supported: 1
+ Number of supported write speeds: 4
+ Write speed # 0: 4234 kB/s CLV/PCAV (CD 24x, DVD 3x)
+ Write speed # 1: 2822 kB/s CLV/PCAV (CD 16x, DVD 2x)
+ Write speed # 2: 1764 kB/s CLV/PCAV (CD 10x, DVD 1x)
+ Write speed # 3: 706 kB/s CLV/PCAV (CD 4x, DVD 0x)
+
+ Supported CD-RW media types according to MMC-4 feature 0x37:
+ Does write multi speed CD-RW media
+ Does write high speed CD-RW media
+ Does write ultra high speed CD-RW media
+ Does not write ultra high speed+ CD-RW media
+
+</div>
+
+<div class="section">
+
+Copyright © 2014, 2015, 2016 Leah Rowe &lt;info@minifree.org&gt;\
+Copyright © 2015 Jeroen Quint &lt;jezza@diplomail.ch&gt;\
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International license or any later version published by Creative
+Commons; A copy of the license can be found at
+[../cc-by-sa-4.0.txt](../cc-by-sa-4.0.txt)
+
+Updated versions of the license (when available) can be found at
+<https://creativecommons.org/licenses/by-sa/4.0/legalcode>
+
+UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT
+POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND
+AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
+CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY,
+OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE,
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT,
+ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE
+OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF
+WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT
+APPLY TO YOU.
+
+TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU
+ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR
+OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL,
+PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES
+ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN
+IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES,
+COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT
+ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+The disclaimer of warranties and limitation of liability provided above
+shall be interpreted in a manner that, to the extent possible, most
+closely approximates an absolute disclaimer and waiver of all liability.
+
+</div>