نظام لينكس الفرعي للينكس 28/04/2022

distrobox توفر إمكانية استخدام أنظمة لينكس أخرى من داخل لينكس، بدون الحاجة لتشغيلها كأنظمة وهمية وما يتبعه من استهلاك لموارد الجهاز.

أعلم غرابة العنوان، وهذا آخر ما كنت أتمناه لتدوينتي الأولى فعليا!!

قبل أن تبدأ ستستفيد من هذه التدوينة في حال كنت من مستخدمي أنظمة جنو/لينكس ومستخدم لسطر الأوامر.

يمكن تعريف windows subsystem for linux (WSL) على أنه طبقة توافقية تسمح بتشغيل برامج أنظمة جنو/لينكس على نظام ويندوز. وفي المقابل نحتاج مشروع مشابه للينكس، ليس لتشغيل برامج ويندوز على لينكس، ولكن لتشغيل برامج لينكس من توزيعة على توزيعة أخرى، أو إنشاء نظام لينكس معزول داخل نظامك واستخدامه دون التأثير على النظام الأساسي من خلال مشروع distrobox.

أهم ميزة أتى بها distrobox هي التوافقية بين النظام الضيف والنظام المضيف، فمجلد HOME المستتخدم مشترك بين النظامين، وكذلك يمكن من خلاله تثبيت وتشغيل برامج الواجهات الرسومية، بل واستخدامها من النظام الأساسي مباشرة.

التثبيت

يجب أن تمتلك docker أو podman قبل أن تبدأ.

sudo apt install distrobox
# أو
sudo dnf install distrobox

إضافة أنظمة جديدة

distrobox create --name system-name --image container:tag
# أو 
distrobox create --name system-name --image container:tag --home /path/to/directory

يستخدم distrobox حاويات دوكر، وعليه يمكنك اختيار نظام التشغيل الذي تريده من dockerhub، أو عرض الأنظمة المتوافقة من خلال distrobox create -C وسيسرد قائمة بجميع الأنظمة الممكن تثبيتها.

docker hub

على سبيل المثال الأمر التالي لتحميل النسخة المتدحرجة من debian

distrobox create --name debianbox-testing --image debian:testing

وأخيرا يمكن سرد الأنظمة الموجودة من خلال الأمر التالي:

distrobox list

شخصيا أفضل تثبيت كل نظام مع مجلد home مستقل حتى لا تختلط أي من ملفات النظامين (يظل بالإمكان الوصول لنظام الملفات الأساسي)، لذلك بداية انشئ المجلد التالي:

mkdir -p ~/.var/box

الآن سنثبت النسخة السابقة من ديبيان بالأمر:

distrobox create --name developer --image debian:testing --home ~/.var/box/dev

سيُنشئ المجلد dev ليحتوي ملفات home للنظام الجديد.

التعامل مع الأنظمة

للتبديل إلى طرفية النظام الجديد:

distrobox enter debianbox-testing

على سبيل المثال هنا ثبت rstudio بداخل النظام الضيف:

sudo apt install r-base 
sudo apt install ./rstudio-2022.02.2-485-amd64.deb
rstudio

rstudio in distrobox

لتنفيذ أمر في النظام الضيف دون الدخول إليه:

distrobox enter debianbox-testing -- htop

ولتنفيذ أمر من النظام الأساسي في النظام الضيف:

// من حاوية debian:testing 
ddistrobox-host-exec flatpak run org.mozilla.firefox

إيقاف وحذف النظام الضيف

ﻹيقاف النظام الضيف أو حذفه:

distrobox stop debianbox-testing
distro rm debianbox-testing

استنساخ النظام الضيف

يمكن استنساخ نظام من آخر بالصيغة الآتية:

distrobox create --name debianclone --clone debianbox-testing

تصدير برمجيات الضيف للمضيف

أكثر جزء ممتع في الموضوع بالكامل هو إمكانية استخدام برمجيات الضيف من داخل المضيف، لكن قبل الدخول في التفاصيل يجب أن تدرك وجود ثلاثة أنواع للبرامج:

  1. تطبيقات الواجهات الرسومية
  2. خدمات تعمل في الخلفية استجابة لحدث معين، كـapache و nginx
  3. أدوات سطر الأوامر، كـ ffmpeg و imagemagic

يمكن تصدير البرامج والخدمات بالطريقة التالية:

distrobox-export --app rstudio
distrobox-export --service nginx
distrobox-export --bin /usr/bin/ffmpeg --export-path ~/.local/bin

ستجد بعدها البرامج في نظامك بمجرد البحث عنها

