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 контейнера-донора, ведет к удалению его диска.
На этом все!
Comments powered by Disqus.