ThinkPad X220: Arch Linux Notes
UNDER CONSTRUCTION: The document is currently being modified! |
This is a compilation of information I have scoured off the net in order to get my ThinkPad X220 running in the best possible configuration possible for my needs. If you need assistance installing Arch Linux, refer to the tutorial linked above.
LUKS Preparation
Begin by downloading the ThinkPad Drive Erase Utility, this is used for resetting cryptographic keys and erasing solid state drives. This utility is a must as all SSDs are put into the frozen state on boot due to Lenovo's BIOS. Then use El Torito to convert it into a bootable image file and dd it to your USB disk.
# geteltorito.pl -o securewipe.img 83fd04ww.iso # sudo dd if=securewipe.img of=/dev/sdX bs=10M |
WARNING: Using the disk erase will prompt you with a code to write down and then enter after a reboot. DO NOT skip this part. |
Customization
Keeping the Boot Log on TTY1
In order to stop Arch Linux from clearing the screen on boot we can add the i915 module to MODULES inside of /etc/mkinitcpio.conf and then regenerate our kernel images.
# sudo sed -i -r 's/^MODULES="([a-z0-9 _-]+)"/MODULES="\1 i915"/' /etc/mkinitcpio.conf # sudo mkinitcpio -p linux |
Then create a directory for getty overrides and create one with the following.
# sudo mkdir /etc/systemd/system/getty@tty1.service.d # sudo vim /etc/systemd/system/getty@tty1.service.d/noclear.conf |
[Service] TTYVTDisallocate=no |
Traditional Device Node Names
To translate the predictable device node names back into traditional ones, can create the following. You can use the vim command :r !cat /sys/class/net/wlp3s0/address, replacing the device node respectively, in order to get the MAC Address of each device.
# vim /etc/udev/rules.d/10-network.rules |
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="MAC_ADDRESS_FOR_NIC", NAME="wired0" SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="MAC_ADDRESS_FOR_WIFI", NAME="wifi0" |
Console Fonts
Everyone have their own opinion, you can pull up a list with ls /usr/share/kbd/consolefonts. To test out a font use setfont, issue the command by itself to return to the default. You can also issue showconsolefont to show a list of all available characters.
# setfont -m 8859-2 gr928-8x16-thin # showconsolefont |
We can set this at boot by adding it to /etc/vconsole.conf.
# echo -e "FONT=gr928-8x16-thin\nMAP=8859-2" | sudo tee --append /etc/vconsole.conf |
Hardware
Battery/CPU
Install TLP and related packages. Then enable it with systemd, don't forget to mask the required services (skip NetworkManager if you use this).
# yaourt -S tlp tp_smapi acpi_call # sudo systemctl enable tlp # sudo systemctl enable tlp-sleep |
# sudo systemctl mask NetworkManager.service # sudo systemctl mask systemd-rfkill.service # sudo systemctl mask systemd-rfkill.socket |
Then edit the tlp config file to setup your TLP profile.
GitHub: My current tlp config |
# sudo vim /etc/defaults/tlp |
TLP status can be shown with the following:
# sudo tlp-stat |
It is also a good idea to install PowerTOP in order to monitor power usage.
# yaort -S powertop |
Fan Control
Install thinkfan, default configuration is installed into /usr/lib/modprobe.d/thinkpad_acpi.conf.
# yaourt -S acpi lm_sensors thinkfan |
Then detect the hardware monitors chips that are available. Then re-enable the thinkpad_acpi kernel module to update with the new config.
# sudo sensors-detect # sudo modprobe thinkpad_acpi |
To show the current thermal and cooling information use acpi.
# sudo acpi -V |
To show the current fan speed and level.
# sudo cat /proc/acpi/ibm/fan |
Make the changes to point it to the right temperature reading, you can use :r !sudo find /sys/devices -type f -name "temp*_input" in order to paste all the monitors into the file.
GitHub: My current thinkfan.conf |
# sudo vim /etc/thinkfan.conf |
You can verify the config is written correctly with the following command.
# sudo thinkfan -n |
Finally enable and start thinkfan.
# sudo systemctl enable thinkfan # sudo systemctl start thinkfan |
Kernel
For added power savings we can change a few kernel options. Enabling Intel i915 RC6 is a feature that allows the GPU to enter a lower power state during GPU idle. Enabling i915 framebuffer compression reduces the memory bandwidth on screen refreshes, reported to save ~0.6W on an X220. Finally the DRM vblank off delay reduces wakup events and theoretically saves power.
To enable all of these add the following to the options line in your /boot/EFI/BOOT/refind.conf file for Arch Linux.
i915.enable_rc6=1 i915.enable_fbc=1 drm.vblankoffdelay=1 i915.semaphores=1 |
SD Card + LUKS
Use an SD Card in order to bolster the X220 disk space. This will take you through adding one with LUKS and ext4.
First re-partition the SD Card.
# sudo sgdisk -Z -o /dev/mmcblk0 # sudo sgdisk -n 1:0:-0 -t 1:8300 /dev/mmcblk0 # sudo sgdisk -c 1:"SD Card" /dev/mmcblk0 |
Setup LUKS on the SD Card; confirm to erase and set a password.
# sudo cryptsetup luksFormat /dev/mmcblk0p1 |
Then decrypt the LUKS partition, giving it the name sdcard.
# sudo cryptsetup luksOpen /dev/mmcblk0p1 sdcard |
Then format it with speed-optimized options.
# sudo mkfs.ext4 /dev/mapper/sdcard # sudo tune2fs -o journal_data_writeback /dev/mapper/sdcard # sudo tune2fs -O ^has_journal /dev/mapper/sdcard # sudo e2fsck -f /dev/mapper/sdcard |
Then make a folder for it and set it up to mount on boot.
# sudo mkdir /mnt/sdcard && sudo chown kyau:users /mnt/sdcard |
Create a keyfile for the SD Card in the root folder and set the proper permissions.
# sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4 # sudo chmod 0400 /root/keyfile |
Add the keyfile to the LUKS partition.
# sudo cryptsetup luksAddKey /dev/mmcblk0p1 /root/keyfile |
With the partition setup, get the UUID of the partition then add a line to /etc/crypttab so that it gets decrypted on boot.
# lsblk -f |
# echo -e "sdcard\tUUID=XXXXUUID-LUKS-SDXX-CARD-XXXXXXXXXXXX\t/root/keyfile" | sudo tee --append /etc/crypttab |
Finally add a line to /etc/fstab so that it also gets automatically mounted on boot.
# echo -e "/dev/mapper/sdcard\t/mnt/sdcard\text4\tnoatime,nodiratime,data=writeback,uid=kyau,gid=users\t0\t0" | sudo tee --append /etc/fstab |
SSD
First if you want to enable TRIM on boot, create a systemd service. Also create a systemd service for adjusting the governor on system boot-up.
# sudo vim /etc/systemd/system/ssd-trim.service |
[Unit] Description=Runs fstrim on the SSD Requires=multi-user.target After=multi-user.target [Service] Type=oneshot RemainAfterExit=no ExecStart=/usr/bin/fstrim -v / [Install] WantedBy=multi-user.target |
Then enable the service.
# sudo systemctl enable ssd-trim |
To monitor the HDD or SSD installed you need to install the smartmontools package.
# yaourt -S smartmontools |
You can view an overall health assessment with the following:
# sudo smartctl -H /dev/sdX |
Enable and start the smartd systemd service to enable SMART monitoring for all disks.
# sudo systemctl enable smartd |
We can also have SMART email us and run a script for notifications on SMART errors.
# sudo sed -i 's/^DEVICESCAN/DEVICESCAN -m address\@domain.com -M exec \/usr\/bin\/smartdnotify/' /etc/smartd.conf |
Then create the /usr/bin/smartdnotify script (replacing both instances of kyau with your username).
# sudo vim /usr/bin/smartdnotify |
#!/bin/sh sudo -u kyau DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/kyau/bus notify-send "S.M.A.R.T Error ($SMARTD_FAILTYPE)" "$SMARTD_MESSAGE" --icon=dialog-warning |
# sudo chmod +x /usr/bin/smartdnotify |
Then you can start the service.
# sudo systemctl start smartd |
Video
I did not personally experience have issues with this, but it might be applicable to some. |
To fix the Intel HD 3000 graphics showing tearing during video playback or other fast movement on the screen.
# echo -e 'Section "Device"\n Identifier "Intel HD 3000 Graphics"\n Driver "intel"\n Option "TearFree" "true"\nEndSection' | sudo tee /etc/X11/xorg.conf.d/20-intel.conf |
Applications
Personally, I keep a running backup of all of my dotfiles on GitHub along with a script to redo all the symbolic links. This makes the process as simple as:
# git clone https://github.com/kyau/dotfiles && cd dotfiles && ./setup.sh && logout |
Once Xorg is installed and my shell environment and config files are in place, I usually then run my application install script.
GitHub: My current install-x220.sh. |
LVM on LUKS Auto-Login
To setup auto-login on TTY1 edit the service.
# sudo systemctl edit getty@tty1 |
Paste in the following (changing the username accordingly):
[Service] ExecStart= ExecStart=-/usr/bin/agetty --autologin kyau --noclear %I $TERM |
Auto-Start Xorg on Graphical Boot only
Next to get Xorg to auto-start only when systemd has reached a graphical.target one can merely use a little bash magic. Add the following to the end of ~/.bashrc.
SYSTEMD_TARGET=`systemctl list-units --type target | g graphical | sed 's/ / /' | cut -d " " -f3` if [ "$SYSTEMD_TARGET" = "active" ]; then if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then exec startx fi fi |