تحرير مساحة القرص وإدارتها تلقائيًا لـ WSL على Windows 10/11

دقائق القراءة: 13
يُتيح لك نظام Windows Subsystem for Linux (WSL) تشغيل بيئة Linux مباشرةً على نظام Windows. يُعد هذا مفيدًا بشكل خاص لتطوير الويب، حيث يمكنك تطوير واختبار التطبيقات في بيئة Linux دون مغادرة Windows. بل ويمكنك تشغيل freeCodeCamp محليًا باستخدامه!

لكن إدارة مساحة القرص قد تكون تحديًا كبيرًا، حيث يستخدم WSL أقراصًا صلبة افتراضية لا تُحرر المساحة غير المستخدمة تلقائيًا. سيُرشدك هذا الدليل خلال عملية ضغط الأقراص الصلبة الافتراضية لـ WSL يدويًا. وسنقوم بأتمتة هذه المهمة باستخدام سكربت PowerShell، لضمان بقاء بيئة WSL الخاصة بك فعالة وخالية من الفوضى.

استعادة مساحتك

يستخدم WSL منصة محاكاة افتراضية لتثبيت توزيعات Linux على نظام Windows الخاص بك. تحصل كل توزيعة تُضيفها على قرص صلب افتراضي خاص بها (VHD)، والذي يستخدم نظام الملفات ext4 (الشائع في Linux). يتم حفظه على محرك أقراص Windows الخاص بك كملف ext4.vhdx.

القضايا الرئيسية هنا:

  • Inefficient storage (تخزين غير فعال): بشكل افتراضي، لا تستعيد ملفات VHD المساحة غير المستخدمة. هذا يعني أنه عند حذف ملف في WSL، لا يتم تحرير مساحة القرص المرتبطة به على الفور.
  • Disk space consumption (استهلاك مساحة القرص): بسبب هذا التخزين غير الفعال، يمكن أن تنمو ملفات VHD بشكل كبير بفضل البيانات المتراكمة، خاصة إذا كنت مستخدمًا مكثفًا لـ WSL.
  • Need for maintenance (الحاجة إلى الصيانة): قد لا تعلم أنك بحاجة إلى ضغط ملفات VHD الخاصة بك لاستعادة مساحة القرص. إذا لاحظت أن مساحة القرص الحرة لديك تتقلص حتى بعد حذف الملفات والتطبيقات، فقد يكون WSL هو السبب.

سيساعدك هذا الدليل في الحفاظ على بيئة WSL و Windows الخاصة بك تعمل بسلاسة.

جدول المحتويات

  • الجزء الأول: كيفية ضغط القرص الصلب الافتراضي يدويًا
    • المتطلبات الأساسية
    • الخطوة 1: التحقق من إصدار وحالة WSL الخاص بك
    • الخطوة 2: سرد جميع التوزيعات المثبتة بتفصيل
    • الخطوة 3: تحديد مسار القرص الصلب الافتراضي لـ Linux (VHDX)
    • الخطوة 4: إيقاف تشغيل جميع مثيلات WSL
    • الخطوة 5: ضغط القرص الصلب الافتراضي لـ Linux باستخدام DiskPart
    • الخطوة 6: إعادة تشغيل WSL والتحقق
  • الجزء الثاني: كيفية تبسيط حياتك باستخدام الأتمتة
    • المتطلبات الأساسية
    • الخطوة 1: اكتشاف توزيعات WSL2 المثبتة
    • الخطوة 2: اختيار توزيعة للضغط
    • الخطوة 3: تحديد موقع ملف ext4.vhdx
    • الخطوة 4: موجه التأكيد
    • الخطوة 5: إيقاف تشغيل WSL والضغط
    • الخطوة 6: تشغيل سكربت DiskPart

الجزء الأول: كيفية ضغط القرص الصلب الافتراضي يدويًا

لنبدأ باستعراض العملية يدويًا. سيُرشدك هذا القسم خلال التحقق من إصدار WSL الخاص بك وتوزيعات Linux المرتبطة به، والعثور على ملفات VHD، وإيقاف تشغيل WSL، وضغط القرص الافتراضي.

