HOWTO: Copy the hidden ix-apps dataset from one pool to another

Sometimes you would like to move your apps from one pool to another…

There is currently no way to do this in the GUI.

The below recipe worked for me.

(replace “originalpool” and “otherpool” with the original pool’s name, and the new pools name, respectively)

  1. unset your app pool
  2. check your ix-apps datasets with sudo zfs list | grep ix-apps
  3. if you have any ix-apps datasets on your newpool, then delete it with sudo zfs destroy -r newpool/ix-apps (note, this assumes that you do NOT want the existing app’s dataset on that pool, and it will be destroyed)
  4. replicate originalpool/ix-apps to newpool/ix-apps (see below for gui instructions)
  5. check your ix-apps datasets with sudo zfs list | grep ix-apps, you should see two sets of ix-apps datasets, one on each pool.
  6. sudo zfs set mountpoint=/.ix-apps newpool/ix-apps, this will update the mount point.
  7. Choose your newpool as the apps pool. TrueNAS will restart docker using the new copy of the apps pool
  8. refresh the page.

Your apps should startup, as they were, but on the new pool.

To replicate the ix-apps dataset using the GUI, add a new Replication Task, configured as below

NOTE: my originalpool is called “tank”, and my “newpool” is called “ssds”, i have directly typed “tank/ix-apps” and “ssds/ix-apps” as the Source and Destinations, and importantly, “recursive” is ticked, and “make destination dataset read only” is not.


Once you click save, the replication will be performed. You can delete it after it has finished. You may need to reload the page to see that it has finished.

Once the replication has completed, follow the instructions to adjust the mount point.

Here is an example of setting the mountpoint correctly.

# zfs list | grep ix-apps
ssds/ix-apps                                                       1.68G   460G   136K  /mnt/ssds/ix-apps
ssds/ix-apps/app_configs                                            484K   460G   484K  /mnt/ssds/ix-apps/app_configs
ssds/ix-apps/app_mounts                                             552K   460G    96K  /mnt/ssds/ix-apps/app_mounts
ssds/ix-apps/docker                                                1.63G   460G  1.63G  /mnt/ssds/ix-apps/docker
ssds/ix-apps/truenas_catalog                                       51.2M   460G  51.2M  /mnt/ssds/ix-apps/truenas_catalog
tank/ix-apps                                                       2.38G  33.1T   120K  /mnt/.ix-apps
tank/ix-apps/app_configs                                           1.27M  33.1T   484K  /mnt/.ix-apps/app_configs
tank/ix-apps/app_mounts                                             600K  33.1T   104K  /mnt/.ix-apps/app_mounts
tank/ix-apps/docker                                                2.32G  33.1T  1.63G  /mnt/.ix-apps/docker
tank/ix-apps/truenas_catalog                                       59.7M  33.1T  51.2M  /mnt/.ix-apps/truenas_catalog
# zfs set mountpoint=/.ix-apps ssds/ix-apps   
# zfs list | grep ix-apps                     
ssds/ix-apps                                                       1.68G   460G   136K  /mnt/.ix-apps
ssds/ix-apps/app_configs                                            484K   460G   484K  /mnt/.ix-apps/app_configs
ssds/ix-apps/app_mounts                                             552K   460G    96K  /mnt/.ix-apps/app_mounts
ssds/ix-apps/docker                                                1.63G   460G  1.63G  /mnt/.ix-apps/docker
ssds/ix-apps/truenas_catalog                                       51.2M   460G  51.2M  /mnt/.ix-apps/truenas_catalog
tank/ix-apps                                                       2.38G  33.1T   120K  /mnt/.ix-apps
tank/ix-apps/app_configs                                           1.27M  33.1T   484K  /mnt/.ix-apps/app_configs
tank/ix-apps/app_mounts                                             600K  33.1T   104K  /mnt/.ix-apps/app_mounts
tank/ix-apps/docker                                                2.32G  33.1T  1.63G  /mnt/.ix-apps/docker
tank/ix-apps/truenas_catalog                                       59.7M  33.1T  51.2M  /mnt/.ix-apps/truenas_catalog
# 
7 Likes

Thank you for posting this instruction set! I’m having an issue, I followed your directions carefully but when I run the command ‘sudo zfs list | grep ix-apps’ after setting the mountpoint to my new pool both my old and new pool are mounted to .ix-apps and not just the new for some reason. Is there a step to unmount the old one. I cannot run my apps. I get an error in apps service

Sorry, I see your example and it seems both pools would still be mounted to /.ix-apps after setting the mountpoint. I get “Error in Apps Services” when setting my new pool to for apps

In my Alerts it states “Failed to start docker for Applications: Docker service could not be started”.

In my testing, unsetting the app pool unmounted the dataset and setting it mounted it.

