153 lines
4.6 KiB
Markdown
153 lines
4.6 KiB
Markdown
# home-impermanence
|
|
|
|
OpenBSD compatible implementation of the [impermanence project from
|
|
the NixOS community](https://nixos.wiki/wiki/Impermanence)
|
|
|
|
Such a tool permits to have your $HOME mounted with a memory
|
|
filesystem and populate it from an explicit list of files and
|
|
directories hooked from a persistent storage directory (like a place
|
|
in your /home partition), the point is to have a clean and reproducible
|
|
environment every time you log in with only the content you selected.
|
|
No more extra files when you start a program only once.
|
|
|
|
# Installation
|
|
|
|
Run `make install` as root, this will copy the program file in
|
|
`/usr/local/bin/impermanence` and the service file in
|
|
`/etc/rc.d/impermanence`.
|
|
|
|
You need some packages as dependencies:
|
|
- p5-File-HomeDir
|
|
- p5-List-MoreUtils
|
|
- p5-YAML
|
|
|
|
# Configuration
|
|
|
|
The configuration is done in two parts, system wide to configure the
|
|
**impermanence** service that will mount the memory filesystem and
|
|
populate it.
|
|
|
|
## System wide
|
|
|
|
Using rcctl: `rcctl set impermanence flags -d /home/persist/ -u
|
|
my-user` and `rcctl enable impermanence`.
|
|
|
|
## User configuration
|
|
|
|
The user configuration will be done in
|
|
`/home/persist/my-user/impermanence.yml` if you chose `-d /home/persist`
|
|
for the service and `-u my-user`.
|
|
|
|
The configuration file describes the size of the memory filesystem,
|
|
the list of files and the list of directories that should be added
|
|
to the filesystem as symbolic links from the persistent directory.
|
|
|
|
There are currently three keys:
|
|
- **size**: which is a parameter to mount_mfs -s to give the ramdisk size
|
|
- **files**: which is a list of files relative to $HOME
|
|
- **directores**: which is a list of directories relative to $HOME
|
|
|
|
Minimalistic example of `/home/persist/my-user/impermanence.yml`:
|
|
|
|
```
|
|
size: 200m
|
|
files:
|
|
- .bashrc
|
|
- .gitconfig
|
|
- .profile
|
|
- .tmux.conf
|
|
- .xsession
|
|
directories:
|
|
- .config
|
|
- .local/share
|
|
- .mozilla
|
|
- .ssh
|
|
- Data
|
|
- Documents
|
|
- Downloads
|
|
- dev
|
|
```
|
|
|
|
# home-impermanence rc service
|
|
|
|
## restart
|
|
|
|
The restart parameter to the service will unmount the device and
|
|
recreate it, allowing a fresh restart.
|
|
|
|
It is a bad idea to use while the user is connected.
|
|
|
|
## start
|
|
|
|
Creates and populates the home filesystem.
|
|
|
|
## stop
|
|
|
|
Umount the home filesystem.
|
|
|
|
It is a bad idea to use while the user is connected.
|
|
|
|
## status
|
|
|
|
Tells if the mount is currently done.
|
|
|
|
# Tips
|
|
|
|
## I configured something in a GUI program, how do I know what changed on disk?
|
|
|
|
If you want to add a file to the persistent area after a change,
|
|
you may want to know exactly what changed on disk to add the file
|
|
or directory to your configuration file.
|
|
|
|
Using `find` it's easy to scan all the files from the ramdisk
|
|
(excluding the symbolic links) and order them by date of change.
|
|
|
|
This can be done with `find -x ~/ -type f -exec ls -altr {} +`, the
|
|
last files are the most recently modified.
|
|
|
|
## Beware file loss
|
|
|
|
When using this way of life, you need to remember all changes
|
|
that don't belong in the persistent areas will be lost. For
|
|
example, this will happen for all new files or directories at the
|
|
root of your $HOME.
|
|
|
|
Impermanence requires the user to be aware of what files must stay
|
|
over time, this is the point of impermanence after all.
|
|
|
|
## I want to make a new file/directory persistent
|
|
|
|
If you are using your system and want to keep a newly created file
|
|
or directory, move it to your persistent area at the correct place
|
|
and create a symbolic link, this will allow a drop-in replacement
|
|
without rebooting.
|
|
|
|
Then, update your configuration file to add the new entry.
|
|
|
|
## How does a good configuration file look
|
|
|
|
There are no good or bad configuration file content (except if it's
|
|
invalid obviously). The whole point of impermanence is to hand-pick
|
|
every directories and files you want to run your session, by admitting
|
|
all others files will be thrown away at reboot.
|
|
|
|
While you can list `.config` and `.local` which is a very large
|
|
include, you could rather list only a subset of those, which will
|
|
make a long list and require a few guess&fix sessions to get the
|
|
things right.
|
|
|
|
The less directories are at the top level, the more you will
|
|
pinpoint the exact configuration you want to keep over time.
|
|
|
|
## Restarting impermanence
|
|
|
|
If you are actively tweaking your configuration file, you may have
|
|
issues when impermanence is unmounting the ramdisk device even with
|
|
your graphical session stopped, a process may still be running and
|
|
using the partition. You would have to find the running PID by
|
|
looking at processes and their owner and kill it.
|
|
|
|
As a side effect, you shouldn't be able to stop impermanence while
|
|
you are using your session because the system will prevent the
|
|
ramdisk to be umounted.
|