با WSL یا Window Subsystem For Linux امکان اجرای برخی از برنامه های لینوکسی روی ویندوز فراهم شد. در نسخه ۲ این ابزار به لطف وجود یک کرنل لینوکس، امکان اجرای هر نوع برنامه ای وجود داره. اما، امکان اجرای برنامه های گرافیکی چطور؟

در زمان نگارش این مقاله، امکان اجرای برنامه های گرافیکی روی WSL 2 در نسخه های Insider ویندوز ۱۰ و ویندوز ۱۱ وجود داره. به این شکل که برنامه های گرافیکی مستقیم روی ویندوز به راحتی اجرا میشن.

اما اگر به این نسخه از ویندوز دسترسی نداشته باشیم، با استفاده از xrdp میتونیم به صورت Remote به لینوکس وصل بشیم و از محیط گرافیکی استفاده کنیم. اما چجوری؟

بروز رسانی پکیج های لینوکس

اولین قدم بروز رسانی لیست و پکیج های نصب شده روی Distribution مورد استفاده هست. من از Ubuntu استفاده می کنم، پس با دستور زیر لیست و خود پکیج ها رو بروز می کنم:

sudo apt update
sudo apt upgrade

نصب xfce روی لینوکس در WSL

طبیعتاً برای کار با برنامه های گرافیکی نیاز به یک محیط GUI در لینوکس و WSL داریم. در این مقاله از xfce استفاده می کنیم که یک محیط سبک و مناسب هست. برای نصب xfce در WSL 2 از دستور زیر استفاده می کنیم:

sudo apt install xfce4

نصب این محیط ممکن است کمی طول بکشد پس صبر کنید! همچنین چیزی حدود ۷۶۰ مگابایت فایل دانلود می شود. احتمالا بعد از دانلود فایل های مورد نیاز و قبل از نصب تصویری به شکل زیر میبینید که باید lightdm انتخاب کنید.

WSL-Ubuntu-xfce-lightdm

نصب و کانفیگ Xrdp روی لینوکس در WSL

حالا برای اتصال ریموت به لینوکس در WSL نیاز به xrdp یا vnc داریم. چون هاست ما ویندوزی هست و به صورت پیشفرض شامل RDP هم هست از xrdp استفاده می کنیم. برای نصب دستور زیر رو اجرا کنید:

sudo apt install xrdp

به صورت پیشفرض تنظیمات Xrdp در آدرس زیر قرار داره:

/etc/xrdp/xrdp.ini

لازم هست تغییراتی در اون ایجاد کنیم پس با دستور زیر از اون بکاپ میگیریم (یک کپی ساده!) :

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

پورت پیشفرض RDP برابر ۳۳۸۹ هست و چون WSL عمل Port Mapping بین لینوکس و هاست (ویندوز) انجام میده (تا برنامه های اجرا شده در لینوکس با همون پورت در ویندوز هم در دسترس باشند)، نمیتونیم از این پورت برای اجرای Xrdp در لینوکس استفاده کنیم (تداخل با RDP خود ویندوز). پس با دستور زیر پورت xrdp به ۳۳۹۰ تغییر میدیم:

sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

پ.ن ۱ : دستور sed برای فیلتر و جایگزینی عبارات در استریم های متنی کاربر داره.

سپس با استفاده از یک ادیتور همانند nano فایل زیر رو باز کنید:

sudo nano /etc/xrdp/startwm.sh

در انتهای این فایل، دو خط زیر رو با قرار دادن # در ابتدای خط، کامنت کنید. مثل زیر:

# test -x /etc/X11/Xsession && exec /etc/X11/Xsession
# exec /bin/sh /etc/X11/Xsession

سپس عبارت زیر اضافه کنید:

startxfce4

این دستور در واقع یک Script است که یک Xfce Session ایجاد می کند.

سپس برای اجرای xrdp از دستور زیر استفاده می کنیم:

sudo /etc/init.d/xrdp start

همچنین با دستور زیر میتونیم از وضعیت اجرا اطمینان حاصل کنیم:

sudo /etc/init.d/xrdp status

اتصال به لینوکس با Remote Desktop Connection