It is possible to set the other datasets mounting to “none”

You can use zfs mount and I believe zfs unmount to mount/unmount the dataset

After following your original steps it seems like it should be working correctly. Output from sudo zfs list | grep ix-apps at the end of the steps shows me exactly what you stated would look like if i set the mointpoint correctly. But for some reason, when i set the Pool to my new pool docker doesn’t run.

I noticed that the ix-applications folder is not moved to the new new. Do i need to replicate this folder to the new pool aswell?

I do not think so, as you should be able to delete that dataset once you have finished migrating to Electric Eel

oh, is the ix-applications folder not needed after 24.10?

This is what I see with
sudo zfs list | grep ix-apps

Apps/ix-apps                                                                              15.1G   216G   132K  /mnt/.ix-apps
Apps/ix-apps/app_configs                                                                  10.5M   216G  10.5M  /mnt/.ix-apps/app_configs
Apps/ix-apps/app_mounts                                                                   2.65G   216G   144K  /mnt/.ix-apps/app_mounts
Apps/ix-apps/app_mounts/ix-app                                                            2.31M   216G    96K  /mnt/.ix-apps/app_mounts/ix-app
Apps/ix-apps/app_mounts/ix-app/storage_entry                                              2.21M   216G  2.21M  /mnt/.ix-apps/app_mounts/ix-app/storage_entry
Apps/ix-apps/app_mounts/jellyfin2                                                         2.17G   216G   112K  /mnt/.ix-apps/app_mounts/jellyfin2
Apps/ix-apps/app_mounts/jellyfin2/cache                                                   1.06G   216G  1.06G  /mnt/.ix-apps/app_mounts/jellyfin2/cache
Apps/ix-apps/app_mounts/jellyfin2/config                                                  1.11G   216G  1.11G  /mnt/.ix-apps/app_mounts/jellyfin2/config
Apps/ix-apps/app_mounts/jellyfin2/transcodes                                                96K   216G    96K  /mnt/.ix-apps/app_mounts/jellyfin2/transcodes
Apps/ix-apps/app_mounts/jellyseerr2                                                       2.06M   216G    96K  /mnt/.ix-apps/app_mounts/jellyseerr2
Apps/ix-apps/app_mounts/jellyseerr2/config                                                1.97M   216G  1.97M  /mnt/.ix-apps/app_mounts/jellyseerr2/config
Apps/ix-apps/app_mounts/octoprint                                                          900K   216G    96K  /mnt/.ix-apps/app_mounts/octoprint
Apps/ix-apps/app_mounts/octoprint/storage_entry                                            804K   216G   804K  /mnt/.ix-apps/app_mounts/octoprint/storage_entry
Apps/ix-apps/app_mounts/pihole                                                             138M   216G   104K  /mnt/.ix-apps/app_mounts/pihole
Apps/ix-apps/app_mounts/pihole/config                                                      138M   216G   138M  /mnt/.ix-apps/app_mounts/pihole/config
Apps/ix-apps/app_mounts/pihole/dnsmasq                                                     112K   216G   112K  /mnt/.ix-apps/app_mounts/pihole/dnsmasq
Apps/ix-apps/app_mounts/prowlarr2                                                         9.87M   216G    96K  /mnt/.ix-apps/app_mounts/prowlarr2
Apps/ix-apps/app_mounts/prowlarr2/config                                                  9.77M   216G  9.77M  /mnt/.ix-apps/app_mounts/prowlarr2/config
Apps/ix-apps/app_mounts/radarr2                                                            238M   216G    96K  /mnt/.ix-apps/app_mounts/radarr2
Apps/ix-apps/app_mounts/radarr2/config                                                     238M   216G   238M  /mnt/.ix-apps/app_mounts/radarr2/config
Apps/ix-apps/app_mounts/sonarr2                                                           99.4M   216G    96K  /mnt/.ix-apps/app_mounts/sonarr2
Apps/ix-apps/app_mounts/sonarr2/config                                                    99.3M   216G  99.3M  /mnt/.ix-apps/app_mounts/sonarr2/config
Apps/ix-apps/app_mounts/wizarr                                                             260K   216G    96K  /mnt/.ix-apps/app_mounts/wizarr
Apps/ix-apps/app_mounts/wizarr/storage_entry                                               164K   216G   164K  /mnt/.ix-apps/app_mounts/wizarr/storage_entry
Apps/ix-apps/docker                                                                       12.4G   216G  12.4G  /mnt/.ix-apps/docker
Apps/ix-apps/truenas_catalog                                                              51.3M   216G  51.3M  /mnt/.ix-apps/truenas_catalog
June/ix-apps                                                                              23.9G  1007G   128K  /mnt/.ix-apps
June/ix-apps/app_configs                                                                  10.8M  1007G  9.20M  /mnt/.ix-apps/app_configs
June/ix-apps/app_mounts                                                                   11.4G  1007G   136K  /mnt/.ix-apps/app_mounts
June/ix-apps/app_mounts/ix-app                                                            2.31M  1007G    96K  /mnt/.ix-apps/app_mounts/ix-app
June/ix-apps/app_mounts/ix-app/storage_entry                                              2.21M  1007G  2.21M  /mnt/.ix-apps/app_mounts/ix-app/storage_entry
June/ix-apps/app_mounts/jellyfin2                                                         10.6G  1007G   112K  /mnt/.ix-apps/app_mounts/jellyfin2
June/ix-apps/app_mounts/jellyfin2/cache                                                   8.90G  1007G  1.06G  /mnt/.ix-apps/app_mounts/jellyfin2/cache
June/ix-apps/app_mounts/jellyfin2/config                                                  1.66G  1007G  1.11G  /mnt/.ix-apps/app_mounts/jellyfin2/config
June/ix-apps/app_mounts/jellyfin2/transcodes                                                96K  1007G    96K  /mnt/.ix-apps/app_mounts/jellyfin2/transcodes
June/ix-apps/app_mounts/jellyseerr2                                                       11.3M  1007G    96K  /mnt/.ix-apps/app_mounts/jellyseerr2
June/ix-apps/app_mounts/jellyseerr2/config                                                11.2M  1007G  2.03M  /mnt/.ix-apps/app_mounts/jellyseerr2/config
June/ix-apps/app_mounts/octoprint                                                         3.39M  1007G    96K  /mnt/.ix-apps/app_mounts/octoprint
June/ix-apps/app_mounts/octoprint/storage_entry                                           3.29M  1007G   828K  /mnt/.ix-apps/app_mounts/octoprint/storage_entry
June/ix-apps/app_mounts/pihole                                                             260M  1007G   104K  /mnt/.ix-apps/app_mounts/pihole
June/ix-apps/app_mounts/pihole/config                                                      260M  1007G   138M  /mnt/.ix-apps/app_mounts/pihole/config
June/ix-apps/app_mounts/pihole/dnsmasq                                                     200K  1007G   120K  /mnt/.ix-apps/app_mounts/pihole/dnsmasq
June/ix-apps/app_mounts/prowlarr2                                                         58.8M  1007G    96K  /mnt/.ix-apps/app_mounts/prowlarr2
June/ix-apps/app_mounts/prowlarr2/config                                                  58.7M  1007G  9.82M  /mnt/.ix-apps/app_mounts/prowlarr2/config
June/ix-apps/app_mounts/radarr2                                                            389M  1007G    96K  /mnt/.ix-apps/app_mounts/radarr2
June/ix-apps/app_mounts/radarr2/config                                                     389M  1007G   238M  /mnt/.ix-apps/app_mounts/radarr2/config
June/ix-apps/app_mounts/sonarr2                                                            174M  1007G    96K  /mnt/.ix-apps/app_mounts/sonarr2
June/ix-apps/app_mounts/sonarr2/config                                                     174M  1007G   100M  /mnt/.ix-apps/app_mounts/sonarr2/config
June/ix-apps/app_mounts/wizarr                                                             748K  1007G    96K  /mnt/.ix-apps/app_mounts/wizarr
June/ix-apps/app_mounts/wizarr/storage_entry                                               652K  1007G   172K  /mnt/.ix-apps/app_mounts/wizarr/storage_entry
June/ix-apps/docker                                                                       12.4G  1007G  9.07G  /mnt/.ix-apps/docker
June/ix-apps/truenas_catalog                                                              51.3M  1007G    96K  /mnt/.ix-apps/truenas_catalog

I believe it’s surplus. Any iXVolumes get cloned out as part of the migration.

But I’m also not going to suggest deleting a dataset. And if you do perhaps look into a zfs checkpoint

I didn’t notice this earlier since the Replication succeeded, but as soon as the replication completed I get this error. I can’t seem to see more of what this alert is saying. Perhaps this is the root of my issues.
Screenshot 2024-11-18 133935

Did you untick the “make destination read only” checkbox when setting up the replication? And tick the “recursive” one?

2 Likes

OMG, clearly I didn’t follow your instructions close enough! I didn’t notice the tick box for “make destination read only” and didn’t untick it. Thank you, that was my problem! Thank you again for your patience.

1 Like

I’ve added a callout to the NOTE: now

Great write up. I just had built a new SSD pool to use for apps to move them off the slower HDD pool, and found that they didn’t properly migrate. Fortunately I found this guide and didn’t want to wait for the next release. This worked like a charm. All my apps are now up and running from the new pool.

1 Like