Moving files between different WSL2 instances?

Viewed 5488

If it is possible, how can I move files from one WSL instance to another directly? This would be useful when trying out new distributions, e.g. for copying /home from Ubuntu 18.04 to 20.04.

I am weary of doing this through explorer by accessing \\wsl$ in the windows host, it doesn't seem to reliably transfer all the files and feels wrong overall.

2 Answers

How to share data between different WSL instances

1. Create shared directory which is not included in any WSL instances

(WARNING the shared directory's filesystem lives in memory and thus a wsl.exe --shutdown would wipe them from existence.)

mkdir /mnt/wsl/share

This will create /mnt/wsl/share directory shared across all WLS instances but not included in any WSL instances.

You can share data via this shared directory.

However, it is still impossible to directly copy/paste data between WSL instances.

2. Create shared directory included in a WSL instance

You can make existing directory in WSL instance shared across other WSL instances by using bind mount.

For example, you have two WSL instances, Ubuntu-A and Ubuntu-B.

1. Open ~/.profile in Ubuntu-A and add below code.

# bind mount shared directory
if [ ! -d /mnt/wsl/share-a ]; then
  mkdir /mnt/wsl/share-a
  wsl.exe -d Ubuntu-A -u root mount --bind / /mnt/wsl/share-a/
fi

2. Open ~/.profile in Ubuntu-B and add below code.

# bind mount shared directory
if [ ! -d /mnt/wsl/share-b ]; then
  mkdir /mnt/wsl/share-b
  wsl.exe -d Ubuntu-B -u root mount --bind / /mnt/wsl/share-b/
fi

This will automatically mount the root directory (/) of Ubuntu-A to /mnt/wsl/shared-a/ and do the same thing for Ubuntu-B when you launch WSL.

https://jinsuxpark.blogspot.com/2021/01/how-to-share-data-between-different-wsl-instances-eng.html

On item 2, I put the following in my ~/.profile (well technically my .bash_profile).

if [[ -n "${WSL_DISTRO_NAME}" ]]; then
   if [[ -d "/mnt/wsl/${WSL_DISTRO_NAME}" ]]; then
      ls "/mnt/wsl/${WSL_DISTRO_NAME}"
   else 
      mkdir "/mnt/wsl/${WSL_DISTRO_NAME}"
      # note the terminating / on the directory name below!
      wsl.exe -d ${WSL_DISTRO_NAME} -u root mount --bind / "/mnt/wsl/${WSL_DISTRO_NAME}/"
   fi
fi

The result is every distro I start gets its root directory mounted with the "obvious" name.

Related