المتطلبات الأساسية

  • نظام Windows 10 (إصدار 20H1/2004+) أو Windows 11 مع تثبيت WSL2.
  • تشغيل PowerShell أو Command Prompt كـ Administrator (من قائمة Windows، انقر بزر الماوس الأيمن على الأيقونة واختر run as Administrator).

الخطوة 1: التحقق من إصدار وحالة WSL الخاص بك

أولاً، تأكد من أنك تعمل على الإصدار الثاني من WSL (المشار إليه عادةً باسم WSL2). الإصدار الأول قديم، و WSL2 يوفر تحسينات كبيرة.

افتح PowerShell (بصلاحيات Admin) أو Command Prompt (بصلاحيات Admin) وقم بتشغيل:

wsl -v
wsl --status

تعرض هذه الأوامر إصدار عميل WSL وما إذا كانت التوزيعة الافتراضية الخاصة بك تستخدم WSL 2.

إليك ناتج الأمر wsl -v:
لقطة شاشة لناتج الأمر wsl -v الذي يعرض إصدار عميل WSL.
وإليك ناتج الأمر wsl --status.
لقطة شاشة لناتج الأمر wsl --status مع معلومات مثل 'Default Distribution: Ubuntu' و 'Default Version: 2'.

الخطوة 2: سرد جميع التوزيعات المثبتة بتفصيل

لرؤية قائمة مفصلة بتوزيعات WSL الخاصة بك (بما في ذلك الإصدار الذي يستخدمه كل منها)، قم بتشغيل:

wsl.exe --list --verbose

لقطة شاشة لناتج الأمر wsl.exe --list --verbose الذي يعرض قائمة مفصلة بتوزيعات WSL.
أعلاه يمكنك رؤية ناتج الأمر wsl --list --verbose. ابحث عن اسم توزيعتك (على سبيل المثال، “Ubuntu“) ودوّن إصدار WSL الخاص بها. إذا أظهر “Version 2“، يمكنك المتابعة بعملية الضغط.

الخطوة 3: تحديد مسار القرص الصلب الافتراضي لـ Linux (VHDX)

توجد ملفات كل توزيعة WSL في ملف VHDX على محرك أقراص Windows الخاص بك. للعثور على المسار لأي توزيعة Linux، استخدم مقتطف PowerShell هذا:

(Get-ChildItem `
 -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss `
 | Where-Object { $_.GetValue("DistributionName") -eq 'YOUR_DISTRO_NAME' } `
 ).GetValue("BasePath") + "\ext4.vhdx"

حيث تستبدل YOUR_DISTRO_NAME باسم توزيعتك (مثل Ubuntu، Debian، Kali-linux..).

إليك ناتج الأمر الموضح أعلاه في PowerShell (تم إخفاء مسار الملف):
لقطة شاشة لناتج أمر PowerShell يعرض مسار ملف ext4.vhdx الخاص بتوزيعة WSL.
يقرأ هذا الأمر مفتاح السجل الخاص بتوزيعة Linux الخاصة بك، ثم يضيف “\ext4.vhdx” لبناء مسار الملف الكامل. تأكد من نسخ السطر بأكمله. سنحتاجه في المراحل اللاحقة.

الخطوة 4: إيقاف تشغيل جميع مثيلات WSL

قبل أن تتمكن من ضغط أي محرك أقراص افتراضي، تأكد من إيقاف تشغيل WSL بالكامل. في PowerShell أو Command Prompt (لا يزال كـ Administrator)، قم بتشغيل:

wsl.exe --shutdown

الخطوة 5: ضغط القرص الصلب الافتراضي لـ Linux باستخدام DiskPart

لقد جمعت بنجاح جميع المعلومات المطلوبة (حول نظامك، والتوزيعات المتاحة، ومسار ملف VHDX الخاص بها) للمتابعة بالمهمة الرئيسية. في هذه الخطوة، ستبدأ فعليًا بعملية الضغط.

شغل DiskPart في نفس سطر الأوامر المرتفع الصلاحيات (admin):

diskpart

سيفتح DiskPart في نافذة جديدة. إنها أداة سطر أوامر Windows لإدارة أقسام القرص. كن حذرًا عند استخدامها، حيث يمكن أن تتسبب الإجراءات غير الصحيحة في فقدان خطير للبيانات.

في موجه DiskPart، حدد ملف VHDX الذي عثرت عليه سابقًا. استبدل المسار المعروض أدناه بمسارك الفعلي (السطر الذي نسخته من قبل):

select vdisk file="C:\Users\username\AppData\path\to\ext4.vhdx"

لقطة شاشة لناتج أمر select vdisk في DiskPart، مع تحديد قرص افتراضي بنجاح.
أعلاه هو ناتج الأمر select vdisk (تم إخفاء بعض البيانات).

إرفاق القرص الافتراضي في وضع القراءة فقط: تحتاج عملية الضغط فقط إلى مسح الكتل الفارغة في الملف، وليس الكتابة إلى نظام ملفات Linux بالداخل. يضمن وضع القراءة فقط أن DiskPart يفحص الكتل فقط لعملية zero-trimming دون أي فرصة لإتلاف أو تغيير نظام ملفات Linux الخاص بك.

attach vdisk readonly

لقطة شاشة لناتج أمر attach vdisk readonly في DiskPart، مع رسالة تأكيد الإرفاق بنجاح.
يمكنك أن ترى في لقطة الشاشة أعلاه أن القرص الصلب الافتراضي قد تم إرفاقه بنجاح.

ضغط القرص: هذا يحرر مساحة القرص عن طريق تقليص الحجم الفعلي لملف .vhdx ليتناسب مع البيانات المستخدمة الفعلية بالداخل.

compact vdisk

قد تستغرق هذه العملية بعض الوقت. عندما ترى رسالة “DiskPart successfully compacted the virtual disk file“، تابع إلى الخطوة التالية.

في الصورة أدناه، تم ضغط القرص الصلب الافتراضي بنجاح.
لقطة شاشة لناتج أمر compact vdisk في DiskPart، مع إشارة إلى اكتمال العملية بنسبة 100% ونجاح ضغط القرص الافتراضي.
فصل القرص الافتراضي:

detach vdisk

لقطة شاشة لناتج أمر detach vdisk في DiskPart، مع رسالة تأكيد أن DiskPart فصل القرص الافتراضي بنجاح.
ها قد تم – تم فصل القرص الصلب الافتراضي بنجاح. يحرر هذا الأمر أي أقفال على القرص الافتراضي ويفصله فعليًا. إذا لم تستخدم هذا الأمر، فسيظل الملف “قيد الاستخدام”، مما يمنع WSL (أو أنت) من الوصول إليه حتى تقوم بإعادة التشغيل أو إغلاقه يدويًا.

الخروج من DiskPart:

exit

الخطوة 6: إعادة تشغيل WSL والتحقق

بالعودة إلى PowerShell أو Command Prompt، يمكنك إعادة تشغيل توزيعتك:

wsl -d YOUR_DISTRO_NAME

يمكنك حتى تجربة الأمر Unix df -h في موجه WSL الخاص بك للتحقق من مساحات القرص الجديدة المتاحة.

تهانينا، لقد أنجزت للتو مهمة صيانة يمكنها تحرير الكثير من الجيجابايت من مساحة التخزين بمرور الوقت. الآن، حان وقت الأتمتة.
صورة توضيحية لشخص يحتفل بنجاح تحرير مساحة القرص في WSL.

الجزء الثاني: كيفية تبسيط حياتك باستخدام الأتمتة

نظرًا لأنه غالبًا ما يكون من الصعب تذكر مكان توزيعة WSL الخاصة بك بالضبط، ومن المحتمل أنك لن تستخدمها كثيرًا، فإن سكربت PowerShell هذا سيقوم بأتمتة العملية بأكملها التي تناولناها في الجزء الأول.

إليك معاينة للخطوات التي ستتبعها:

  • اكتشاف توزيعات WSL المثبتة.
  • اختيار واحدة (ومعالجة الحالات التي يوجد فيها أكثر من واحدة).
  • تحديد موقع ملف ext4.vhdx المقابل.
  • إيقاف تشغيل WSL واستخدام DiskPart لضغط القرص الافتراضي.

المتطلبات الأساسية

  • نظام Windows 10 (إصدار 20H1/2004+) أو Windows 11 مع تمكين WSL 2.
  • PowerShell أو Command Prompt (بصلاحيات Administrator).
  • ستحتاج أيضًا إلى محرر أكواد. مفكرة Windows كافية لإكمال هذه المهمة. يمكنك أيضًا استخدام بيئة تطوير متكاملة (IDE) مثل VS Code أو بيئة برمجة نصية متكاملة (ISE) مثل PowerShell ISE (المضمنة مع Windows).

لاختبار السكربت، قم بتنزيله من GitHub. افتح PowerShell أو Command Prompt بصلاحيات مرتفعة وانتقل إلى مجلد السكربت. باستخدام الأمر أدناه فقط، ستتمكن من تشغيله وتحرير بعض مساحة القرص:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\wsl_compactor.ps1

الخطوة 1: اكتشاف توزيعات WSL2 المثبتة

أحد التحديات الرئيسية هو العثور على توزيعات Linux المتاحة على النظام المضيف. دعنا نتحقق من الكتلة الأولى ونرى ما تدور حوله:

$lxssKey = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss'
$distros = Get-ChildItem $lxssKey | ForEach-Object {
    $p = Get-ItemProperty $_.PSPath
    [PSCustomObject]@{ Name = $p.DistributionName; BasePath = $p.BasePath }
}

يسجل WSL كل توزيعة تحت مفتاح سجل Windows هذا: HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss

يحتوي كل مفتاح فرعي على قيمتين مهمتين:

  • DistributionName (على سبيل المثال، Ubuntu)
  • BasePath (هذا هو المكان الذي يتم فيه تخزين ملفات التوزيعة. إنه الدليل الذي يحتوي على ملف ext4.vhdx.)

يستخدم السكربت Get-ChildItem و Get-ItemProperty لتعداد هذه المفاتيح الفرعية وبناء قائمة بتوزيعات Linux المتاحة.

if ($distros.Count -eq 0) {
    Throw-And-Exit "No WSL distros found in the registry."
}

إذا لم يتم العثور على توزيعات، يتوقف السكربت ويطبع رسالة الخطأ هذه في الطرفية: "No WSL distros found in the registry.”

الخطوة 2: اختيار توزيعة للضغط

هنا، العملية تتكون من خطوتين:

إذا تم العثور على توزيعات متعددة، فإنه يعرض جميع التوزيعات بقائمة مرقمة ويطالبك باختيار واحدة:

if ($distros.Count -gt 1) {
    Write-Host "Multiple distros detected. Please choose one:`n"
    for ($i = 0; $i -lt $distros.Count; $i++) {
        Write-Host "[$(($i+1))] $($distros[$i].Name)"
    }
    $choice = Read-Host "Enter the number of the distro to compact"
    $selected = $distros[[int]$choice - 1]
}

