Add NixOS on Framework
This commit is contained in:
		
							parent
							
								
									abdf76368d
								
							
						
					
					
						commit
						12aae0afb4
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,3 @@ | |||||||
| .hugo_build.lock | .hugo_build.lock | ||||||
| public | public | ||||||
|  | *# | ||||||
|  | |||||||
							
								
								
									
										210
									
								
								content/post/2023-01-29-NixOS-on-Framework.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								content/post/2023-01-29-NixOS-on-Framework.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | |||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | layout:     post | ||||||
|  | title:      "NixOS with AwesomeWM on a Framework laptop" | ||||||
|  | slug:       "nixos-awesomewm-framework" | ||||||
|  | date:       2023-01-29 22:53:54 | ||||||
|  | categories: [linux] | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | [Framework] is a company that makes laptops that are easily repairable. | ||||||
|  | [AwesomeWM] is a modular tiling window manager. [NixOS] is a Linux distribution | ||||||
|  | that is configured using a declarative, idempotent language. This is a blog post | ||||||
|  | about how to install and configure NixOS using AwesomeWM with no display manager | ||||||
|  | (i.e. using `startx`) on a Framework laptop. I was inspired to write this after | ||||||
|  | receiving help from [elly's post] about installing Alpine on a Framework laptop. | ||||||
|  | 
 | ||||||
|  | ## Install NixOS | ||||||
|  | 
 | ||||||
|  | ### Create install medium | ||||||
|  | 
 | ||||||
|  | Download a copy of the [NixOS installation media]. I used the Gnome graphical | ||||||
|  | installer, but any of them will be fine. Once complete, you can burn the | ||||||
|  | installation image to a USB flash drive using something like | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | sudo dd if=/path/to/downloaded/image.iso of=/dev/sdX bs=4M status=progress | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Disable secure boot | ||||||
|  | 
 | ||||||
|  | Next disable [secure boot] (at least temporarily) in order to boot the | ||||||
|  | installer. | ||||||
|  | 
 | ||||||
|  | 1. reboot the computer | ||||||
|  | 1. repeatedly press F2 until you see the UEFI BIOS menu | ||||||
|  | 1. go to the Security tab | ||||||
|  | 1. go the Secure Boot | ||||||
|  | 1. change "Enforce Secure Boot" to disabled | ||||||
|  | 1. press F10 to save and exit | ||||||
|  | 
 | ||||||
|  | ### Run installer | ||||||
|  | 
 | ||||||
|  | Reboot the computer and repeatedly press F10 until the boot menu appears. Select | ||||||
|  | the entry that has "USB" in it. Follow the prompts to install NixOS. You might | ||||||
|  | need to connect to a WiFi network, close the installer, and reopen the | ||||||
|  | installer. At the end of the installer, when prompted for which desktop | ||||||
|  | environment to install, select "None / terminal only". Don't worry, we'll be | ||||||
|  | installing AwesomeWM shortly. | ||||||
|  | 
 | ||||||
|  | ## Connect to WiFi | ||||||
|  | 
 | ||||||
|  | After restarting and signing in at the login TTY, reconnect to the WiFi by | ||||||
|  | running `nmtui` and following the prompts. | ||||||
|  | 
 | ||||||
|  | ## Configure NixOS | ||||||
|  | 
 | ||||||
|  | There are many ways to set up a NixOS configuration. I personally use a | ||||||
|  | [repository with Nix flakes]. By default you'll find your configuration in | ||||||
|  | `/etc/nixos/`. In this section, I'm going to provide statements that you'll | ||||||
|  | likely want to include in one of your NixOS configuration files. Which file to | ||||||
|  | put it in is a matter of preference, and is left up to the user, though I'll | ||||||
|  | provide links to where I included them in my repo. | ||||||
|  | 
 | ||||||
|  | ### Kernel version | ||||||
|  | 
 | ||||||
|  | Wifi, Bluetooth, and graphics will require Linux Kernel 5.16 or greater. I | ||||||
|  | simply set mine to install the latest for now. | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/03353c4d0eac0c6ba50843289d201bd055ff3822/box/framework2.nix#L14) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   boot.kernelPackages = pkgs.linuxPackages_latest; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Backlight | ||||||
|  | 
 | ||||||
|  | xbacklight doesn't work out of the box. Get it working with | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/box/framework2.nix#L42-L46) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   hardware.acpilight.enable = lib.mkDefault true; | ||||||
|  |   hardware.sensor.iio.enable = lib.mkDefault true; | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |     ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", MODE="0666", RUN+="${pkgs.coreutils}/bin/chmod a+w /sys/class/backlight/%k/brightness" | ||||||
|  |   ''; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Bluetooth | ||||||
|  | 
 | ||||||
|  | Enable bluetooth with | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/box/framework2.nix#L49) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   hardware.bluetooth.enable = true; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Manage bluetooth through the CLI with `bluetoothctl`. | ||||||
|  | 
 | ||||||
|  | ### Fingerprint Scanner | ||||||
|  | 
 | ||||||
|  | Enable the fingerprint reader with | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/box/framework2.nix#L50) | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |   services.fprintd.enable = true; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Enroll your fingerprint with `sudo fprintd-enroll $USER`. You'll then be able to | ||||||
|  | user your finger print when signing in on a TTY and when using sudo. | ||||||
|  | 
 | ||||||
|  | ### Increase the TTY console font | ||||||
|  | 
 | ||||||
|  | Because Framework laptops have high pixel density monitors, the main TTY console | ||||||
|  | can be hard to read. Installing and enabling a larger font can help. | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/box/framework2.nix#L51-L59) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     terminus_font | ||||||
|  |   ]; | ||||||
|  |   console = { | ||||||
|  |     earlySetup = true; | ||||||
|  |     font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz"; | ||||||
|  |     packages = with pkgs; [ terminus_font ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Specify working touchpad drivers | ||||||
|  | 
 | ||||||
|  | Curiously if you install Gnome or KDE, NixOS will figure out the the correct (or | ||||||
|  | at least a working) touchpad driver. When using AwesomeWM with no display | ||||||
|  | manager, we're on our own. Specify using the synaptics driver with some | ||||||
|  | reasonable configuration. | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/box/framework2.nix#L60-L64) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   services.xserver.synaptics = { | ||||||
|  |     enable = true; | ||||||
|  |     twoFingerScroll = true; | ||||||
|  |     accelFactor = "0.075"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Configure AwesomeWM | ||||||
|  | 
 | ||||||
|  | Some settings here are to help make the menu bar and title bars readable on the | ||||||
|  | high DPI monitor. | ||||||
|  | 
 | ||||||
|  | [source](https://git.kindrobot.ca/kindrobot/nix-config/src/commit/6dcc57a85715665d188de03e3c74a926056c58ea/conf/awesome_workstation.nix#L5-L18) | ||||||
|  | ```nix | ||||||
|  | { | ||||||
|  |   services.xserver.displayManager.startx.enable = true; | ||||||
|  |   services.xserver.windowManager.awesome = { | ||||||
|  |     enable = true; | ||||||
|  |     luaModules = with pkgs.luaPackages; [ | ||||||
|  |       luarocks # is the package manager for Lua modules | ||||||
|  |       luadbi-mysql # Database abstraction layer | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  |   services.xserver.dpi = 180; | ||||||
|  |   environment.variables = { | ||||||
|  |     GDK_SCALE = "2"; | ||||||
|  |     GDK_DPI_SCALE = "0.5"; | ||||||
|  |     _JAVA_OPTIONS = "-Dsun.java2d.uiScale=2"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |    | ||||||
|  | Notice the this config enables a `startx` display manager. In fact, this is | ||||||
|  | configuring NixOS to be able to do `startx` without a display manager. Create an | ||||||
|  | `.xinitrc` with | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | echo awesome > ~/.xinitrc | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### AwesomeWM bells and whistles | ||||||
|  | 
 | ||||||
|  | With all of the configuration up until now, after running `nixos-rebuild switch | ||||||
|  | ...`, (and probably restarting), you should be able to get into Awesome by | ||||||
|  | signing in at the login TTY and running `startx`. If you'd like a more custom | ||||||
|  | desktop with most of the function keys working, try cloning my (forked) awesome | ||||||
|  | config:  | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | git clone --recurse-submodules --remote-submodules --depth 1 -j 2 https://github.com/kindrowboat/awesome-copycats.git ~/.config/awesome` | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | and reload nix by pressing Ctrl+Super+R. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | [Framework]: https://frame.work | ||||||
|  | [AwesomeWM]: https://awesomewm.org/ | ||||||
|  | [NixOS]: https://nixos.org | ||||||
|  | [elly's post]: https://elly.town/d/blog/2022-10-20-alpine-framework.txt | ||||||
|  | [NixOS installation media]: https://nixos.org/download.html#nixos-iso | ||||||
|  | [secure boot]: https://en.wikipedia.org/wiki/Hardware_restriction#Secure_boot | ||||||
|  | [repository with Nix flakes]: https://git.kindrobot.ca/kindrobot/nix-config | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user