برای اتصال به محیط گرافیکی لینوکس در WSL ، برنامه Remote Desktop Connection را در ویندوز باز کنید. در قسمت Computer مقدار localhost:3390 را وارد کنید و روی دکمه Connect کلیک کنید. توجه کنید که ۳۳۹۰ پورت Xrdp در لینوکس هست که بالاتر تغییر دادیم. سپس همانند تصویر زیر نام کاربری و رمز عبور خود را وارد کنید.

Remote-Desktop-Connection-Xrdp-Xfce-WSL

سپس وارد محیط گرافیکی لینوکس خواهید شد!

Remote-Desktop-Connection-Xrdp-Xfce-WSL-Desktop

بعد از نصب فایر فاکس:

Softamoz in wsl with xrdp and xfce

 

سایر تنظیمات Xrdp

در برخی از مقالات مشابه دو دستور زیر استفاده می شوند:

sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
و
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini

دستور اول مقدار max bits per pixel برابر ۱۲۸ و دستور دوم هم همین مقدار رو برای X server روی ۱۲۸ قرار میده. برای کسب اطلاعات بیشتر به این لینک و این لینک مراجعه کنید.

برخی از مشکلات

در این قسمت برخی از مشکلات این روش رو بررسی می کنیم.

درایور کارت گرافیک

شاید بعد از ارائه نهایی WSL g که امکان اجرای مستقیم (منظورم عدم استفاده از مواردی که در این پست نوشتم) برنامه های لینوکسی روی ویندوز فراهم هست، نیازی به هیچ یک از این موارد نباشه. بخصوص برنامه هایی که از کارت گرافیک یا صدا استفاده می کنند. چون همراه با WSL g درایور کارت گرافیک مخصوص کرنل لینوکس نصب خواهد شد اما در روش فعلی خیر. پس ممکن است در اجرای برخی از برنامه ها مشکلاتی داشته باشیم.

مشکل Stop نشدن WSL

بر خلاف ماشین های مجازی، اگر تسکی روی WSL درحال اجرا نباشد، به حالت Stop در می آید. با دستور زیر می توانید وضعیت دیسترو های موجود روی سیستم رو بررسی کنید:

wsl -l -v

احتمالا بعد از خواندن و اجرای دستورات این مقاله، متوجه خواهید شد که دیسترو لینوکس مورد استفاده شما به حالت Stop وارد نمی شود (من این مشکل رو داشتم). توجه داشته باشید که امکان اجرای Background Task ها روی WSL فراهم هست. برای کسب اطلاعات بیشتر به این لینک مراجعه کنید. پس ممکن است یک تسک در پس زمینه در حال اجرا باشد و دیسترو شما رو در حالت Running نگه داره.

همچنین در WSL برخلاف ماشین های مجازی، منابع مصرفی بخصوص Ram در صورت عدم استفاده آزاد خواهند شد، که یکی از دلایل بهینه بودن WSL نسبت به VM همینه. پس نتیجه میگیریم در صورت Stop نشدن دیسترو و عدم نیاز ما به اون، منابع سیستم درحال اتلاف هستند!

راه حل اول، استفاده از htop در دیسترو هست. با اجرای این دستور یک محیط تقریبا! گرافیکی (از دستور top خود لینوکس) در اختیار شما قرار میگیره. با استفاده از این برنامه میتونید پردازش های درحال انجام ببینید و حتی اون ها رو kill کنید. پس از kill کردن پردازش های غیر لازم و exit از دیسترو خواهید دید پس از مدت کوتاهی، دیسترو به حالت Stop وارد می شود.

راه حل دوم استفاده از Argument های خود WSL است:

wsl --shutdown
    //Immediately terminates all running distributions and the WSL 2 lightweight utility virtual machine.

wsl -t <Distro Name>
    //Terminates the specified distribution.

فعال و غیر فعال کردن سرویس Xrdp

برای فعال یا غیر فعال کردن سرویس Xrdp در صورت نیاز میتونید از دستورات استفاده شده در قسمت های قبل بهره ببرید یا از این دستورات استفاده کنید :

sudo service xrdp stop

sudo service xrdp start

sudo service xrdp status

طبیعتاً این دستورات برای سایر سرویس ها نیز همچون lightdm و … نیز قابل استفاده هستند.

 

منابع و مطالعه بیشتر:

تنظیم Line Ending برای Git در WSL 2

تغییر محل ذخیره سازی ایمیج های Docker Desktop در WSL