需求背景
wsl2 ubuntu磁盘满了,需要扩展磁盘。百度了一圈发现,要么把本地整个空白硬件磁盘挂载到ubuntu wsl2中,要么挂载本地vhdx文件。
结论:折腾了几个小时,发现挂载vhdx小问题太多,建议放弃。直接看扩展wsl磁盘章节,直接把wsl磁盘扩大即可。
wsl挂载vhdx过程
新建vhdx
用管理员权限运行命令,新建vhdx磁盘:
手动在windows d盘建立vhdx目录,然后运行一下命令:
New-VHD -Path d:\vhdx\newdisk.vhdx -SizeBytes 1024GB -Dynamic
执行后,发现d:\vhdx目录下面多了newdisk.vhdx文件:
初始化vhdx
powershell中运行下列命令,挂载vhdx至系统磁盘:
Mount-VHD -Path d:\vhdx\newdisk.vhdx
运行后,打开windows磁盘管理后,发现多了一个空白磁盘:(经过博主重启windows后验证,重启windows后,此虚拟磁盘会消失)
运行一下命令,查看未挂载的虚拟磁盘:
GET-CimInstance -query "SELECT * from Win32_DiskDrive"
powershell查看虚拟磁盘号:
Get-Disk
初始化磁盘,2是Get-Disk获取到的磁盘号。
Initialize-Disk -Number 2
给磁盘创建分区,且使用全部空间。
New-Partition -DiskNumber 2 -UseMaximumSize
连接VHD磁盘,\\.\PHYSICALDRIVE2是上面查询得到的。--bare:以裸设备的形式挂载驱动器,不会自动尝试挂载任何文件系统。这在需要手动处理分区或文件系统时很有用。
wsl --mount \\.\PHYSICALDRIVE2 --bare
挂载磁盘
进入wsl
wsl
查看磁盘
lsblk
格式化sdc2至ext4格式
mkfs -t ext4 /dev/sdc2
创建挂载路径,一般都是挂载到/mnt/目录下。
mkdir /mnt/mydisk
手动挂载磁盘
mount /dev/sdc2 /mnt/mydisk
查看挂载结果
df -h
可以看到已经挂载成功!
查看windows vhdx目录,此时大小为17MB左右。(如果创建10TB虚拟磁盘,此文件大约是170MB左右)
开机自动挂载
查询磁盘UUID
blkid
可以看到UUID为:"dfaa0de4-967d-4e36-85d8-adf66eebe00a"
sudo vim /etc/fstab
打开后,添加如下内容:
UUID=dfaa0de4-967d-4e36-85d8-adf66eebe00a /mnt/mydisk ext4 defaults 0 2
关闭wsl,再进入,看磁盘发现并没有自动挂载。那就得继续折腾。
windows自启时,实现自动挂载
打开powershell执行脚本的功能
因为下面的命令,都使用另外powershell,所以必须打开:
Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned
本地新建一个启动脚本,博主放在了d:/iios/wsl.ps1文件中。
博主实现了启动挂载,并且执行了启动clickhouse服务。
Mount-VHD -Path d:\vhdx\newdisk.vhdx
wsl --mount \\.\PHYSICALDRIVE2 --bare
wsl -- /bin/bash -c "mount -a && clickhouse start"
新建windows计划任务,实现开机自启,配置如下:
经过博主配置后,重启物理机后,实现了wsl自动挂载,并且启动了clickhouse服务。
但是问题还是比较多,比如偶尔挂载不上。这个方案比较坑,建议放弃。
常见问题
wsl2的ip不固定怎么办?
经过bing可知,本质原因是默认wsl2版本太低。执行一下命令升级版本,或者安装wsl_update_x64.msi升级补丁。
在线升级版本:
wsl --update
验证版本,如果没有出现详细版本,则代表wsl版本太低,需要回到上一步升级wsl.
wsl --version
升级完wsl版本后,重启wsl就会发现,此时子系统的ip已经是固定的了。
默认wsl2容器磁盘太小怎么办
如何管理 WSL 磁盘空间 | Microsoft Learn
1、查看wsl磁盘路径。
先查看子系统名称,我的是Ubuntu-22.04
wsl --list
以下命令查看wls磁盘路径:
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq 'Ubuntu-22.04' }).GetValue("BasePath") + "\ext4.vhdx"
可以看到博主的路径是:C:\Users\think\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
2、停止wsl
wsl --shutdown
3、vhdx扩容
powershell运行一下命令
diskpart
会出现DISKPART>提示后,执行一下命令,替换自己的vhdx文件路径:
Select vdisk file="C:\Users\think\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"
显示磁盘大小:
detail vdisk
扩展磁盘大小,把<sizeInMegaBytes>替换成实际的容量:
比如博主想扩展性10TB,就输入1024*1024*10=10485760
expand vdisk maximum=<sizeInMegaBytes>
实际输入:
expand vdisk maximum=10485760
4、wsl扩充
进入容器
wsl
输入一下命令,不知道有啥用
sudo mount -t devtmpfs none /dev
mount | grep ext4
查看wsl根路径的磁盘是不是sdc
df -h
可以看到根目录是sdc磁盘:
执行一下命令,扩展磁盘,注意修改根路径
sudo resize2fs /dev/sdc 10485760M
扩展过程比较慢,需要10分钟。扩展中,可以看到vhdx文件体积在逐渐增加。
扩展好后,就会发现根路径磁盘容量大小已经变了。
wsl如何免登录自启并启动一个服务,例如clickhouse:
手动启动的命令:
wsl -- /bin/bash -c "clickhouse start"
定时任务的启动命令,一定要这么配置,双引号一定要添加,否则起不起来:
"C:\Program Files\WSL\wsl.exe" -- /bin/bash -c "clickhouse start"