ستبدو القائمة المحسوبة هكذا:

Multiple distros detected. Please choose one:
[1] Ubuntu 20.04
[2] Debian
[3] Alpine

إذا تم العثور على توزيعة واحدة فقط على النظام المضيف، يختارها السكربت تلقائيًا:

else {
    $selected = $distros[0]
}

عند إعداد توزيعة، سواء تم اختيارها يدويًا من قبل المستخدم أو تلقائيًا، فإن المعلومات المهمة هي المسار إلى القرص الصلب الافتراضي لكل توزيعة. يتم حفظ هذا المسار في متغيرين رئيسيين: 'distro' (الذي يحدد التوزيعة المحددة) و 'basePath' (الذي يوضح مكان القرص الافتراضي الخاص بها).

$distro = $selected.Name
$basePath = $selected.BasePath

Write-Host "`nSelected distro: $distro" -ForegroundColor DarkYellow
Write-Host "BasePath: $basePath"

تعرض الأسطر أعلاه ناتجًا يبدو كالتالي:

Selected distro: Ubuntu (or any other distro)
BasePath: C:\Users\<User_name>\AppData\Local\Packages\…

كما هو الحال في جميع الخطوات الأخرى، من المهم مراعاة حالة حدوث خطأ، عن طريق إطلاق خطأ والخروج من البرنامج:

if (-not (Test-Path $basePath)) {
    Throw-And-Exit "BasePath '$basePath' does not exist on disk."
}

الخطوة 3: تحديد موقع ملف ext4.vhdx

في الخطوة الأولى، جمعنا المعلومات التي نحتاجها حول التوزيعات المتاحة ومكان تخزينها على نظام Windows. باختيار إدخال (يدويًا أو تلقائيًا)، يمكننا العثور على الملف الصحيح.

في بعض الأحيان، يوجد ملف ext4 بين المسار الأساسي ومجلد LocalState. يتعامل هذا السكربت مع كلتا الحالتين. يبني المواقع المعتادة التي يمكن العثور على الملف فيها. تبدو كالتالي: $BasePath\ext4.vhdx، $BasePath\LocalState\ext4.vhdx

يمكن أن يترجم هذا إلى شيء كهذا على نظامك (الخيار 1):

C:\Users\Alice\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\ext4.vhdx

أو هكذا (الخيار 2):

C:\Users\Alice\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

(قد تكتشف أن توزيعة WSL2 الخاصة بك تقع في دليل آخر غير “Packages” – لكن لا تقلق، سيطابق BasePath الخاص بك المجلدات الصحيحة).

الفكرة هي بناء خياري المسار المحتملين:

$possible = @(
    Join-Path $basePath 'ext4.vhdx'
    Join-Path $basePath 'LocalState\ext4.vhdx'
)

واختيار الأول الذي يحتوي على الملف فعليًا:

$vhdx = $possible | Where-Object { Test-Path $_ } | Select-Object -First 1

مرة أخرى، نطلق رسالة خطأ إذا لم يتم العثور على ملف مناسب:

if (-not $vhdx) {
    Throw-And-Exit "No ext4.vhdx found under '$basePath'."
}

الخطوة 4: موجه التأكيد

تتطلب أدوات إدارة الأقراص الحذر وتحتاج إلى فهم العواقب المحتملة لأفعالك. يُعد موجه التأكيد دائمًا حماية جيدة لمنع فقدان البيانات العرضي أو تغييرات النظام غير المرغوب فيها.

قبل المتابعة، يعرض لك السكربت:

  • اسم التوزيعة (Distro name)
  • مسارها الأساسي (BasePath)
  • مسار ملف VHDX

Write-Host "`nAbout to compact this WSL distro:" -ForegroundColor Magenta
Write-Host "  Distro   : $distro"
Write-Host "  BasePath : $basePath"
Write-Host "  VHDX file: $vhdx`n"

ثم يطالبك بـ “Are you sure you want to proceed? (Y/N)“:

Write-Host "Are you sure you want to proceed? (Y/N) " -ForegroundColor DarkCyan -NoNewline
# Then read the response
$answer = Read-Host

يُطلب منك بعد ذلك كتابة Y (غير حساسة لحالة الأحرف) للمتابعة أو أي شيء آخر للإلغاء.

if ($answer.ToUpper() -ne 'Y') {
    Write-Warning "Operation canceled"
    exit
}

بالنسبة للخطوتين أعلاه، اضطررت لاستخدام خدعة لطباعة السؤال بلون، ولكن خيارًا بسيطًا (بدون ألوان) يمكن أن يكون:

if ((Read-Host 'Are you sure you want to proceed? (Y/N)').ToUpper() -ne 'Y') {
    Write-Warning 'Operation canceled'
    exit
}

الخطوة 5: إيقاف تشغيل WSL والضغط

قبل المتابعة إلى أداة DiskPart، من المهم إيقاف جميع مثيلات WSL قيد التشغيل. مرر أمر الإغلاق مباشرة في PowerShell.

Write-Host "Shutting down WSL…" -ForegroundColor Cyan
wsl.exe –shutdown

خطأ شائع هو نسيان تشغيل PowerShell أو Command Prompt بصلاحيات Administrator. يمكنك منع هذه الحالة برسالة:

if ($LASTEXITCODE -ne 0) {
    Throw-And-Exit "Failed to shut down WSL (exit code $LASTEXITCODE). Are you running as Administrator?"
}

الخطوة 6: تشغيل سكربت DiskPart

بناء السكربت: العملية هي نفسها كما في الجزء اليدوي، ولكن هذه المرة، “نحقن” أوامر DiskPart الجاهزة في السكربت.

$dpScript = @"
select vdisk file="$vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
"@

قبل الإطلاق، هناك خطوتان تحتاج إلى اتخاذهما:

يكتب سكربت PowerShell الأسطر أعلاه إلى ملف مؤقت:

$tempFile = [IO.Path]::GetTempFileName()
Set-Content -LiteralPath $tempFile -Value $dpScript -Encoding ASCII

هذا يعادل الأوامر التي تم تمريرها في الجزء اليدوي: select vdisk file="C:\…\ext4.vhdx" # المسار الكامل لملف القرص الافتراضي attach vdisk readonly compact vdisk detach vdisk exit

قد يستغرق الضغط بعض الوقت، خاصة إذا لم تقم بتنظيف محرك الأقراص الافتراضي من قبل. من الحكمة إظهار تحذير قبل المتابعة:

Write-Host "Running DiskPart to compact the VHDX. Be patient, this might take a while..." -ForegroundColor Cyan

استدعاء DiskPart:

# Run DiskPart with the script saved to the temporary file and process each output line as it arrives
diskpart /s $tempFile | ForEach-Object {
    # Grab any "NN percent" type message from the line
    if ($_ -match '(\d+)\s+percent') {
        # Only print when the percentage actually changes
        Write-Host "$($Matches[1])% completed"
    } else {
        # Just echo all over line-types, verbatim
        Write-Host $_
    }
}

عدة نقاط يجب ملاحظتها هنا:

  • يقوم بتشغيل diskpart /s $tempFile: يقرأ DiskPart وينفذ الأوامر من الملف المؤقت في حلقة PowerShell للمعالجة الفورية.
  • لتجربة مستخدم أفضل: يقوم المقتطف أدناه بحيلة تصفية قيم الحالة المتكررة عن طريق مقارنة $pct بقيمة $lastPct الحارسة، وكتابة أسطر جديدة فقط عندما تختلف. كيف؟ قبل الدخول إلى الحلقة، نقوم بالتهيئة: $lastPct بالقيمة -1
$lastPct = -1 # We initiate a sentinel value

لدينا قيمة “أولى” مضمونة لن تساويها أي نسبة مئوية حقيقية (0-100). بهذه الطريقة، بمجرد رؤية أول 0 بالمائة، 10 بالمائة، أو أي شيء آخر، فإنها تختلف عن -1. ثم:

if ($_ -match '(\d+)\s+percent') {
    # Print only when the percentage changes
    Write-Host "$($Matches[1])% completed"
}

هذا يضمن أنه عند أول تحديث للنسبة المئوية (على سبيل المثال “0 بالمائة” أو “10 بالمائة”)، ستكون $pct –ne $lastPct صحيحة، وبالتالي يتم إصدار السطر الأول. بعد ذلك، يحتفظ $lastPct بآخر نسبة مئوية حقيقية، ولا يتم الطباعة مرة أخرى إلا عندما تأتي نسبة مئوية تقدم جديدة ومختلفة.