rstudio ي النظام المضيف

لاحظ أن تصدير أدوات سطر الأوامر يحتاج لتحديد أحد مجلدات النظام لتصدير الأمر إليه.

تمرير معاملات إضافية

قد ترغب بتشغيل البرنامج بخيارات محددة، مثلا البرامج المبنية باستخدام الكترون كـ atom و vs-code قد تحتاج لتمرير المعامل --foreground. لتمرير معاملات إضافية إلى الأمر استخدم --extra-flags

distrobox-export --app atom --extra-flags "--foreground"
distrobox-export --bin /usr/bin/snort --export-path ~/.local/bin --extra-flags "-A console"

تشغيل البرامج المصدرة بصلاحيات الروت

يمكن تنفيذ هذا بإضافة --sudo نهاية أمر التصدير فقط

distrobox-export ... --sudo

الغاء البرامج المصدرة

في حال قررت عدم حاجتك لبرنامج في النظام الضيف، ورغبت بإزالة الربط يمكن استخدام --delete

distrobox-export ... --delete

استخدامات متقدمة

كل ما سبق أكثر من كافي للعمل مع جهازك، توجد بعض القيود على الأنظمة المنشئة بـ distrobox عكس الأنظمة المنشئة باستخدام المحاكيات كـ virtualbox سأتحدث عن هذه القيود وطرق معالجتها.

الوصول لأقراص النظام

رغم الشفافية الكبيرة بين النظام الضيف والمضيف في distrobox سهولة التواصل بين الاثنين، إلا أن النظام الضيف قادر فقط على الوصول إلى ملفات home للنظام المضيف فقط، ولتوصيل بقية الأقراص بعد معرفة مساراتها (يمكن الاطلاع على مسار القرص بالأمر lsblk أو من خلال مدير الأقراص).

# عرض الأقراص
lsblk
# توصيل قرص
distrobox create --name wine --image ubuntu:bionic --home ~/.var/box/wine --volume /mnt/0e2ec13d-dd7c-4501-916f-ab6711c4648d

الحصول على صلاحيات الجذر

المستخدم root في النظام الضيف ليس هو نفسه root المضيف، ولكنه يملك صلاحيات مشابهة، لإنشاء حاوية بصلاحيات root للمضيف:

# إنشاء النظام
distrobox create --name sys --image alpine --root
# الدخول عليه
distrobox enter sys --root

إضافة init system للنظام

بعض البرمجيات تحتاج لـ init system (البرمجية المسؤولة عن تشغيل الخدمات والعلميات عند إقلاع النظام وإدارتها)، مثل mysq والذي يظهر رسالة خطأ متعلقة بـ systemd عند تثبيته.

لاحظ إن بعض حاويات الأنظمة تدعم بشكل افتراضي مثل المسرودة أدناه، وغيرها تحتاج لتثبيت systemd، لذلك فتفعيل init system للنظام يعتمد على الحاوية.

# للحاويات المدعومة افتراضيا
distrobox create --name test --image docker.io/almalinux/8-init --init
# للحاويات التي لا تدعم
distrobox create --name test --image debian:unstable --init --additional-packages "systemd"

حفظ الأنظمة وتحميلها من ملف

قد ترغب في نقل أنظمتك إلى صديق، أو حتى حفظ نسخة احتياطية، لا يوفر distrobox دعم مباشر لكن يمكن تنفيذها من خلال podman

# بناء صور من الأنظمة، يٌنفذ لكل نظام على حدة
podman container commit -p your_first_distrobox_name first_copy_name
podman container commit -p your_second_distrobox_name second_copy_name

# حفظ صورة مبنية أو أكثر إلى ملق
podman save first_copy_name:latest second_copy_name:latest other_copies:latest -o filename.tar

بعد حفظ الصور الى الملف المختار قم بنقله للجهاز الجديد، استورده للنظام ثم انشئ أنظمة distrobox من الصور المستوردة

# استيراد الصور المحفوظة في الملف إلى podman
podman load < filename.tar

# اطلع الان على الصور المبنية
podman images
# localhost/first_copy_name:latest
# localhost/second_copy_name:latest

# انشئ أنظمتك من الصور السابقة
distrobox create --name new_system_name --image first_copy_name:latest --home /path/to/image/home

مواضيع إضافية

خاتمة

أخيرا وجود distrobox مهم كأداة للمطورين أسهل من استخدام podman أو docker مباشرة.

وكذلك للمستخدمين العاديين حيث لم تصل البرامج المحزمة بـ flatpak إلى مرحلة النضج الكامل.