پارچ از دی‌ماه ۱۴۰۴ تا الان: چی شد و چی میشه

یه چیزی هست که هر توسعه‌دهنده‌ای توی زندگیش یه بار باهاش مواجه میشه: لحظه‌ای که می‌فهمه پایه‌ی ساختمونی که داره می‌سازه کجه. نه خیلی، نه به اون شکلی که الان بیفته، ولی اگه ده طبقه‌ی دیگه روش بری، اون یه درجه انحراف تبدیل میشه به یه مشکل اساسی. اون لحظه دو جواب داره: یا نادیده می‌گیریش و امیدواری که معجزه‌ای بشه، یا برمی‌گردی و درستش می‌کنی.

بعد از اعتراضات دی‌ماه ۱۴۰۴ و شروع قطعی اینترنت، به ما یه فرصت اجباری داد که بشینیم و به پارچ نگاه کنیم. نه به عنوان یه پروژه‌ای که باید بهش امکانات جدید اضافه بشه، بلکه به عنوان یه سیستمی که باید از پایه درست باشه. چند هفته‌ای که وابستگی‌های بیرونی قطع بودن، ما با آنچه داشتیم کار کردیم. نتیجه‌اش پارچ نکست شد.

این پست قراره توضیح بده که از اون روزها تا الان دقیقاً چه اتفاقاتی افتاده، چرا افتاده، و بعدی چی میشه.

پارچ نکست چیه و چرا یه پروفایل جداست؟

قبل از هر چیز یه سوءتفاهم رایج رو برطرف کنم: پارچ نکست یه نسخه‌ی مستقل نیست که بخواد با پارچ اصلی رقابت کنه. یه پروفایل آزمایشیه که تغییرات جدید روش اعمال میشن قبل از اینکه به پروفایل‌های اصلی مرج بشن.

تصور کنید گیت داره. یه شعبه‌ی main دارید که پایداره و کاربرهای عادی ازش استفاده می‌کنن. یه شعبه‌ی dev دارید که توسعه‌دهنده‌ها و علاقه‌مندان به تست، commit‌های جدید رو اونجا می‌ریزن. پارچ نکست همون شعبه‌ی dev هست، ولی برای پروفایل ISO. هر تغییری که الان توی پارچ نکست هست، دیر یا زود به پروفایل‌های اصلی پارچ مرج میشه.

این رویکرد دو مشکل همیشگی دیستروها رو حل می‌کنه. اول اینکه کاربرهایی که می‌خوان آخرین تغییرات رو داشته باشن و حاضرن یه سری bug رو تحمل کنن، یه ISO دارن که برای اوناست. دوم اینکه کاربرهایی که می‌خوان یه دسکتاپ آروم و بدون دردسر داشته باشن، مجبور نیستن با هر تغییر آزمایشی کنار بیان. هر دو گروه خوشحالن و ما هم هر دو گروه رو داریم.

خروجی این رویکرد اینه که وقتی یه تغییر روی پارچ نکست خوب کار کرد و مشکلی نداشت، با اطمینان بیشتری وارد ISO اصلی میشه. نسخه‌ی اصلی پارچ دیگه آزمایشگاه نیست، شده خروجی چیزی که قبلاً تست شده.

کدنیم نسخه: Arash

پارچ نکست از این به بعد با کدنیم «آرش» شناخته میشه.

آرش، شخصیت حماسی ایرانیه که تیری انداخت که مرز ایران رو مشخص کرد. تیری که با جانش پرتاب شد. این کدنیم انتخاب تصادفی نیست. پارچ نکست هم داره یه مرز مشخص می‌کنه: بین اون چیزی که بودیم و اون چیزی که می‌خوایم بشیم.

تغییرات در فشرده‌سازی

این تغییر ممکنه از بیرون خشک و تکنیکال به نظر برسه، ولی برای هر کسی که ISO پارچ رو بوت کرده، یکی از ملموس‌ترین تفاوت‌هاست.

قبلاً از xz برای فشرده‌سازی SquashFS استفاده می‌کردیم. initramfs هم با xz -9e فشرده می‌شد. xz الگوریتم خوبیه از نظر نسبت فشرده‌سازی، ولی یه مشکل اساسی داره: تک‌رشته‌ایه. یعنی وقتی سیستم داره بوت میشه و می‌خواد روت فایل‌سیستم رو از SquashFS لود کنه، فقط یه هسته از پردازنده‌ات کار می‌کنه. اگه یه پردازنده‌ی ۸ هسته‌ای دارید، هفت هسته نشستن تماشا می‌کنن که اون یکی داره کار می‌کنه. این اتلاف محض‌ه.

الان به zstd مهاجرت کردیم. SquashFS با zstd -level 15 فشرده میشه و initramfs با zstd -19. zstd چند ویژگی داره که آن رو برای این کار بهتر می‌کنه. اول اینکه multi-threaded decompress می‌کنه، یعنی از همه‌ی هسته‌های پردازنده استفاده می‌کنه. دوم اینکه سرعت decompression تقریباً سه تا چهار برابر xz‌ه. سوم اینکه نسبت فشرده‌سازیش هم قابل قبوله، فقط ISO نهایی یه پنج تا هشت درصد بزرگ‌تر میشه.

این پنج تا هشت درصد بزرگ‌تر شدن ISO در مقابل اینکه بوت از بوت‌لودر تا رسیدن به دسکتاپ محسوس‌تر سریع‌تر بشه، معامله‌ی کاملاً منطقیه. مثل اینه که قبلاً یه جعبه‌ی کادو رو با سه لایه چسب نواری بسته بودیم و الان با یه لایه بستیمش. کادو یه کم بزرگ‌تر به نظر میاد، ولی باز کردنش دیگه به چاقو و ده دقیقه وقت نیاز نداره.

خداحافظ SDDM

وقتی از تغییر display manager حرف می‌زنیم، خیلی‌ها فکر می‌کنن این یه swap ساده‌ست. یه بسته رو برمی‌داری، یه بسته‌ی دیگه می‌ذاری. ولی نیست.

مدیر نمایش SDDM یه display manager محترم و باسابقه‌ست. سال‌ها کار کرده، مشکل خاصی نداشته، و روی X11 عالی اجرا میشه. ولی مشکل دقیقاً همینجاست: SDDM با Qt5 ساخته شده. وقتی کل stack پلاسما داره به Qt6 و Wayland مهاجرت می‌کنه، نگه داشتن یه لایه‌ی Qt5 زیر همه چیز یعنی داری یه dependency قدیمی رو به زور با خودت حمل می‌کنی. مثل اینه که یه ماشین ۲۰۲۵ داری ولی کاربراتور دهه‌ی هشتاد هنوز توی موتورشه چون «بهرحال کار می‌کنه» بنایراین مدیر نمایشplasma-login-manager جایگزینش شد. این display manager رو KDE خودش ساخته، مستقیماً با stack پلاسما integrate شده، Wayland-native‌ه، و به عنوان یه systemd service مدیریت میشه. autologin برای liveuser هم حفظ شد، یعنی وقتی ISO رو بوت می‌کنید، مستقیم میرید توی دسکتاپ. پیکربندیش هم ساده‌تر شد: به جای پوشه‌ی /etc/sddm.conf.d/ با چند فایل پراکنده، الان یه فایل /etc/plasmalogin.conf داریم با دو خط AutoLoginUser=liveuser و AutoLoginSession=plasma. همین.

این تغییر یه بدهی فنی بزرگ رو پرداخت کرد. پایه‌ی display system الان با بقیه‌ی stack هم‌تراز‌ه.

Wayland

پلاسما 6 وقتی اومد، یه اعلامیه‌ی واضح داشت: Wayland اولویت اوله. X11 هنوز هست ولی مهمان ناخوانده‌ست. KDE دیگه منابع زیادی برای X11 نمی‌ذاره و مشکلات Wayland رو اولویت بالاتری دارن.

ما دو بسته اضافه کردیم که این رو عملیاتی می‌کنن. plasma-wayland-session session entry‌ی Wayland رو در display manager فراهم می‌کنه. بدون این بسته، وقتی توی display manager می‌خواستید session انتخاب کنید، فقط گزینه‌ی X11 می‌دیدید. qt6-wayland هم plugin Wayland برای تمام اپ‌های Qt6‌ه. بدون این، Dolphin و Konsole و Kate و بقیه‌ی اپ‌های KDE یا مجبور بودن از XWayland استفاده کنن که یه لایه‌ی compatibility‌ه و overhead داره، یا اصلاً درست رندر نمی‌شدن.

Wayland چرا بهتره؟ چند دلیل اساسی داره. اول امنیت: توی X11، هر اپلیکیشنی می‌تونه ورودی صفحه‌کلید اپ‌های دیگه رو بخونه. این یه مشکل امنیتی جدیه که Wayland با isolation هر پنجره از بین برده. دوم HiDPI: مانیتورهای با رزولوشن بالا روی Wayland خیلی بهتر کار می‌کنن. سوم VSync و تیرینگ: روی مانیتورهای مدرن، Wayland یه جلوه‌ی بصری نرم‌تر و بدون پارگی تصویر داره.

با این تغییرات، یه session خالص Wayland از همون اول در دسترسه.

kio-admin

این تغییر کوچیکه ولی برای کاربر روزمره یکی از محسوس‌ترین‌هاست.

قبلاً اگه می‌خواستید یه فایل توی /etc/ رو با Dolphin ویرایش کنید، دو راه داشتید. یا ترمینال باز می‌کردید و sudo nano /etc/... می‌زدید، یا Dolphin رو با sudo اجرا می‌کردید که یه ایده‌ی بسیار بدیه. اجرای برنامه‌های گرافیکی با sudo مشکلات متنوعی ایجاد می‌کنه، از خراب شدن فایل‌های پیکربندی کاربر تا مشکلات امنیتی که بعداً باهاشون مواجه می‌شید.

kio-admin این مشکل رو حل کرد. الان وقتی می‌خواید یه فایل محافظت‌شده رو توی Dolphin ویرایش کنید، یه پنجره‌ی polkit نشون داده میشه، رمز می‌زنید، فایل ذخیره میشه. همین. مثل macOS، مثل Windows، مثل هر سیستم‌عامل مدرنی که privilege elevation رو درست پیاده‌سازی کرده. کار درست رو به روش درست انجام داد.

بسته‌های گرافیکی

دو دسته بسته اضافه شد که با هم یه جریان کاری دیزاین و عکاسی کامل‌تر می‌سازن.

kdegraphics-thumbnailers thumbnail برای فرمت‌های کمتر رایج می‌سازه. عکس‌های RAW دوربین‌ها یعنی CR2، NEF، CRW و ده‌ها فرمت دیگه. فایل‌های PostScript و EPS. قبلاً وقتی عکس‌های خامتون رو از کارت حافظه توی Dolphin باز می‌کردید، یه آیکون خالی می‌دیدید و باید حدس می‌زدید کدوم عکسه. الان پیش‌نمایش دارید.

kimageformats و qt6-imageformats پشتیبانی از فرمت‌های اضافه رو برای کل Qt stack فراهم می‌کنن. PSD که فرمت فتوشاپه، XCF که فرمت GIMP، EXR که برای rendering و VFX استفاده میشه، PCX، RAS و چند فرمت دیگه. بدون این‌ها، Gwenview و بقیه‌ی اپ‌های KDE که از Qt image pipeline استفاده می‌کنن نمی‌تونستن این فایل‌ها رو باز کنن. با این‌ها، جریان کاری کامل‌تری برای طراح‌ها و عکاس‌ها داریم.

bat، lynx و یه bug قدیمی

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

bat اضافه شد. bat یه جایگزین cat با syntax highlighting، شماره‌ی خط، و integration با گیت‌ه. وقتی یه فایل Python یا YAML باز می‌کنید، رنگ‌بندی می‌بینید، نه یه دیوار متن خاکستری. ما قبلاً توی .bashrc و .zshrc یه alias داشتیم که cat رو به bat map می‌کرد، ولی خود بسته نصب نبود. این یعنی alias وجود داشت، ولی به محض اجرا command not found می‌داد. یه وضعیت عجیب که آدم مطمئن نبود آیا alias خراب‌ه یا سیستم مشکل داره. الان bat نصب‌ه و alias کار می‌کنه.

یه باگ ظریف هم برطرف شد که ممکنه خودتون باهاش مواجه شده باشید بدون اینکه بدونید چرا: قبلاً bat با --color=always صدا زده می‌شد. این آرگومان به bat می‌گه که ANSI color code‌ها رو همیشه توی خروجی بذار، حتی وقتی خروجی داره به یه pipe یا فایل میره. این یعنی اگه می‌نوشتید cat file.txt | grep keyword، توی نتیجه یه مشت \e[32m و کارکترهای مشابه می‌دیدید. الان به --color=auto تغییر کرد که فقط وقتی خروجی یه ترمینال‌ه، رنگ می‌ده. وقتی pipe می‌کنید، متن خالص می‌گیرید.

lynx هم اضافه شد. lynx یه مرورگر ترمینالیه که اسکریپت Installation_guide ازش استفاده می‌کنه تا راهنمای نصب Arch Wiki رو باز کنه. بدون این، اسکریپت با خطای command not found می‌افتاد و کاربر می‌موند سردرگم که چرا راهنمای نصب باز نمیشه.

تغییرات در pacman

ParallelDownloads از ۳ به ۱۰ رفت. این یعنی pacman الان می‌تونه همزمان تا ده بسته دانلود کنه. روی اینترنت‌های سریع این تفاوت محسوسیه، چون معمولاً دانلود کردن بسته‌ها گلوگاه اصلی نصب‌ه، نه استخراجشون.

Color هم فعال شد که خروجی pacman رنگ‌دار بشه. VerbosePkgLists هم فعال شد که بسته‌ها رو به تفکیک مخزن نشون میده. وقتی دارید یه بسته نصب می‌کنید و می‌بینید [core] یا [extra] کنار اسمش، می‌فهمید از کجا داره میاد. کوچیکه ولی خواندن خروجی pacman رو خیلی راحت‌تر می‌کنه.

تنظیمات kernel

چند تنظیم sysctl اضافه شد که با هم یه سیستم responsive‌تر می‌سازن. اینا تنظیماتی هستن که پیش‌فرض‌های kernel برای workload‌های مدرن کافی نیستن.

vm.vfs_cache_pressure = 50 به kernel می‌گه که inode و dentry cache های فایل‌سیستم رو بیشتر توی RAM نگه داره. پیش‌فرض ۱۰۰ یعنی kernel تحت فشار حافظه خیلی سریع این cache‌ها رو آزاد می‌کنه. با ۵۰، وقتی دارید کامپایل می‌کنید یا روی یه مخزن گیت بزرگ کار می‌کنید یا فایل‌های زیادی رو جابه‌جا می‌کنید، سیستم خیلی سریع‌تر جواب می‌ده. دلیلش اینه که metadata‌های دایرکتوری‌ها توی RAM مونده و لازم نیست هر بار از دیسک خونده بشه.

net.core.somaxconn = 4096 حداکثر backlog اتصال‌های socket رو از ۱۲۸ به ۴۰۹۶ رسوند. ۱۲۸ یه عدد قدیمیه که از زمانی مونده که سرورها با صد اتصال همزمان کنار می‌اومدن. برای کسایی که روی سیستم سرویس‌های شبکه راه می‌اندازن یا با BBR TCP کار می‌کنن، این عدد خیلی مهمه. BBR یه الگوریتم congestion control مدرنه که با فضای بیشتر در backlog بهتر کار می‌کنه.

BBR هم به عنوان الگوریتم پیش‌فرض TCP تنظیم شده، با fq_codel برای queue management. این ترکیب روی اتصال‌های با تاخیر بالا که خیلی از ما باهاشون سر و کار داریم، عملکرد بهتری نسبت به الگوریتم‌های قدیمی‌تر داره.

swappiness هم ۱۰ تنظیم شده. پیش‌فرض ۶۰ یعنی kernel خیلی زود شروع می‌کنه به استفاده از swap. با ۱۰، تا وقتی RAM خیلی پر نشده، swap استفاده نمیشه. برای یه live ISO که معمولاً RAM کافی داره، این تنظیم سیستم رو پاسخ‌گوتر نگه می‌داره.

برگشت VM guest agents

یه اشتباه صادقانه اعتراف می‌کنم. یه مرحله، virtualbox-guest-utils، open-vm-tools، و hyperv رو به خاطر کاهش حجم حذف کردیم. این تصمیم اشتباه بود و برگشتیم.

واقعیت اینه که بیشتر کسایی که یه ISO لایو رو تست می‌کنن، اون رو توی یه ماشین مجازی بالا میارن. VirtualBox، VMware، یا Hyper-V. بدون guest agent‌ها، clipboard sharing کار نمی‌کنه، resize پنجره‌ی VM روی دسکتاپ اعمال نمیشه، mouse integration درست کار نمی‌کنه، و folder sharing هم نداریم. یعنی اولین تجربه‌ای که یه تستر از پارچ می‌گیره، ناقص و آزاردهنده‌ست.

این بسته‌ها برگشتن. حجم روی هم رفته پنج مگابایته. در مقابل اون تجربه‌ای که برمی‌گردوندن، اصلاً قابل بحث نیست.

اسکریپت build

این یکی برای کسایی که روی پارچ مشارکت می‌کنن یا می‌خوان ISO رو خودشون بیلد کنن، خیلی مهمه.

اسکریپت build قبلی ۵۹ خط بود. انجام می‌داد کارش رو، ولی هیچ کنترلی بهتون نمی‌داد. می‌خواستید یه تغییر کوچیک تست کنید؟ باید کل dependency installation رو از اول می‌رفتید. می‌خواستید سریع‌تر بیلد بگیرید؟ راهی نبود. اسکریپت fail می‌کرد؟ ممکن بود به آروم ادامه بده و شما فکر کنید همه چیز خوبه.

الان ۱۹۰ خطه و چهار آرگومان داره.

--skip-deps از نصب مجدد dependency‌ها رد میشه. وقتی دارید برای پنجمین بار یه تغییر کوچیک رو تست می‌کنید، لازم نیست هر بار صبر کنید dependency‌ها نصب بشن. این تنها خودش چند دقیقه از هر بیلد کم می‌کنه.

--skip-clean پوشه‌ی work/ رو پاک نمی‌کنه. mkarchiso می‌تونه از cached package download‌ها و incremental artefact‌های قبلی استفاده کنه. بیلدهای بعدی خیلی سریع‌تر میشن، چون لازم نیست از صفر شروع کنه.

-j یا --jobs تعداد core‌هایی که استفاده میشه رو کنترل می‌کنه. برای کسایی که روی یه ماشین با منابع محدود یا داخل یه VM بیلد می‌گیرن.

--help هم توضیح میده چی به چیه، که ظاهراً خیلی‌ها فراموش می‌کنن اضافه‌اش کنن.

یه چیز ظریف دیگه: اسکریپت الان exit code‌ی mkarchiso رو چک می‌کنه و اگه fail بشه با error خارج میشه. قبلاً می‌شد mkarchiso fail بشه و اسکریپت بیلد ادامه بده و یه ISO خراب بسازه. این برای CI و بیلدهای خودکار حیاتیه. زمان بیلد هم الان نشون داده میشه.

چیزهایی که تغییر کردن ولی به چشم نمیان

مرورگر پیش‌فرض از zen-browser به Firefox تغییر کرد. zen-browser مرورگر خوبیه ولی برای یه ISO عمومی که باید روی طیف وسیعی از سیستم‌ها کار کنه، Firefox با چرخه‌ی بروزرسانی منظم و پشتیبانی بلندمدت انتخاب محکم‌تریه. zen رو هنوز می‌تونید نصب کنید.

neofetch جاش رو به fastfetch داد. neofetch سال‌هاست که نگهداری نمیشه. fastfetch سریع‌تره، فعالانه توسعه داده میشه، و ما یه تم سفارشی ParchLinux روش زدیم که وقتی ترمینال باز می‌کنید، به جای یه خروجی عادی، چیزی می‌بینید که مشخصه برای پارچ ساخته شده.

از ۴ boot mode به ۲ رفتیم. قبلاً ۴ گزینه‌ی بوت داشتیم که هم گیج‌کننده بود هم لازم نبود. الان فقط BIOS و UEFI داریم. اگه سیستم مدرنیه، UEFI. اگه قدیمیه، BIOS. همین.

ورود دومرحله‌ای

یکی از مهم‌ترین خبرهایی که اخیراً اعلام شد اینه که به زودی امکان فعال‌سازی ورود دومرحله‌ای مبتنی بر TOTP به پارچ اضافه میشه.

TOTP مخفف Time-based One-Time Password‌ه. همون کدی که اپ‌هایی مثل Aegis یا Google Authenticator بهتون میدن و هر سی ثانیه عوض میشه. جریان کارش اینه: یه بار کد QR رو با اپ احراز هویت اسکن می‌کنید. از اون به بعد، برای ورود به سیستم علاوه بر رمز عبور، باید اون کد شش رقمی که هر سی ثانیه عوض میشه رو هم وارد کنید.

این یعنی حتی اگه رمز عبور سیستمتون به هر دلیلی لو بره، بدون دسترسی به گوشی یا دستگاهی که اپ authenticator روشه، ورود ممکن نیست. برای کسایی که سیستم‌هاشون در معرض دسترسی غیرمجاز هستن یا با داده‌های حساس کار می‌کنن، این یه لایه‌ی حفاظتی جدی‌ه.

جزئیات فنی پیاده‌سازی رو توی بیلدهای بعدی کامل‌تر توضیح می‌دم.

آمارهای کلی

اگه تمام این تغییرات رو به عدد ترجمه کنیم، تصویر جالبیه. تعداد بسته‌ها از ۲۵۳ به ۲۰۴ رسید، ۱۹ درصد کمتر. تکراری‌های لیست بسته‌ها از بیشتر از ۱۴ مورد به صفر رسید. فایل‌های سفارشی airootfs از ۱۵۸ به ۱۸۸ رفت که نشون‌دهنده‌ی سفارشی‌سازی بیشتره. اسکریپت build از ۵۹ خط به ۱۹۰ خط رسید. کمتر بسته، ولی هر بسته‌ی حاضر دلیل درستی داره که اونجاست.

چیزی که بعداً میاد

اینا کارهاییه که یا در دست اجراست یا باید انجام بشه.

نصب‌کننده: Calamares هنوز اون‌طور که باید نیست. رابطش برای یه توزیع فارسی باید بهتر باشه. کار روی بومی‌سازی و ساده‌سازی مسیر نصب باید جدی‌تر بشه. هدف اینه که یه کاربر که اولین بار لینوکس نصب می‌کنه بتونه بدون سردرگمی نصب رو تموم کنه.

هویت بصری: الان BreezeDark داریم با یه wallpaper و یه fastfetch theme. این کافی نیست. پارچ باید یه هویت بصری خودش داشته باشه که وقتی کسی یه screenshot می‌بینه بفهمه پارچه. کار روی یه icon theme، یه color scheme اختصاصی، و یه wallpaper که داستان داره باید شروع بشه.

مستندسازی ابزارهای live: یه سری اسکریپت و ابزار توی ISO هستن که هیچ جایی document نشدن. کاربر نمی‌دونه وجود دارن. این باید درست بشه.

بهینه‌سازی بیشتر بسته‌ها: ۲۰۴ بسته هنوز جا برای کمتر شدن داره. هدف رسیدن به یه پایه‌ی تمیزه که هر چیزی که هست دلیل داره اونجاست.

پیاده‌سازی کامل TOTP: الان اعلام شده ولی هنوز مستندسازی و تست کامل نشده. باید یه راهنمای واضح برای فعال‌سازی باشه که کاربر گیج نشه.

بیلد خودکار: الان زمان بیلد لاگ میشه ولی سیستم CI هنوز کامل خودکار نیست. بیلدهایی که روی هر تغییر اجرا بشن و نتیجه رو مقایسه کنن هدف بعدیه.

یکپارچگی تم در کل سیستم: GTK3، GTK4، Qt5، Qt6 همه باید یه تم هماهنگ داشته باشن. الان یه کم ناهماهنگه و بعضی جاها تم تاریک درست اعمال نمیشه.

پشتیبانی بهتر از چاپگرها: چاپ روی لینوکس همیشه یه تجربه‌ی آزمایشیه. می‌خوایم CUPS رو با رابطی ساده‌تر و درایورهای رایج‌تر به صورت پیش‌فرض داشته باشیم.