code:
---
title: Configuring Parabola (post-install)
...

Post-installation configuration steps for Parabola GNU+Linux-libre.
Parabola is extremely flexible; this is just an example. This example
uses LXDE because it's lightweight, but we recommend the *MATE* desktop
(which is actually about as lightweight as LXDE).

Table of Contents
=================

-   [Configuring pacman](#pacman_configure)
    -   [Updating Parabola](#pacman_update)
    -   [Maintaining Parabola during system updates](#pacman_maintain)
        -   [Clearing package cache after updating](#pacman_cacheclean)
        -   [Pacman command equivalents (compared to other package
            managers)](#pacman_commandequiv)
    -   [your-freedom](#yourfreedom)

-   [Add a user account](#useradd)
-   [System D](#systemd)
-   [Interesting repositories](#interesting_repos)
-   [Setup a network connection in Parabola](#network)
    -   [Setting hostname](#network_hostname)
    -   [Network status](#network_status)
    -   [Network interface names](#network_devicenames)
    -   [Network setup](#network_setup)
-   [System maintenance](#system_maintain) - important!
-   [Configuring the desktop](#desktop)
    -   [Install Xorg](#desktop_xorg)
    -   [Xorg keyboard layout](#desktop_kblayout)
    -   [Install LXDE](#desktop_lxde)
    -   [LXDE - clock](#lxde_clock)
    -   [LXDE - font](#lxde_font)
    -   [LXDE - screenlock](#lxde_screenlock)
    -   [LXDE - automounting](#lxde_automount)
    -   [LXDE - disable suspend](#lxde_suspend)
    -   [LXDE - battery monitor](#lxde_battery)
    -   [LXDE - network manager](#lxde_network)

While not strictly related to the libreboot project, this guide is
intended to be useful for those interested in installing Parabola on
their libreboot system.

It details configuration steps that I took after installing the base
system, as a follow up to
[encrypted\_parabola.md](encrypted_parabola.md). This guide is
likely to become obsolete at a later date (due to the volatile
'rolling-release' model that Arch/Parabola both use), but attempts
will be made to maintain it.

**This guide was valid on 2014-09-21. If you see any changes that should
to be made at the present date, please get in touch with the libreboot
project!**

You do not necessarily have to follow this guide word-for-word;
*parabola* is extremely flexible. The aim here is to provide a common
setup that most users will be happy with. While Parabola can seem
daunting at first glance (especially for new GNU+Linux users), with a
simple guide it can provide all the same usability as Debian or Devuan,
without hiding any details from the user.

Paradoxically, as you get more advanced Parabola can actually become
*easier to use* when you want to set up your system in a special way
compared to what most distributions provide. You will find over time
that other distributions tend to *get in your way*.

**This guide assumes that you already have Parabola installed. If you
have not yet installed Parabola, then [this
guide](encrypted_parabola.md) is highly recommended!**

A lot of the steps in this guide will refer to the Arch wiki. Arch is
the upstream distribution that Parabola uses. Most of this guide will
also tell you to read wiki articles, other pages, manuals, and so on. In
general it tries to cherry pick the most useful information but
nonetheless you are encouraged to learn as much as possible. **It might
take you a few days to fully install your system how you like, depending
on how much you need to read. Patience is key, especially for new
users**.

The Arch wiki will sometimes use bad language, such as calling the whole
system Linux, using the term open-source (or closed-source), and it will
sometimes recommend the use of proprietary software. You need to be
careful about this when reading anything on the Arch wiki.

Some of these steps require internet access. I'll go into networking
later but for now, I just connected my system to a switch and did:
    # systemctl start dhcpcd.service
You can stop it later by running:
    # systemctl stop dhcpcd.service\
For most people this should be enough, but if you don't have DHCP on
your network then you should setup your network connection first:\
[Setup network connection in Parabola](#network)

Configure pacman {#pacman_configure}
----------------

pacman (**pac**kage **man**ager) is the name of the package management
system in Arch, which Parabola (as a deblobbed parallel effort) also
uses. Like with 'apt-get' on Debian or Devuan, this can be used to
add/remove and update the software on your computer.

Based on
<https://wiki.parabolagnulinux.org/Installation_Guide#Configure_pacman>
and from reading <https://wiki.archlinux.org/index.php/Pacman> (make
sure to read and understand this, it's very important) and
<https://wiki.parabolagnulinux.org/Official_Repositories>

Updating Parabola {#pacman_update}
-----------------

In the end, I didn't change my configuration for pacman. When you are
updating, resync with the latest package names/versions:

    # pacman -Syy
(according to the wiki, -Syy is better than Sy because it refreshes the
package list even if it appears to be up to date, which can be useful
when switching to another mirror).\
Then, update the system:

    # pacman -Syu

**Before installing packages with 'pacman -S', always update first,
using the notes above.**

Keep an eye out on the output, or read it in /var/log/pacman.log.
Sometimes, pacman will show messages about maintenance steps that you
will need to perform with certain files (typically configurations) after
the update. Also, you should check both the Parabola and Arch home pages
to see if they mention any issues. If a new kernel is installed, you
should also update to be able to use it (the currently running kernel
will also be fine). It's generally good enough to update Parabola once
every week, or maybe twice. As a rolling release distribution, it's a
good idea never to leave your install too outdated; update regularly.
This is simply because of the way the project works; old packages are
deleted from the repositories quickly, once they are updated. A system
that hasn't been updated for quite a while will mean potentially more
reading of previous posts through the website, and more maintenance
work.

The Arch forum can also be useful, if others have the same issue as you
(if you encounter issues, that is). The *Parabola* IRC channel
(\#parabola on freenode) can also help you.

Due to this and the volatile nature of Parabola/Arch, you should only
update when you have at least a couple hours of spare time in case of
issues that need to be resolved. You should never update, for example,
if you need your system for an important event, like a presentation or
sending an email to an important person before an allocated deadline,
and so on.

Relax - packages are well-tested regularly when new updates are made to
the repositories. Separate 'testing' repositories exist for this exact
reason. Despite what many people will tell you, Parabola is fairly
stable and trouble-free, so long as you are aware of how to check for
issues, and are willing to spend some time fixing issues in the rare
event that they do occur.

Maintaining Parabola {#pacman_maintain}
--------------------

Parabola is a very simple distro, in the sense that you are in full
control and everything is made transparent to you. One consequence is
that you also need to know what you are doing, and what you have done
before. In general, keeping notes (such as what I have done with this
page) can be very useful as a reference in the future (if you wanted to
re-install it or install the distro on another computer, for example).

### Cleaning the package cache {#pacman_cacheclean}

**The following is very important as you continue to use, update and
maintain your Parabola system:\
<https://wiki.archlinux.org/index.php/Pacman#Cleaning_the_package_cache>.
Essentially, this guide talks about a directory that has to be cleaned
once in a while, to prevent it from growing too big (it's a cache of
old package information, updated automatically when you do anything in
pacman).**

To clean out all old packages that are cached:

    # pacman -Sc

The wiki cautions that this should be used with care. For example, since
older packages are deleted from the repo, if you encounter issues and
want to revert back to an older package then it's useful to have the
caches available. Only do this if you are sure that you won't need it.

The wiki also mentions this method for removing everything from the
cache, including currently installed packages that are cached:

    # pacman -Scc
This is inadvisable, since it means re-downloading the package again if
you wanted to quickly re-install it. This should only be used when disk
space is at a premium.

### pacman command equivalents {#pacman_commandequiv}

The following table lists other distro package manager commands, and
their equivalent in pacman:\
<https://wiki.archlinux.org/index.php/Pacman_Rosetta>

your-freedom {#yourfreedom}
------------

your-freedom is a package specific to Parabola, and it is installed by
default. What it does is conflict with packages from Arch that are known
to be non-free (proprietary) software. When migrating from Arch (there
is a guide on the Parabola wiki for migrating - converting - an existing
Arch system to a Parabola system), installing your-freedom will also
fail if these packages are installed, citing them as conflicts; the
recommended solution is then to delete the offending packages, and
continue installing *your-freedom*.

Add a user {#useradd}
----------

Based on <https://wiki.archlinux.org/index.php/Users_and_Groups>.

It is important (for security reasons) to create and use a non-root
(non-admin) user account for everyday use. The default 'root' account
is intended only for critical administrative work, since it has complete
access to the entire operating system.

Read the entire document linked to above, and then continue.

Add your user:

    # useradd -m -G wheel -s /bin/bash *yourusername*
Set a password:

    # passwd *yourusername*

Use of the *diceware method* is recommended, for generating secure
passphrases (instead of passwords).

systemd
-------

This is the name of the system used for managing services in Parabola.
It is a good idea to become familiar with it. Read
<https://wiki.archlinux.org/index.php/systemd> and
<https://wiki.archlinux.org/index.php/systemd#Basic_systemctl_usage> to
gain a full understanding. **This is very important! Make sure to read
them.**

An example of a 'service' could be a webserver (such as lighttpd), or
sshd (openssh), dhcp, etc. There are countless others.

<https://bbs.archlinux.org/viewtopic.php?pid=1149530#p1149530> explains
the background behind the decision by Arch (Parabola's upstream
supplier) to use systemd.

The manpage should also help:

    # man systemd
The section on 'unit types' is especially useful.

According to the wiki, systemd 'journal' keeps logs of a size up to
10% of the total size your / partition takes up. on a 60GB root this
would mean 6GB. That's not exactly practical, and can have performance
implications later when the log gets too big. Based on instructions from
the wiki, I will reduce the total size of the journal to 50MiB (the wiki
recommends 50MiB).

Open /etc/systemd/journald.conf and find the line that says:\
*\#SystemMaxUse=*\
Change it to say:\
*SystemMaxUse=50M*

The wiki also recommended a method for forwarding journal output to TTY
12 (accessible by pressing ctrl+alt+f12, and you use ctrl+alt+\[F1-F12\]
to switch between terminals). I decided not to enable it.

Restart journald:

    # systemctl restart systemd-journald

The wiki recommends that if the journal gets too large, you can also
simply delete (rm -Rf) everything inside /var/log/journald/\* but
recommends backing it up. This shouldn't be necessary, since you
already set the size limit above and systemd will automatically start to
delete older records when the journal size reaches it's limit
(according to systemd developers).

Finally, the wiki mentions 'temporary' files and the utility for
managing them.

    # man systemd-tmpfiles
The command for 'clean' is:

    # systemd-tmpfiles --clean
According to the manpage, this *"cleans all files and directories with
an age parameter"*. According to the Arch wiki, this reads information
in /etc/tmpfiles.d/ and /usr/lib/tmpfiles.d/ to know what actions to
perform. Therefore, it is a good idea to read what's stored in these
locations to get a better understanding.

I looked in /etc/tmpfiles.d/ and found that it was empty on my system.
However, /usr/lib/tmpfiles.d/ contained some files. The first one was
etc.conf, containing information and a reference to this manpage:

    # man tmpfiles.d
Read that manpage, and then continue studying all the files.

The systemd developers tell me that it isn't usually necessary to touch
the systemd-tmpfiles utility manually at all.

Interesting repositories {#interesting_repos}
------------------------

Parabola wiki at
<https://wiki.parabolagnulinux.org/Repositories#kernels> mentions about
a repository called \[kernels\] for custom kernels that aren't in the
default base. It might be worth looking into what is available there,
depending on your use case.

I enabled it on my system, to see what was in it. Edit /etc/pacman.conf
and below the 'extra' section add:\
*\[kernels\]\
Include = /etc/pacman.d/mirrorlist*

Now sync with the repository:

    # pacman -Syy

List all available packages in this repository:

    # pacman -Sl kernels

In the end, I decided not to install anything from it but I kept the
repository enabled regardless.

Setup a network connection in Parabola {#network}
--------------------------------------

Read <https://wiki.archlinux.org/index.php/Configuring_Network>.

### Set the hostname {#network_hostname}

This should be the same as the hostname that you set in /etc/hostname
when installing Parabola. You can also do it with systemd (do so now, if
you like):

    # hostnamectl set-hostname *yourhostname*
This writes the specified hostname to /etc/hostname. More information
can be found in these manpages:

    # man hostname
    # info hostname
    # man hostnamectl

Add the same hostname to /etc/hosts, on each line. Example:\
*127.0.0.1 localhost.localdomain localhost myhostname\
::1 localhost.localdomain localhost myhostname*

You'll note that I set both lines; the 2nd line is for IPv6. More and
more ISPs are providing this now (mine does) so it's good to be
forward-thinking here.

The *hostname* utility is part of the *inetutils* package and is in
core/, installed by default (as part of *base*).

### Network Status {#network_status}

According to the Arch wiki,
[udev](https://wiki.archlinux.org/index.php/Udev) should already detect
the ethernet chipset and load the driver for it automatically at boot
time. You can check this in the *"Ethernet controller"* section when
running this command:

    # lspci -v

Look at the remaining sections *'Kernel driver in use'* and *'Kernel
modules'*. In my case it was as follows:\
*Kernel driver in use: e1000e\
Kernel modules: e1000e*

Check that the driver was loaded by issuing *dmesg | grep module\_name*.
In my case, I did:

    # dmesg | grep e1000e

### Network device names {#network_devicenames}

According to
<https://wiki.archlinux.org/index.php/Configuring_Network#Device_names>,
it is important to note that the old interface names like eth0, wlan0,
wwan0 and so on no longer apply. Instead, *systemd* creates device names
starting with en (for enternet), wl (for wifi) and ww (for wwan) with a
fixed identifier that systemd automatically generates. An example device
name for your ethernet chipset would be *enp0s25*, where it is never
supposed to change.

If you want to enable the old names (eth0, wlan0, wwan0, etc), the Arch
wiki recommends adding *net.ifnames=0* to your kernel parameters (in
libreboot context, this would be accomplished by following the
instructions in [grub\_cbfs.md](grub_cbfs.md)).

For background information, read [Predictable Network Interface
Names](http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/)

Show device names:

    # ls /sys/class/net

Changing the device names is possible (I chose not to do it):\
<https://wiki.archlinux.org/index.php/Configuring_Network#Change_device_name>

### Network setup {#network_setup}

I actually chose to ignore most of Networking section on the wiki.
Instead, I plan to set up LXDE desktop with the graphical
network-manager client. Here is a list of network managers:\
<https://wiki.archlinux.org/index.php/List_of_applications/Internet#Network_managers>.
If you need to, set a static IP address (temporarily) using the
networking guide and the Arch wiki, or start the dhcpcd service in
systemd. NetworkManager will be setup later, after installing LXDE.

System Maintenance {#system_maintain}
------------------

Read <https://wiki.archlinux.org/index.php/System_maintenance> before
continuing. Also read
<https://wiki.archlinux.org/index.php/Enhance_system_stability>. **This
is important, so make sure to read them!**

Install smartmontools (it can be used to check smart data. HDDs use
non-free firmware inside, but it's transparent to you but the smart
data comes from it. Therefore, don't rely on it too much):

    # pacman -S smartmontools
Read <https://wiki.archlinux.org/index.php/S.M.A.R.T.> to learn how to
use it.

Configuring the desktop {#desktop}
-----------------------

Based on steps from [General
Recommendations](https://wiki.archlinux.org/index.php/General_recommendations#Graphical_user_interface)
on the Arch wiki. The plan is to use LXDE and LXDM/LightDM, along with
everything else that you would expect on other distributions that
provide LXDE by default.

### Installing Xorg {#desktop_xorg}

Based on <https://wiki.archlinux.org/index.php/Xorg>.

Firstly, install it!

    # pacman -S xorg-server
I also recommend installing this (contains lots of useful tools,
including *xrandr*):

    # pacman -S xorg-server-utils

Install the driver. For me this was *xf86-video-intel* on the ThinkPad
X60. T60 and macbook11/21 should be the same.

    # pacman -S xf86-video-intel
For other systems you can try:

    # pacman -Ss xf86-video- | less
Combined with looking at your *lspci* output, you can determine which
driver is needed. By default, Xorg will revert to xf86-video-vesa which
is a generic driver and doesn't provide true hardware acceleration.

Other drivers (not just video) can be found by looking at the
*xorg-drivers* group:

    # pacman -Sg xorg-drivers

Mostly you will rely on a display manager, but in case you ever want to
start X without one:

    # pacman -S xorg-xinit

<optional>\
   Arch wiki recommends installing these, for testing that X works:\
   \# **pacman -S xorg-twm xorg-xclock xterm**\
   Refer to <https://wiki.archlinux.org/index.php/Xinitrc>. and test X:\
   \# **startx**\
   When you are satisfied, type ***exit*** in xterm, inside the X
session.\
   Uninstall them (clutter. eww): \# **pacman -S xorg-xinit xorg-twm
xorg-xclock xterm**\
</optional>

### Xorg keyboard layout {#desktop_kblayout}

Refer to
<https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg>.

Xorg uses a different configuration method for keyboard layouts, so you
will notice that the layout you set in /etc/vconsole.conf earlier might
not actually be the same in X.

To see what layout you currently use, try this on a terminal emulator in
X:

    # setxkbmap -print -verbose 10

In my case, I wanted to use the Dvorak (UK) keyboard which is quite
different from Xorg's default Qwerty (US) layout.

I'll just say it now: *XkbModel* can be *pc105* in this case (ThinkPad
X60, with a 105-key UK keyboard). If you use an American keyboard
(typically 104 keys) you will want to use *pc104*.

*XkbLayout* in my case would be *gb*, and *XkbVariant* would be
*dvorak*.

The Arch wiki recommends two different methods for setting the keyboard
layout:\
<https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg#Using_X_configuration_files>
and\
<https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg#Using_localectl>.

In my case, I chose to use the *configuration file* method:\
Create the file /etc/X11/xorg.conf.d/10-keyboard.conf and put this
inside:\
*Section "InputClass"\
        Identifier "system-keyboard"\
        MatchIsKeyboard "on"\
        Option "XkbLayout" "gb"\
        Option "XkbModel" "pc105"\
        Option "XkbVariant" "dvorak"\
EndSection*

For you, the steps above may differ if you have a different layout. If
you use a US Qwerty keyboard, then you don't even need to do anything
(though it might help, for the sake of being explicit).

### Install LXDE {#desktop_lxde}

Desktop choice isn't that important to me, so for simplicity I decided
to use LXDE. It's lightweight and does everything that I need. If you
would like to try something different, refer to
<https://wiki.archlinux.org/index.php/Desktop_environment>

Refer to <https://wiki.archlinux.org/index.php/LXDE>.

Install it, choosing 'all' when asked for the default package list:

    # pacman -S lxde obconf

I didn't want the following, so I removed them:

    # pacman -R lxmusic lxtask

I also lazily installed all fonts:

    # pacman -S \$(pacman -Ssq ttf-)

And a mail client:

    # pacman -S icedove

In IceCat, go to *Preferences :: Advanced* and disable *GNU IceCat
Health Report*.

I also like to install these:

    # pacman -S xsensors stress htop

Enable LXDM (the default display manager, providing a graphical login):

    # systemctl enable lxdm.service
It will start when you boot up the system. To start it now, do:

    # systemctl start lxdm.service

Log in with your standard (non-root) user that you created earlier. It
is advisable to also create an xinitrc rule in case you ever want to
start lxde without lxdm. Read
<https://wiki.archlinux.org/index.php/Xinitrc>.

Open LXterminal:
    $ cp /etc/skel/.xinitrc \~
Open .xinitrc and add the following plus a line break at the bottom of
the file.\
*\# Probably not needed. The same locale info that we set before\
\# Based on advice from the LXDE wiki export LC\_ALL=en\_GB.UTF-8\
export LANGUAGE=en\_GB.UTF-8\
export LANG=en\_GB.UTF-8\
\
\# Start lxde desktop\
exec startlxde\
* Now make sure that it is executable:
    $ chmod +x .xinitrc

### LXDE - clock {#lxde_clock}

In **Digital Clock Settings** (right click the clock) I set the Clock
Format to *%Y/%m/%d %H:%M:%S*

### LXDE - font {#lxde_font}

NOTE TO SELF: come back to this later.

### LXDE - screenlock {#lxde_screenlock}

Arch wiki recommends to use *xscreensaver*:

    # pacman -S xscreensaver

Under *Preferences :: Screensaver* in the LXDE menu, I chose *Mode:
Blank Screen Only*, setting *Blank After*, *Cycle After* and *Lock
Screen After* (checked) to 10 minutes.

You can now lock the screen with *Logout :: Lock Screen* in the LXDE
menu.

### LXDE - automounting {#lxde_automount}

Refer to
<https://wiki.archlinux.org/index.php/File_manager_functionality>.

I chose to ignore this for now. NOTE TO SELF: come back to this later.

### LXDE - disable suspend {#lxde_suspend}

When closing the laptop lid, the system suspends. This is annoying at
least to me. NOTE TO SELF: disable it, then document the steps here.

### LXDE - battery monitor {#lxde_battery}

Right click lxde panel and *Add/Remove Panel Items*. Click *Add* and
select *Battery Monitor*, then click *Add*. Close and then right-click
the applet and go to *Battery Monitor Settings*, check the box that says
*Show Extended Information*. Now click *Close*. When you hover the
cursor over it, it'll show information about the battery.

### LXDE - Network Manager {#lxde_network}

Refer to <https://wiki.archlinux.org/index.php/LXDE#Network_Management>.
Then I read: <https://wiki.archlinux.org/index.php/NetworkManager>.

Install Network Manager:

    # pacman -S networkmanager

You will also want the graphical applet:

    # pacman -S network-manager-applet
Arch wiki says that an autostart rule will be written at
*/etc/xdg/autostart/nm-applet.desktop*

I want to be able to use a VPN at some point, so the wiki tells me to
do:

    # pacman -S networkmanager-openvpn

LXDE uses openbox, so I refer to:\
<https://wiki.archlinux.org/index.php/NetworkManager#Openbox>.

It tells me for the applet I need:

    # pacman -S xfce4-notifyd gnome-icon-theme
Also, for storing authentication details (wifi) I need:

    # pacman -S gnome-keyring

I wanted to quickly enable networkmanager:

    # systemctl stop dhcpcd
    # systemctl start NetworkManager
Enable NetworkManager at boot time:

    # systemctl enable NetworkManager

Restart LXDE (log out, and then log back in).

I added the volume control applet to the panel (right click panel, and
add a new applet). I also later changed the icons to use the gnome icon
theme, in *lxappearance*.

Copyright © 2014, 2015 Leah Rowe <info@minifree.org>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: Installing Debian or Devuan GNU+Linux with full disk encryption (including /boot)
...

This guide is written for the Debian distribution, but it should also
work for Devuan with the net installer.

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 its 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 written for Debian net installer. You can download the ISO
from the homepage on [debian.org](https://www.debian.org/). Use this on
the GRUB terminal to boot it from USB (for 64-bit Intel or AMD):\
**set root='usb0'\
linux /install.amd/vmlinuz\
initrd /install.amd/initrd.gz\
boot\
** If you are on a 32-bit system (e.g. X60):\
**set root='usb0'\
linux /install.386/vmlinuz\
initrd /install.386/initrd.gz\
boot**

[This guide](grub_boot_installer.md) shows how to create a boot USB
drive with the Debian ISO image.

**This guide is \*only\* for the GRUB payload. If you use the
depthcharge payload, ignore this section entirely.**

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.

Set a strong user password (lots of lowercase/uppercase, numbers and
symbols).

Use of the *diceware method* is recommended, for generating secure
passphrases (instead of passwords).

when the installer asks you to set up encryption (ecryptfs) for your
home directory, select 'Yes' if you want to: **LUKS is already secure
and performs well. Having ecryptfs on top of it will add noticeable
performance penalty, for little security gain in most use cases. This is
therefore optional, and not recommended. Choose 'no'.**

**Your user password should be different from the LUKS password which
you will set later on. Your LUKS password should, like the user
password, be secure.**

Partitioning
============

Choose 'Manual' partitioning:

-   Select drive and create new partition table
-   Single large partition. The following are mostly defaults:
    -   Use as: physical volume for encryption
    -   Encryption: aes
    -   key size: whatever default is given to you
    -   IV algorithm: whatever default is given to you
    -   Encryption key: passphrase
    -   erase data: Yes (only choose 'No' if it's a new drive that
        doesn't contain your private data)

-   Select 'configure encrypted volumes'
    -   Create encrypted volumes
    -   Select your partition
    -   Finish
    -   Really erase: Yes
    -   (erase will take a long time. be patient)
    -   (if your old system was encrypted, just let this run for about a
        minute to make sure that the LUKS header is wiped out)
-   Select encrypted space:
    -   use as: physical volume for LVM
    -   Choose 'done setting up the partition'
-   Configure the logical volume manager:
    -   Keep settings: Yes
-   Create volume group:
    -   Name: **matrix** (use this exact name)
    -   Select crypto partition
-   Create logical volume
    -   select **matrix** (use this exact name)
    -   name: **rootvol** (use this exact name)
    -   size: default, minus 2048 MB
-   Create logical volume
    -   select **matrix** (use this exact name)
    -   name: **swap** (user this exact name)
    -   size: press enter

Further partitioning
====================

Now you are back at the main partitioning screen. You will simply set
mountpoints and filesystems to use.

-   LVM LV rootvol
    -   use as: btrfs
    -   mount point: /
    -   done setting up partition
-   LVM LV swap
    -   use as: swap area
    -   done setting up partition
-   Now you select 'Finished partitioning and write changes to disk'.

Kernel
======

Installation will ask what kernel you want to use. linux-generic is
fine.

Tasksel
=======

For Debian, use the *MATE* option, or one of the others if you want. The
libreboot project recommends MATE, unless you're saavy enough to choose
something else.

If you want debian-testing, then you should only select barebones
options here and change the entries in /etc/apt/sources.list after
install to point to the new distro, and then run **apt-get update** and
**apt-get dist-upgrade** as root, then reboot and run **tasksel** as
root. This is to avoid downloading large packages twice.

NOTE: If you want the latest up to date version of the Linux kernel,
Debian's kernel is sometimes outdated, even in the testing distro. You
might consider using [this repository](https://jxself.org/linux-libre/)
instead, which contains the most up to date versions of the Linux
kernel. These kernels are also deblobbed, like Debian's kernels, so you
can be sure that no binary blobs are present.

Postfix configuration
=====================

If asked, choose *"No Configuration"* here (or maybe you want to
select something else. It's up to you.)

Install the GRUB boot loader to the master boot record
======================================================

Choose 'Yes'. It will fail, but don't worry. Then at the main menu,
choose 'Continue without a bootloader'. You could also choose 'No'.
Choice is irrelevant here.

*You do not need to install GRUB at all, since in libreboot you are
using the GRUB payload (for libreboot) to boot your system directly.*

Clock UTC
=========

Just say 'Yes'.

Booting your system
===================

At this point, you will have finished the installation. At your GRUB
payload, press C to get to the command line.

Do that:\
    grub> cryptomount -a
    grub> set root='lvm/matrix-rootvol'\
grub> **linux /vmlinuz root=/dev/mapper/matrix-rootvol
cryptdevice=/dev/mapper/matrix-rootvol:root**\
    grub> initrd /initrd.img
    grub> boot

ecryptfs
========

If you didn't encrypt your home directory, then you can safely ignore
this section.

Immediately after logging in, do that:
    $ sudo ecryptfs-unwrap-passphrase

This will be needed in the future if you ever need to recover your home
directory from another system, so write it down and keep the note
somewhere secret. Ideally, you should memorize it and then burn the note
(or not even write it down, and memorize it still)>

Modify grub.cfg (CBFS)
======================

Now you need to set it up so that the system will automatically boot,
without having to type a bunch of commands.

Modify your grub.cfg (in the firmware) [using this
tutorial](grub_cbfs.md); just change the default menu entry 'Load
Operating System' to say this inside:

**cryptomount -a**\
**set root='lvm/matrix-rootvol'**\
**linux /vmlinuz root=/dev/mapper/matrix-rootvol
cryptdevice=/dev/mapper/matrix-rootvol:root**\
**initrd /initrd.img**

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.md) for further guidance on
hardening your GRUB configuration, for security purposes.

Flash the modified ROM using [this tutorial](../install/#flashrom).

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

Copyright © 2014, 2015, 2016 Leah Rowe <info@minifree.org>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)

repo_name: tiveket/libreboot

license: mit


code:
---
title: 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.

Boot Parabola's install environment. [How to boot a GNU+Linux
installer](grub_boot_installer.md).

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

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 > /dev/sda; sync
(Wiping the LUKS header is important, since it has hashed passphrases
and so on. It's 'secure', but 'potentially' a risk).

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.

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.

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.

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

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

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

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.

<troubleshooting>\
   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 </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**\
</troubleshooting>\

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**

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

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.

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.

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> cryptomount -a
    grub> set root='lvm/matrix-root'\
grub> **linux /boot/vmlinuz-linux-libre-lts root=/dev/matrix/root
cryptdevice=/dev/sda1:root**\
    grub> initrd /boot/initramfs-linux-libre-lts.img
    grub> boot\

You could also make it load /boot/vmlinuz-linux-libre-grsec and
/boot/initramfs-linux-libre-grsec.img

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.md](configuring_parabola.md) 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).

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.md](grub_cbfs.md)
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.md) 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 [../install/#flashrom](../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' < grubtest.cfg >
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
[../install/#flashrom](../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

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.

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.md](grub_cbfs.md).

Further security tips
---------------------

<https://wiki.archlinux.org/index.php/Security>.\
<https://wiki.parabolagnulinux.org/User:GNUtoo/laptop>

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

Copyright © 2014, 2015, 2016 Leah Rowe <info@minifree.org>\
Copyright © 2015 Jeroen Quint <jezza@diplomail.ch>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: How to install GNU+Linux on a libreboot system
...

This section relates to preparing, booting and installing a GNU+Linux
distribution on your libreboot system, using nothing more than a USB
flash drive (and *dd*).

-   [Prepare the USB drive (in GNU+Linux)](#prepare)
-   [Installing GNU+Linux with full disk encryption](#encryption)
-   [Debian or Devuan net install?](#debian_netinstall)
-   [Booting ISOLINUX images (automatic method)](#parse_isolinux)
-   [Booting ISOLINUX images (manual method)](#manual_isolinux)
-   [Troubleshooting](#troubleshooting)

**This section is only for the GRUB payload. For depthcharge (used on
CrOS devices in libreboot), instructions have yet to be written in the
libreboot documentation.**

Prepare the USB drive (in GNU+Linux)
------------------------------------

If you downloaded your ISO on an existing GNU+Linux system, here is how
to create the bootable GNU+Linux USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg

Check lsblk to confirm which drive it is:

    $ lsblk

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ sudo umount /dev/sdX\*
    # umount /dev/sdX\*

dmesg told you what device it is. Overwrite the drive, writing your
distro ISO to it with dd. For example:

    $ sudo dd if=gnulinux.iso of=/dev/sdX bs=8M; sync
    # dd if=gnulinux.iso of=/dev/sdX bs=8M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Prepare the USB drive (in NetBSD)
---------------------------------

[This
page](https://wiki.netbsd.org/tutorials/how_to_install_netbsd_from_an_usb_memory_stick/)
on the NetBSD website shows how to create a NetBSD bootable USB drive
from within NetBSD itself. You should use the *dd* method documented
there. This will also work with any GNU+Linux ISO image.

Prepare the USB drive (in FreeBSD)
----------------------------------

[This page](https://www.freebsd.org/doc/handbook/bsdinstall-pre.html) on
the FreeBSD website shows how to create a bootable USB drive for
installing FreeBSD. Use the *dd* on that page. You can also use the same
instructions with any GNU+Linux ISO image..

Prepare the USB drive (in LibertyBSD or OpenBSD)
------------------------------------------------

If you downloaded your ISO on a LibertyBSD or OpenBSD system, here is
how to create the bootable GNU+Linux USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg | tail
Check to confirm which drive it is, for example, if you think its sd3:

    $ disklabel sd3

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ doas umount /dev/sd3i

dmesg told you what device it is. Overwrite the drive, writing the
OpenBSD installer to it with dd. For example:

    $ doas dd if=gnulinux.iso of=/dev/rsdXc bs=1M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Installing GNU+Linux with full disk encryption
----------------------------------------------

-   [Installing Debian or Devuan GNU+Linux with full disk encryption
    (including /boot)](encrypted_debian.md)
-   [Installing Parabola GNU+Linux with full disk encryption (including
    /boot)](encrypted_parabola.md)

Debian or Devuan net install?
-----------------------------

Download the Debian or Devuan net installer. You can download the ISO
from the homepage on [debian.org](https://www.debian.org/), or [the
Devuan homepage](https://www.devuan.org/) for Devuan. Use this on the
GRUB terminal to boot it from USB (for 64-bit Intel or AMD):\
**set root='usb0'\
linux /install.amd/vmlinuz\
initrd /install.amd/initrd.gz\
boot\
** If you are on a 32-bit system (e.g. X60):\
**set root='usb0'\
linux /install.386/vmlinuz\
initrd /install.386/initrd.gz\
boot**\
We recommend using the *MATE* desktop.

Booting ISOLINUX images (automatic method)
------------------------------------------

Boot it in GRUB using the *Parse ISOLINUX config (USB)* option. A new
menu should appear in GRUB, showing the boot options for that distro;
this is a GRUB menu, converted from the usual ISOLINUX menu provided by
that distro.

Booting ISOLINUX images (manual method)
---------------------------------------

*These are generic instructions. They may or may not be correct for your
distribution. You must adapt them appropriately, for whatever GNU+Linux
distribution it is that you are trying to install.*

If the ISOLINUX parser or *Search for GRUB configuration* options won't
work, then press C in GRUB to access the command line.\
    grub> ls
Get the device from above output, eg (usb0). Example:\
    grub> cat (usb0)/isolinux/isolinux.cfg\
Either this will show the ISOLINUX menuentries for that ISO, or link to
other .cfg files, for example /isolinux/foo.cfg.\
If it did that, then you do:\
    grub> cat (usb0)/isolinux/foo.cfg
And so on, until you find the correct menuentries for ISOLINUX. **The
file */isolinux/foo.cfg* is a fictional example. Do not actually use
this example, unless you actually have that file, if it is
appropriate.**

For Debian or Devuan (and other debian-based distros), there are
typically menuentries listed in */isolinux/txt.cfg* or
*/isolinux/gtk.cfg*. For dual-architecture ISO images (i686 and
x86\_64), there may be separate files/directories for each architecture.
Just keep searching through the image, until you find the correct
ISOLINUX configuration file. NOTE: Debian 8.6 ISO only lists 32-bit boot
options in txt.cfg. This is important if you want 64-bit booting on your
system. Devuan versions based on Debian 8.x may also have the same
issue.

Now look at the ISOLINUX menuentry. It'll look like:\
**kernel /path/to/kernel\
append PARAMETERS initrd=/path/to/initrd MAYBE\_MORE\_PARAMETERS\
** GRUB works the same way, but in it's own way. Example GRUB
commands:\
    grub> set root='usb0'\
    grub> linux /path/to/kernel PARAMETERS MAYBE\_MORE\_PARAMETERS
    grub> initrd /path/to/initrd
    grub> boot
Note: *usb0* may be incorrect. Check the output of the *ls* command in
GRUB, to see a list of USB devices/partitions. Of course this will vary
from distro to distro. If you did all of that correctly, then it should
now be booting your USB drive in the way that you specified.

Troubleshooting
===============

Most of these issues occur when using libreboot with coreboot's 'text
mode' instead of the coreboot framebuffer. This mode is useful for
booting payloads like memtest86+ which expect text-mode, but for
GNU+Linux distributions it can be problematic when they are trying to
switch to a framebuffer because it doesn't exist.

In most cases, you should use the vesafb ROM images. Example filename:
libreboot\_ukdvorak\_vesafb.rom.

parabola won't boot in text-mode
---------------------------------

Use one of the ROM images with vesafb in the filename (uses coreboot
framebuffer instead of text-mode).

debian-installer graphical corruption in text-mode (Debian and Devuan)
----------------------------------------------------------------------

When using the ROM images that use coreboot's "text mode" instead of
the coreboot framebuffer, booting the Debian or Devuan net installer
results in graphical corruption because it is trying to switch to a
framebuffer which doesn't exist. Use that kernel parameter on the
'linux' line when booting it:\
**vga=normal fb=false**

This forces debian-installer to start in text-mode, instead of trying to
switch to a framebuffer.

If selecting text-mode from a GRUB menu created using the ISOLINUX
parser, you can press E on the menu entry to add this. Or, if you are
booting manually (from GRUB terminal) then just add the parameters.

This workaround was found on the page:
<https://www.debian.org/releases/stable/i386/ch05s04.html>. It should
also work for Debian, Devuan and any other apt-get distro that provides
debian-installer (text mode) net install method.

Copyright © 2014, 2015, 2016 Leah Rowe <info@minifree.org>\
Copyright © 2016 Scott Bonds <scott@ggr.com>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: How to replace the default GRUB configuration file
...

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

A libreboot (or coreboot) ROM image is not simply "flat"; there is an
actual filesystem inside called CBFS (coreboot filesystem). A utility
called 'cbfstool' allows you to change the contents of the ROM image.
In this case, libreboot is configured such that the 'grub.cfg' and
'grubtest.cfg' files exist directly inside CBFS instead of inside the
GRUB payload 'memdisk' (which is itself stored in CBFS).

You can either modify the GRUB configuration stored in the flash chip,
or you can modify a GRUB configuration file on the main storage which
the libreboot GRUB payload will automatically search for.

Here is an excellent writeup about CBFS (coreboot filesystem):
<http://lennartb.home.xs4all.nl/coreboot/col5.html>.

**This guide is \*only\* for the GRUB payload. If you use the
depthcharge payload, ignore this section entirely.**

Table of Contents
=================

-   [Introduction](#introduction)
-   [1st option: don't re-flash](#option1_dont_reflash)
-   [2nd option: re-flash](#option2_reflash)
    -   [Acquire the necessary utilities](#tools)
    -   [Acquiring the correct ROM image](#rom)
    -   [Extract grubtest from the ROM image](#extract_testconfig)
    -   [Re-insert the modified grubtest.cfg into the ROM
        image](#reinsert_modified_testconfig)
    -   [Testing](#testing)
    -   [Final steps](#final_steps)

Introduction
------------

Download the latest release from [libreboot.org](/)\
**If you downloaded from git, refer to
[../git/\#build\_meta](../git/#build_meta) before continuing.**

There are several advantages to modifying the GRUB configuration stored
in CBFS, but this also means that you have to flash a new libreboot ROM
image on your system (some users feel intimidated by this, to say the
least). Doing so can be risky if not handled correctly, because it can
result in a bricked system (recovery is easy if you have the
[equipment](../install/bbb_setup.md) for it, but most people don't).
If you aren't up to that then don't worry; it is possible to use a
custom GRUB menu without flashing a new image, by loading a GRUB
configuration from a partition on the main storage instead.

1st option: don't re-flash {#option1_dont_reflash}
---------------------------

By default, GRUB in libreboot is configured to scan all partitions on
the main storage for /boot/grub/libreboot\_grub.cfg or
/grub/libreboot\_grub.cfg(for systems where /boot is on a dedicated
partition), and then use it automatically.

Simply create your custom GRUB configuration and save it to
**/boot/grub/libreboot\_grub.cfg** on the running system. The next time
you boot, GRUB (in libreboot) will automatically switch to this
configuration file. **This means that you do not have to re-flash,
recompile or otherwise modify libreboot at all!**

Ideally, your distribution should automatically generate a
libreboot\_grub.cfg file that is written specifically under the
assumption that it will be read and used on a libreboot system that uses
GRUB as a payload. If your distribution does not do this, then you can
try to add that feature yourself or politely ask someone involved with
or otherwise knowledgeable about the distribution to do it for you. The
libreboot\_grub.cfg could either contain the full configuration, or it
could chainload another GRUB ELF executable (built to be used as a
coreboot payload) that is located in a partition on the main storage.

If you want to adapt a copy of the existing *libreboot* GRUB
configuration and use that for the libreboot\_grub.cfg file, then follow
[\#tools](#tools), [\#rom](#rom) and
[\#extract\_testconfig](#extract_testconfig) to get the
***grubtest.cfg***. Rename ***grubtest.cfg*** to
***libreboot\_grub.cfg*** and save it to ***/boot/grub/*** on the
running system where it is intended to be used. Modify the file at that
location however you see fit, and then stop reading this guide (the rest
of this page is irrelevant to you); **in libreboot\_grub.cfg on disk, if
you are adapting it based on grub.cfg from CBFS then remove the check
for libreboot\_grub.cfg otherwise it will loop.**.

2nd option: re-flash {#option2_reflash}
--------------------

You can modify what is stored inside the flash chip quite easily. Read
on to find out how.

Acquire the necessary utilities {#tools}
-------------------------------

Use ***cbfstool*** and ***flashrom***. There are available in the
*libreboot\_util* release archive, or they can be compiled (see
[../git/\#build\_flashrom](../git/#build_flashrom)). Flashrom is also
available from the repositories:
    # pacman -S flashrom

Acquiring the correct ROM image {#rom}
-------------------------------

You can either work directly with one of the ROM images already included
in the libreboot ROM archives, or re-use the ROM that you have currently
flashed. For the purpose of this tutorial it is assumed that your ROM
image file is named *libreboot.rom*, so please make sure to adapt.

ROM images are included pre-compiled in libreboot. You can also dump
your current firmware, using flashrom:
    $ sudo flashrom -p internal -r libreboot.rom
    # flashrom -p internal -r libreboot.rom
If you are told to specify the chip, add the option **-c {your chip}**
to the command, for example:

    # flashrom -c MX25L6405 -p internal -r libreboot.rom

Extract grubtest.cfg from the ROM image {#extract_testconfig}
---------------------------------------

You can check the contents of the ROM image, inside CBFS:

    $ cd \.../libreboot\_util/cbfstool** $ ./cbfstool libreboot.rom
print**

The files *grub.cfg* and *grubtest.cfg* should be present. grub.cfg is
loaded by default, with a menuentry for switching to grubtest.cfg. In
this tutorial, you will first modify and test *grubtest.cfg*. This is to
reduce the possibility of bricking your device, so DO NOT SKIP THIS!

Extract grubtest.cfg from the ROM image:

    $ ./cbfstool libreboot.rom extract -n grubtest.cfg -f grubtest.cfg

Modify the grubtest.cfg accordingly.

Re-insert the modified grubtest.cfg into the ROM image {#reinsert_modified_testconfig}
------------------------------------------------------

Once your grubtest.cfg is modified and saved, delete the unmodified
config from the ROM image:

    $ ./cbfstool libreboot.rom remove -n grubtest.cfg

Next, insert the modified version:\
**\$ ./cbfstool libreboot.rom add -n grubtest.cfg -f grubtest.cfg -t
raw**

Testing
-------

**Now you have a modified ROM. Refer back to
[../install/\#flashrom](../install/#flashrom) for information on how to
flash it.
    $ cd /libreboot\_util** \# **./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. Once you have done that, shut down and then boot
up with your new test configuration.**

Choose (in GRUB) the menu entry that switches to grubtest.cfg. If it
works, then your config is safe and you can continue below.

**If it does not work like you want it to, if you are unsure or
sceptical in any way, then re-do the steps above 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.**

Final steps {#final_steps}
-----------

When you are satisfied booting from grubtest.cfg, you can create a copy
of grubtest.cfg, called grub.cfg. This is the same except for one
difference: the menuentry 'Switch to grub.cfg' will be 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). From /libreboot\_util/cbfstool, do:\
\$ **sed -e 's:(cbfsdisk)/grub.cfg:(cbfsdisk)/grubtest.cfg:g' -e
's:Switch to grub.cfg:Switch to grubtest.cfg:g' < grubtest.cfg >
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. Again, refer back to
[../install/\#flashrom](../install/#flashrom) for information on how to
flash it. It's the same method as you used before. Shut down and then
boot up with your new configuration.**

Copyright © 2014, 2015 Leah Rowe <info@minifree.org>\
Copyright © 2015 Jeroen Quint <jezza@diplomail.ch>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: GRUB hardening
...

This guide deals with various ways in which you can harden your GRUB
configuration, for security purposes. These steps are optional, but
highly recommended by the Libreboot project.

GRUB secure boot with GPG
=========================

This uses the free implementation of the GPG standard for encryption and
signing/verifying data. We will be using this for checking the signature
of a Linux kernel at boot time. More information about GPG can be found
on the [GPG project website](https://www.gnu.org/software/gnupg/). GRUB
has some GPG support built in, for checking signatures.

This tutorial assumes you have a libreboot image (rom) that you wish to
modify, to which we shall henceforth refer to as "my.rom". This
tutorial modifies grubtest.cfg, this means signing and password
protection will work after switching to it in the main boot menu and
bricking due to incorrect configuration will be impossible. After you
are satisfied with the setup, you should transfer the new settings to
grub.cfg to make your machine actually secure.

First extract the old grubtest.cfg and remove it from the libreboot
image:

    cbfstool my.rom extract -n grubtest.cfg -f my.grubtest.cfg
    cbfstool my.rom remove -n grubtest.cfg

Helpful links:

-   [GRUB manual
    \#security](https://www.gnu.org/software/grub/manual/html_node/Security.html#Security)
-   [GRUB info
    pages](http://git.savannah.gnu.org/cgit/grub.git/tree/docs/grub.texi)
-   [SATA connected storage considered dangerous until proven
    otherwise.](../../faq.md#firmware-hddssd)
-   [Coreboot GRUB security
    howto](https://www.coreboot.org/GRUB2#Security)

GRUB Password
=============

The security of this setup depends on a good GRUB password as GPG
signature checking can be disabled through the interactive console:

    set check_signatures=no

This is good in that it allows you to occasionally boot unsigned liveCDs
and such. You may think of supplying signatures on an usb key, but the
signature checking code currently looks for
</path/to/filename>.sig when verifying </path/to/filename>
and as such it is not possible to supply signatures in an alternate
location.

Note that this is not your LUKS password, but it's a password that you
have to enter in order to use "restricted" functionality (such as
console). This protects your system from an attacker simply booting a
live USB and re-flashing your firmware. **This should be different than
your LUKS passphrase and user password.**

Use of the *diceware method* is recommended, for generating secure
passphrases (as opposed to passwords). Diceware method involves using
dice to generate random numbers, which are then used as an index to pick
a random word from a large dictionary of words. You can use any language
(e.g. English, German). Look it up on a search engine. Diceware method
is a way to generate secure passphrases that are very hard (almost
impossible, with enough words) to crack, while being easy enough to
remember. On the other hand, most kinds of secure passwords are hard to
remember and easier to crack. Diceware passphrases are harder to crack
because of far higher entropy (there are many words available to use,
but only about 50 commonly used symbols in pass*words*).

-->
The GRUB password can be entered in two ways:

-   plaintext
-   protected with [PBKDF2](https://en.wikipedia.org/wiki/Pbkdf2)

We will (obviously) use the later. Generating the PBKDF2 derived key is
done using the **grub-mkpasswd-pbkdf2** utility. You can get it by
installing GRUB version 2. Generate a key by giving it a password:
    grub-mkpasswd-pbkdf2

Its output will be a string of the following form:
grub.pbkdf2.sha512.10000.HEXDIGITS.MOREHEXDIGITS

Now open my.grubtest.cfg and put the following before the menu entries
(prefered above the functions and after other directives). Of course use
the pbdkf string that you had generated yourself:

    set superusers="root"
    password_pbkdf2 root grub.pbkdf2.sha512.10000.711F186347156BC105CD83A2ED7AF1EB971AA2B1EB2640172F34B0DEFFC97E654AF48E5F0C3B7622502B76458DA494270CC0EA6504411D676E6752FD1651E749.8DD11178EB8D1F633308FD8FCC64D0B243F949B9B99CCEADE2ECA11657A757D22025986B0FA116F1D5191E0A22677674C994EDBFADE62240E9D161688266A711

Obviously, replace it with the correct hash that you actually got for
the password that you entered. Meaning, not the hash that you see above!

As enabling password protection as above means that you have to input it
on every single boot, we will make one menu entry work without it.
Remember that we will have GPG signing active, thus a potential attacker
will not be able to boot an arbitrary operating system. We do this by
adding option **--unrestricted** to a menuentry definition:

    menuentry 'Load Operating System (incl. fully encrypted disks)  [o]' --hotkey='o' --unrestricted {
    ...

Another good thing to do, if we chose to load signed on-disk GRUB
configurations, is to remove (or comment out) **unset superusers** in
function try\_user\_config:

    function try_user_config {
       set root="${1}"
       for dir in boot grub grub2 boot/grub boot/grub2; do
          for name in '' autoboot_ libreboot_ coreboot_; do
             if [ -f /"${dir}"/"${name}"grub.cfg ]; then
                #unset superusers
                configfile /"${dir}"/"${name}"grub.cfg
             fi
          done
       done
    }

Why? We allowed booting normally without entering a password above. When
we unset superusers and then load a signed GRUB configuration file, we
can easily use the command line as password protection will be
completely disabled. Disabling signature checking and booting whatever
an attacker wants is then just a few GRUB commands away.

As far as basic password setup is concerned we are done and we can now
move on to signing.

GPG keys
========

First generate a GPG keypair to use for signing. Option RSA (sign only)
is ok.

**Warning:** GRUB does not read ASCII armored keys. When attempting to
trust \... a key filename it will print error: bad signature

    mkdir --mode 0700 keys
    gpg --homedir keys --gen-key
    gpg --homedir keys --export-secret-keys --armor > boot.secret.key # backup
    gpg --homedir keys --export > boot.key

Now that we have a key, we can sign some files with it. We have to sign:

-   a kernel
-   (if we have one) an initramfs
-   (if we wish to transfer control to it) an on-disk grub.cfg
-   grubtest.cfg (this is so one can go back to grubtest.cfg after
    signature checking is enforced. You can always get back to grub.cfg
    by pressing ESC, but afterwards grubtest.cfg is not signed and it
    will not load.

Suppose that we have a pair of **my.kernel** and **my.initramfs** and an
on-disk **libreboot\_grub.cfg**. We sign them by issuing the following
commands:
    gpg --homedir keys --detach-sign my.initramfs
    gpg --homedir keys --detach-sign my.kernel
    gpg --homedir keys --detach-sign libreboot_grub.cfg
    gpg --homedir keys --detach-sign my.grubtest.cfg

Of course some further modifications to my.grubtest.cfg will be
required. We have to trust the key and enable signature enforcement (put
this before menu entries):

    trust (cbfsdisk)/boot.key
    set check_signatures=enforce

What remains now is to include the modifications into the image (rom):

    cbfstool my.rom add -n boot.key -f boot.key -t raw
    cbfstool my.rom add -n grubtest.cfg -f my.grubtest.cfg -t raw
    cbfstool my.rom add -n grubtest.cfg.sig -f my.grubtest.cfg.sig -t raw

\... and flashing it.

Copyright © 2017 Fedja Beader <fedja@protonmail.ch>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: GNU+Linux installation instructions
...

This section relates to dealing with GNU+Linux distributions: preparing
bootable USB drives, changing the default GRUB menu and so on.

**This section is only for the \*GRUB\* payload. For depthcharge,
instructions have yet to be written.**

-   [How to install GNU+Linux on a libreboot
    system](grub_boot_installer.md)

-   [How to replace the default GRUB configuration file on a libreboot
    system](grub_cbfs.md)
-   [Installing Parabola or Arch GNU+Linux-libre with full disk
    encryption (including /boot)](encrypted_parabola.md)
    -   Follow-up tutorial: [Configuring Parabola
        (post-install)](configuring_parabola.md)
-   [Installing Debian or Devuan GNU+Linux-libre with full disk
    encryption (including /boot)](encrypted_debian.md)
-   [How to harden your GRUB configuration, for
    security](grub_hardening.md)

Copyright © 2014, 2015 Leah Rowe <info@minifree.org>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: GRUB payload
...

This section relates to the GRUB payload used in libreboot.

-   [Changing the background image in GRUB](#grub_background)
-   [Setting font in GRUB](#grub_font)
-   [GRUB keyboard layouts](#grub_keyboard)
    -   [Custom keyboard layout in GRUB](#grub_custom_keyboard)
    -   [UK Dvorak keyboard layout in GRUB](#grub_ukdvorak_keyboard)

Changing the background image in GRUB {#grub_background}
=====================================

Use cbfstool from libreboot\_util, or
libreboot\_src/coreboot/util/cbfstool/ if you want to build from source.

./cbfstool yourrom.rom remove background.png -n background.png\
./cbfstool yourrom.rom add -f background.png -n background.png -t raw

When you've done this, re-flash your ROM and you should have a new
background at boot time.

Setting font in GRUB (for reference) {#grub_font}
====================================

You don't need to do this unless you would like to change the default
font yourself. (this is just for reference. It has already been done for
you)

The old font used was Unifont, and this had some missing characters: for
instance, the border showed ??? characters instead of lines.

I tried DeJavu Sans Mono from this website:
[dejavu-fonts.org](http://dejavu-fonts.org/wiki/Download)

Specifically, the version that I chose was the latest at the time of
writing (Saturday 21 June 2014): [this
one](http://sourceforge.net/projects/dejavu/files/dejavu/2.34/dejavu-fonts-ttf-2.34.tar.bz2)

This is a free font that is also contained in GNU+Linux distributions
like Debian, Devuan or Parabola.

    $ cd libreboot\_src/grub
compile grub (the build scripts info on how to do this)\
come back out into libreboot\_src/resources/grub:

    $ cd ../libreboot\_src/resources/grub/font

I took Dejavu Sans Mono from dejavu (included in this version of
libreboot) and did:\
**\$ ../../../grub/grub-mkfont -o dejavusansmono.pf2
dejavu-fonts-ttf-2.34/ttf/DejaVuSansMono.ttf**

I then added the instructions to 'gen.sh' script in grub-assemble to
include resources/grub/dejavusansmono.pf2 in all of the ROM images, at
the root of the GRUB memdisk.\
I then added that instructions to the grub.cfg files (to load the
font):\
**loadfont (memdisk)/dejavusansmono.pf2**

GRUB keyboard layouts (for reference) {#grub_keyboard}
=====================================

Custom keyboard layout in GRUB (for reference) {#grub_custom_keyboard}
----------------------------------------------

Keymaps are stored in resources/utilities/grub-assemble/keymap/.

Example (French Azerty):

    $ ckbcomp fr > frazerty
\
Go in grub directory:\
**cat frazerty | ./grub/grub-mklayout -o frazerty.gkb**

You must make sure that the files are named keymap and keymap.gkb (where
'keymap' can be whatever you want).

Then from the above example, you would put **frazerty** in
**resources/utilities/grub-assemble/keymap/original/** and the
**frazerty.gkb** file goes under
**resources/utilities/grub-assemble/keymap/**

The build scripts will automatically see this, and automatically build
ROM images with your custom layout (given the name) and include them
under bin. Example: **libreboot\_frazerty.rom**.

UK Dvorak keyboard layout in GRUB (for reference) {#grub_ukdvorak_keyboard}
-------------------------------------------------

ukdvorak had to be created manually, based on usdvorak. diff them (under
resources/utilities/grub-assemble/keymap/original) to see how ukdvorak
file was created

    $ cat ukdvorak | ./grub/grub-mklayout -o ukdvorak.gkb

Copyright © 2014 Leah Rowe <info@minifree.org>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)