| --- |
| title: Converting Existing Users to systemd-homed |
| category: Users, Groups and Home Directories |
| layout: default |
| --- |
| |
| # Converting Existing Users to systemd-homed managed Users |
| |
| Traditionally on most Linux distributions, regular (human) users are managed |
| via entries in `/etc/passwd`, `/etc/shadow`, `/etc/group` and |
| `/etc/gshadow`. With the advent of |
| [`systemd-homed`](https://www.freedesktop.org/software/systemd/man/systemd-homed.service.html) |
| it might be desirable to convert an existing, traditional user account to a |
| `systemd-homed` managed one. Below is a brief guide how to do that. |
| |
| Before continuing, please read up on these basic concepts: |
| |
| * [Home Directories](https://systemd.io/HOME_DIRECTORY) |
| * [JSON User Records](https://systemd.io/USER_RECORD) |
| * [JSON Group Records](https://systemd.io/GROUP_RECORD) |
| * [User/Group Record Lookup API via Varlink](https://systemd.io/USER_GROUP_API) |
| |
| ## Caveat |
| |
| This is a manual process, and possibly a bit fragile. Hence, do this at your |
| own risk, read up beforehand, and make a backup first. You know what's at |
| stake: your own home directory, i.e. all your personal data. |
| |
| ## Step-By-Step |
| |
| Here's the step-by-step guide: |
| |
| 0. Preparations: make sure you run a distribution that has `systemd-homed` |
| enabled and properly set up, including the necessary PAM and NSS |
| configuration updates. Make sure you have enough disk space in `/home/` for |
| a (temporary) second copy of your home directory. Make sure to backup your |
| home directory. Make sure to log out of your user account fully. Then log in |
| as root on the console. |
| |
| 1. Rename your existing home directory to something safe. Let's say your user |
| ID is `foobar`. Then do: |
| |
| ``` |
| mv /home/foobar /home/foobar.saved |
| ``` |
| |
| 2. Have a look at your existing user record, as stored in `/etc/passwd` and |
| related files. We want to use the same data for the new record, hence it's good |
| looking at the old data. Use commands such as: |
| |
| ``` |
| getent passwd foobar |
| getent shadow foobar |
| ``` |
| |
| This will tell you the `/etc/passwd` and `/etc/shadow` entries for your |
| user. For details about the fields, see the respective man pages |
| [passwd(5)](http://man7.org/linux/man-pages/man5/passwd.5.html) and |
| [shadow(5)](http://man7.org/linux/man-pages/man5/shadow.5.html). |
| |
| The fourth field in the `getent passwd foobar` output tells you the GID of |
| your user's main group. Depending on your distribution it's a group private |
| to the user, or a group shared by most local, regular users. Let's say the |
| GID reported is 1000, let's then query its details: |
| |
| ``` |
| getent group 1000 |
| ``` |
| |
| This will tell you the name of that group. If the name is the same as your |
| user name your distribution apparently provided you with a private group for |
| your user. If it doesn't match (and is something like `users`) it apparently |
| didn't. Note that `systemd-homed` will always manage a private group for |
| each user under the same name, hence if your distribution is one of the |
| latter kind, then there's a (minor) mismatch in structure when converting. |
| |
| Save the information reported by these three commands somewhere, for later |
| reference. |
| |
| 3. Now edit your `/etc/passwd` file and remove your existing record |
| (i.e. delete a single line, the one of your user's account, leaving all |
| other lines unmodified). Similar for `/etc/shadow`, `/etc/group` (in case |
| you have a private group for your user) and `/etc/gshadow`. Most |
| distributions provide you with a tool for that, that adds safe |
| synchronization for these changes: `vipw`, `vipw -s`, `vigr` and `vigr -s`. |
| |
| 4. At this point the old user account vanished, while the home directory still |
| exists safely under the `/home/foobar.saved` name. Let's now create a new |
| account with `systemd-homed`, using the same username and UID as before: |
| |
| ``` |
| homectl create foobar --uid=$UID --real-name=$GECOS |
| ``` |
| |
| In this command line, replace `$UID` by the UID you previously used, |
| i.e. the third field of the `getent passwd foobar` output above. Similar, |
| replace `$GECOS` by the GECOS field of your old account, i.e the fifth field |
| of the old output. If your distribution traditionally does not assign a |
| private group to regular user groups, then consider adding `--member-of=` |
| with the group name to get a modicum of compatibility with the status quo |
| ante: this way your new user account will still not have the old primary |
| group as new primary group, but will have it as auxiliary group. |
| |
| Consider reading through the |
| [homectl(1)](https://www.freedesktop.org/software/systemd/man/homectl.html) |
| manual page at this point, maybe there are a couple of other settings you |
| want to set for your new account. In particular, look at `--storage=` and |
| `--disk-size=`, in order to change how your home directory shall be stored |
| (the default `luks` storage is recommended). |
| |
| 5. Your new user account exists now, but it has an empty home directory. Let's |
| now migrate your old home directory into it. For that let's mount the new |
| home directory temporarily and copy the data in. |
| |
| ``` |
| homectl with foobar -- rsync -aHAXv --remove-source-files /home/foobar.saved/ . |
| ``` |
| |
| This mounts the home directory of the user, and then runs the specified |
| `rsync` command which copies the contents of the old home directory into the |
| new. The new home directory is the working directory of the invoked `rsync` |
| process. We are invoking this command as root, hence the `rsync` runs as |
| root too. When the `rsync` command completes the home directory is |
| automatically unmounted again. Since we used `--remove-source-files` all files |
| copied are removed from the old home directory as the copy progresses. After |
| the command completes the old home directory should be empty. Let's remove |
| it hence: |
| |
| ``` |
| rmdir /home/foobar.saved |
| ``` |
| |
| And that's it, we are done already. You can log out now and should be able to |
| log in under your user account as usual, but now with `systemd-homed` managing |
| your home directory. |