اگر برنامهنویسی هستید که از جابهجایی مداوم بین ویندوز و ماشینهای مجازی لینوکس خسته شدهاید، حالا میتوانید یک دسکتاپ کامل XFCE را مستقیماً درون یک پنجره بومی ویندوز اجرا کنید. این پروژه با نام Azure Linux Desktop توسط توسعهدهندهای به نام sirredbeard ساخته شده تا مرزهای ابزارهای جدید معرفیشده در کنفرانس Microsoft Build ۲۰۲۶ را به چالش بکشد.
این تجربه در زمانی عرضه میشود که مایکروسافت بهشدت در حال جداسازی محیطهای لینوکس از ماشینهای مجازی سنتی است. با حرکت به سمت کانتینرهای سبک و سازگار با OCI که بهصورت بومی روی ویندوز اجرا میشوند، هدف این است که اصطکاک «بوت شدن» که معمولاً با توسعه لینوکس روی ویندوز همراه است، بهطور کامل حذف شود.
به نقل از مستندات این پروژه که در ۶ ژوئن ۲۰۲۶ منتشر شد، این برنامه در واقع یک پوشش (Wrapper) است که تمام پیچیدگیهای زیرساختی و لولهکشیهای فنی را پنهان میکند. شما برنامه را اجرا میکنید، یک صفحه بوت را میبینید و تنها چند ثانیه بعد، در حال تعامل با یک دسکتاپ لینوکسی هستید که از شتاب GPU، صدا و قابلیت کپی-پیست یکپارچه پشتیبانی میکند. در اینجا هیچ دکمهای، جادوگر تنظیماتی (Setup Wizard) یا ترمینالی برای پیمایش وجود ندارد؛ پنجره بهسادگی تبدیل به خودِ دسکتاپ میشود.
موتور فنی
هسته این تجربه بر چهار مؤلفه خاص از اکوسیستم Build ۲۰۲۶ استوار است:
- wslc: این محیط زمان اجرای جدید کانتینرهای لینوکس برای ویندوز است. برخلاف WSL سنتی، wslc کانتینرهای OCI را بهصورت بومی اجرا میکند. این برنامه مستقیماً از APIهای wslc برای ایجاد نشستها (Sessions)، بارگذاری تصاویر (Images) و نقشهبرداری پورتها بدون نیاز به ترمینال استفاده میکند. اگرچه wslc هنوز در نسخه پایدار WSL قرار نگرفته است، اما از طریق دستور
wsl.exe --update --pre-releaseیا با بیلد کردن از شاخه اصلی (main) متنباز در دسترس است. - WinUI Reactor: رویکردی کد-محور برای ساخت رابطهای WinUI 3 است. این ابزار XAML را با توابع ترکیبپذیر و State Hookها در C# جایگزین میکند؛ دقیقاً مشابه روشی که React برای وب عمل میکند. کل رابط برنامه در فایل
App.csبا استفاده از کارخانههای (Factories) Reactor برای نوار عنوان، صفحه بوت و سطح دسکتاپ ساخته شده است. در کل این پروژه حتی یک فایل .xaml وجود ندارد. - Azure Linux 4.0: به عنوان تصویر پایه (Base Image) عمل میکند. اگرچه Azure Linux در درجه اول یک توزیع سروری و کانتینری است، اما نسخه ۴.۰ از یک اسنپشات Fedora Linux 43 ساخته شده است. این تبار مشترک به توسعهدهنده اجازه داد تا بستههای دسکتاپ XFCE را از مخازن فدورا ۴۳ فراخوانی کند. اگرچه این روش برای محیطهای عملیاتی یک «هک بد» تلقی میشود، اما قدرت تبار مشترک بستهها در دنیای متنباز را به خوبی نشان میدهد.
- .NET 10: برنامه از آخرین فریمورک .NET ۱۰ و Windows App SDK استفاده میکند. برای دستیابی به استارت سریعتر (Cold Start)، از پیشکامپایل ReadyToRun بهره میبرد و مدیریت پروژه از طریق یک فایل واحد
.slnxانجام میشود. تنها با یک دستور Publish، میتوان نسخههای x64 یا ARM64 را تولید کرد.