يبدو الناتج أكثر نظافة:

10% completed
20% completed
…

وإلا، فسوف يغرق الشاشة بعشرات التحديثات المتطابقة “20 بالمائة مكتمل” (على سبيل المثال).

بالطبع نتعامل مع حالة القيم الأخرى (الأسطر غير المئوية) بشكل طبيعي:

else {
    # non-percent lines: print verbatim
    if ($_ -match '\S') {
        Write-Host $_
    }
}

بمجرد الانتهاء من العملية، لا تنس تنظيف الملف المؤقت.

Remove-Item $tempFile -ErrorAction SilentlyContinue

بنهاية العملية، يجب أن ترى شيئًا كهذا

Leaving DiskPart...

حسنًا، هذا كل ما في البرمجة النصية! إذا جمعت جميع المقتطفات حتى الآن، فما عليك سوى حفظها بامتداد ملف .ps1، أو تنزيل المثال الكامل من مستودع GitHub هذا.

الاستخدام

لديك الآن فهم كامل لما يحدث. هل أنت مستعد للبدء؟

في Windows، افتح Command Prompt أو PowerShell كمسؤول. انتقل إلى الدليل الذي يحتوي على سكربت .ps1 الخاص بك. نفذ السكربت بالأمر التالي، مستبدلاً <File_name_here> باسم ملفك الفعلي:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\<File_name_here>.ps1

تطلق المعاملات -NoProfile -ExecutionPolicy Bypass برنامج PowerShell في بيئة نظيفة وغير مقيدة تتجاهل إعدادات المستخدم وتسمح بتنفيذ السكربت دون قيود أمنية. لا تقلق، في هذه الحالة، لا بأس بذلك.

انتظر… انتظر… انتظر…
صورة متحركة لشخصية كرتونية سعيدة تعبر عن الإنجاز.
أحسنت! لقد استعدت للتو كل تلك المساحة غير المستخدمة داخل WSL2 الخاص بك (تقريبًا) دون عناء!

الآن، يمكنك المضي قدمًا بتعديل هذا السكربت ليعمل تلقائيًا بالكامل، دون موجه التأكيد (الخطوة 4). يمكنك أيضًا جدولته كمهمة صيانة منتظمة باستخدام مجدول المهام (task scheduler):

schtasks /create /tn "Schedule_name" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\path\to\script.ps1" /sc monthly /d 15 /st 09:00

هذا مثال للتنفيذ الشهري حيث تعني /d 15 اليوم الخامس عشر من كل شهر و /st 09:00 هو وقت بدء مضبوط على الساعة 9 صباحًا.

هذا كل شيء! تذكر أن الصيانة الدورية، سواء قمت بها يدويًا أو تلقائيًا، ضرورية لمنع الاستخدام غير الضروري لمساحة القرص وضمان تجربة سلسة مع WSL.

💡 الخلاصة التقنية

تُعد إدارة مساحة القرص في WSL أمرًا حيويًا للحفاظ على أداء نظام Windows و Linux. نظرًا لأن الأقراص الصلبة الافتراضية لـ WSL (ملفات ext4.vhdx) لا تُحرر المساحة غير المستخدمة تلقائيًا، فإن الضغط الدوري ضروري. يوضح هذا المقال طريقتين لتحقيق ذلك: الأولى يدوية باستخدام DiskPart، وتتضمن خطوات مثل إيقاف WSL وتحديد مسار ملف VHDX ثم ضغطه. أما الطريقة الثانية، فتعتمد على الأتمتة عبر سكربت PowerShell، والذي يقوم بتحديد التوزيعات، واختيار الملف الصحيح، وإيقاف WSL، وتشغيل DiskPart بشكل آلي. يمكن جدولة هذا السكربت ليعمل بانتظام، مما يوفر حلاً فعالاً ومستدامًا لمشكلة استهلاك مساحة القرص في WSL ويضمن بيئة عمل نظيفة وفعالة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *