Home my articles Подключение дополнительных дисков в WSL2
Post
Cancel

Подключение дополнительных дисков в WSL2

WSL2 хорош, но хотелось бы иметь возможность подключать к нему доп. диски, можно конечно монтировать raw образы из /mnt/c/…, но это не очень удобно в плане ресурсов и это не совсем прямой способ монтирования, который снижает производительность.

Этот небольшой хак поможет подключать к контейнеру WSL2 дополнительные диски, которые будут динамически расширяться по мере заполнения данными.

Принцип основан на подключении диска из соседнего “пустого” контейнера. С последующим “хитрым” монтированием.

Для начала, создадим бекап-пустышку zero-template.tar. Заходим в любое WSL окружение и создаем пустой tar архив.

Вот мой пример:

1
T=`mktemp -d` && mkdir $T/hdd && tar -C $T -cf /mnt/f/WSL/zero-template.tar . && rm -r $T

Здесь сразу создаётся каталог hdd, который я буду использовать для хранения данных.

Посмотрим список дисков, который уже есть в окружении wsl

1
2
root@wsl:~# ls /dev/sd*
/dev/sda  /dev/sdb

Как видим всего 2 диска, запоминаем последнюю букву, чтобы определить какой диск добавился.

Теперь создадим пустой контейнер-донор из zero-template.tar Не забудьте запустить командную строку от имени Администратора

1
wsl.exe --import Ubuntu-ex2 F:\WSL\ubn20-ex2 F:\WSL\zero-template.tar

Тут Ubuntu-ex2 имя контейнера, F:\WSL\ubn20-ex2 место, где будет храниться виртуальный диск, F:\WSL\zero-template.tar шаблон-пустышка.

И снова смотрим список дисков в wsl:

1
2
root@wsl:~# ls /dev/sd*
/dev/sda  /dev/sdb  /dev/sdc

Как видим, добавился sdc, с ним и будем работать.

Назначим метку новому диску, и проверим (на всякий случай), что она установилась.

1
2
3
4
root@wsl:~# tune2fs -L ubn20-ex2 /dev/sdc
tune2fs 1.45.5 (07-Jan-2020)
root@wsl:~# e2label /dev/sdc
ubn20-ex2

Почти все, теперь осталось только монтировать диск при старте. Тк в WSL2 пока нет централизованного автозапуска, то я использую .profile добабвив в него строчку . ~/.startup И дальше все необходимое перечисляю в файле .startup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
auto_mount() {
  echo "Automount: [$1] $2 => $3"
  mount -l | grep -e "^/dev/sd" | grep -qe " \[$2\]" && {
    echo "Disk already mounted"
    return 0
  }
  blkid -t LABEL="$2" && echo "Disk connected" || {
    echo "Disk not connected"
    wsl.exe --distribution "$1"
    wsl.exe --terminate "$1"
    blkid -t LABEL="$2" || {
        echo "Fatal: Unable to load disk!"
        return 1
    }
  }
  [ ! -d "$3" ] && mkdir -p "$3"
  mount -o discard,errors=remount-ro,data=ordered -L "$2" "$3" && echo "Disk mounted"
}

# Disks
[ ! -f /var/run/startup_disks_ready ] && {
  echo Disk init...
  auto_mount "Ubuntu-ex1" "ubn20-ex1" "/mnt/ex1" && \
   auto_mount "Ubuntu-ex2" "ubn20-ex2" "/mnt/ex2" && \
   touch /var/run/startup_disks_ready
}

Функция auto_mount умеет проверять подмонтирован ли диск по указанному пути, и подключён ли вообще диск к WSL системе, при необходимости он все подключает и монтирует сам. Ей необходимо указать 3 аргумента:

  • имя контейнера-донора
  • метка диска
  • путь, по которому монтировать диск

Пример для монитрования диска с меткой ubn20-ex2 из контейнера Ubuntu-ex2 в каталог /mnt/ex2: auto_mount "Ubuntu-ex2" "ubn20-ex2" "/mnt/ex2"

При следующем входе в wsl будет примерно такое:

1
2
3
4
5
6
7
8
9
Automount: [Ubuntu-ex1] ubn20-ex1 => /mnt/ex1
Disk not connected
/dev/sdb: LABEL="ubn20-ex1" UUID="02eb1c51-b41f-4cee-88e4-d877b6dd3dab" TYPE="ext4"
Disk mounted
Automount: [Ubuntu-ex2] ubn20-ex2 => /mnt/ex2
Disk not connected
l/dev/sdc: LABEL="ubn20-ex2" UUID="3255683f-53a2-4fdf-91cf-b4c1041e2a62" TYPE="ext4"
Disk mounted
root@wsl:~#

Все, диск подмонтирован и готов к работе. На нем создались базовые каталоги, но на них можно не обращать внимания.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@wsl:~# ll /mnt/ex2/
total 56
drwx------ 11 root root  4096 Jul 26 05:33 ./
drwxr-xr-x 11 root root  4096 Jul 26 05:25 ../
drwxr-xr-x  2 root root  4096 Jul 26 05:23 bin/
drwxr-xr-x  2 root root  4096 Jul 26 05:23 dev/
drwxr-xr-x  2 root root  4096 Jul 26 05:07 hdd/
-rwxr-xr-x  1 root root     0 Jul 26 05:33 init*
drwx------  2 root root 16384 Apr 10  2019 lost+found/
drwxr-xr-x  8 root root  4096 Jul 26 05:23 mnt/
drwxr-xr-x  2 root root  4096 Jul 26 05:23 proc/
drwxr-xr-x  2 root root  4096 Jul 26 05:23 run/
drwxr-xr-x  2 root root  4096 Jul 26 05:23 sbin/
drwxr-xr-x  2 root root  4096 Jul 26 05:23 sys/

Каталог hdd из zero-template.tar уже тут, на него и буду делать симлинки. Миграция каталога с созданием симлинка выглядит примерно так:

1
2
mv /home /mnt/ex2/ && ln -s /mnt/ex2/home /home
mv /var/lib/docker /mnt/ex2/ && ln -s /mnt/ex2/docker /var/lib/docker

На всякий случай напомню, что wsl –unregister контейнера-донора, ведет к удалению его диска.

На этом все!

This post is licensed under CC BY 4.0 by the author.

Pascal's Wager [русификатор]

Streaming lag timer

Comments powered by Disqus.