«هکهای» پشت پرده
رندر کردن یک رابط گرافیکی لینوکس درون یک پنجره WinUI نیازمند چندین راهکار غیرمتعارف و پیچیده بود. توسعهدهنده اشاره میکند که این برنامه یک «اسباببازی» (Toy) است و از نسخههای ناپایدار WSL از شاخه main استفاده میکند تا زودتر به runtime مربوط به wslc دسترسی داشته باشد. او در واقع بستههای دسکتاپ فدورا را روی یک توزیع سروری سوار کرده است که هرگز برای این هدف طراحی نشده بود.
نمایش و رندرینگ
برای مدیریت نمایش، برنامه از mstscax.dll (کنترل ActiveX کلاینت RDP ویندوز) استفاده میکند. از آنجا که DirectX Presenter این کنترل هنگام تغییر والد (Reparenting) به زیرمجموعه DesktopChildSiteBridge در WinUI بهدرستی رندر نمیشود و در صورت ایجاد بهصورت مخفی یا لایهبندی شده کرش میکند، توسعهدهنده یک راهکار جایگزین به کار برد. کلاینت RDP در یک پنجره WinForms بدون حاشیه (Borderless) قرار دارد که توسط پنجره اصلی مالکیت آن را بر عهده دارد. این پنجره تا زمان آماده شدن در خارج از صفحه پارک شده و سپس توسط یک تایمر ردیابی که جابهجایی و تغییر اندازه پنجره را دنبال میکند، روی یک مستطیل جایگزین (Placeholder) «چسبانده» میشود.
صدا و زمانبندی
مدیریت صدا از طریق ماژول pipewire-module-xrdp انجام میشود. از آنجا که نشستهای کانتینری در واقع ماشینهای مجازی مجزا هستند، نمیتوانند از صدای WSLg استفاده کنند. این ماژول باید در یک مرحله از بیلد، در برابر PipeWire خودِ تصویر کامپایل شده و پس از فعال شدن pipewire-pulse اجرا شود.
برای همگامسازی زمان، لانچر شناسه منطقه زمانی (Timezone ID) ویندوز میزبان را به نام IANA تبدیل کرده و در شروع کانتینر، مسیر /etc/localtime را به آن تغییر میدهد. این کار باعث میشود ساعت دسکتاپ بدون تغییر در خودِ ساعت سیستم، با میزبان یکی شود و از همگامسازی زمانی Hyper-V بهره ببرد.
صیقل بصری (Visual Polish)
برای زیبایی بصری، توسعهدهنده بهجای استفاده از GIF، یک چرخاننده بوت (Boot Spinner) را با استفاده از Visual Compositionهای خام پیاده کرد. شش نقطه با استفاده از انیمیشنهای کلید-فریم Vector3 که از یک Sweep نرم نمونهبرداری شدهاند، دور یک مرکز میچرخند. هر نقطه یک Sprite Shape است که با تأخیر زمانی اجرا میشود تا اثر دنبالهدار (Trailing Effect) ایجاد کند. این فرآیند کاملاً روی Compositor اجرا میشود و در هر فریم هیچ کد مدیریتشدهای (Managed Code) مصرف نمیکند.
حل محدودیتهای کانتینر
یکی از چالشهای بزرگ، رندر کردن آیکونهای SVG بود. فدورا ۴۳ لودر librsvg gdk-pixbuf را حذف کرده و بهجای آن از glycin استفاده میکند که برای سندباکسینگ از bubblewrap بهره میبرد. اما چون bubblewrap نمیتواند در داخل کانتینر فضای نام کاربر (User Namespace) ایجاد کند، آیکونهای SVG بهصورت جایگزینهای خالی (Placeholders) نمایش داده میشدند.
راه حل این بود که تمام SVGهای تم در طول فرآیند ساخت تصویر به PNG تبدیل (Rasterize) شوند. این کار تضمین کرد که دسکتاپ XFCE — که یک بازسازی نوستالژیک از تم Bluecurve سال ۲۰۰۲ رد هت است — بهدرستی نمایش داده شود. برای کاربردیتر شدن محیط، نصب Visual Studio Code و PowerShell نیز به تصویر اضافه شد.
تحلیل: حرکت به سوی لینوکس «نامرئی»
این پروژه نشاندهنده تغییری در نحوه تعامل توسعهدهندگان با ابزارهای چندپلتفرمی است. با تبدیل یک دسکتاپ کامل لینوکس به یک «اپلیکیشن» کانتینری و یکبار مصرف بهجای نصب یک سیستمعامل پایدار، مرز بین ویندوز و لینوکس تقریباً نامرئی میشود.
برای کاربر عادی، این یعنی امکان استقرار محیطهای پیچیده لینوکسی وابسته به GUI در چند ثانیه، بدون سربار یک ماشین مجازی کامل. این پروژه ثابت میکند که میتوان از تبار مشترک بین Azure Linux و Fedora برای تبدیل سریع یک توزیع سروری به یک محیط دسکتاپ استفاده کرد.
با این حال، تکیه بر نسخههای ناپایدار WSL و استفاده از «چسب» WinForms برای WinUI نشان میدهد که این APIها هنوز در حال تکامل هستند. ارزش واقعی در اثبات مفهوم (PoC) است: API مربوط به wslc سطحی از کنترل برنامهریزیشده روی کانتینرهای لینوکس را فراهم میکند که پیش از این بسیار دشوار بود.
ساخت پروژه
اگر میخواهید این پروژه را خودتان امتحان کنید، فرآیند شامل کلون کردن مخزن به همراه سابمدولها و اجرای یک اسکریپت تنظیمات برای نصب .NET 10 SDK، CMake و مؤلفههای Visual Studio است. شما باید WSL را از سورسهای bundled بسازید و نصب کنید تا زودتر به wslc دسترسی داشته باشید. پس از ساخت تصویر Azure Linux XRDP و تنظیم EnableWslcSdk روی true در پروژه اپلیکیشن، میتوانید از دستورات dotnet build و dotnet run استفاده کنید.
هشدار: ساخت WSL از شاخه main، نسخه نصبشده شما را با یک بیلد توسعهدهنده جایگزین میکند. از انجام این کار روی ماشینهای حساس و عملیاتی که نیاز به پایداری مطلق دارند، خودداری کنید. هدف صرفاً این است که ببینیم وقتی قطعات Microsoft Build ۲۰۲۶ به هم متصل میشوند چه اتفاقی میافتد: یک دسکتاپ لینوکس، در یک پنجره، از یک کانتینر، و بدون حتی یک خط XAML.




گفتگو