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

البته راه های دیگه ای هم هست..مثل ساخت سیستمی که شبیه سازی رو انجام میده..بدون واسطه البته.

مثلا شما واسه نصب اندروید رو سیستم کامپیوترتون دو تا راه پیش رو دارید:

۱-نصب از طریق ماشین مجازی ساز(vmware,virtualBox)

2-نصب از طریق شبیه سازها(blueStack,genyMotion)

اما آیا بقیه سیستم عامل ها و توزیع های لینوکسی هم این دو شیوه رو برای کاربر مهیا میکنن؟

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

بذارید تعاریف مربوطه رو از خود سایت junest بیاریم تا منظور سازندگان به خوبی رسونده بشه:

 Jailed User NEST) JuNest) یا آشیانه محبوس کاربر،توزیع سبکی مبتنی بر آرچ است که یه محیط گنو/لینوکسی ایزوله رو در اختیارتون میذاره .این توزیع بر روی هر سیستم عاملی که گنو/لینوکس رو میزبانی کنه قابل استفاده است و برای نصب بسته های نرم افزاری،نیازی به سطح دسترسی روت نیست!

از مطالب بالا اینجوری استنباط میشه که:

۱-این توزیع روی هر توزیع دیگه ای از توزیع های لینوکس، قابل نصب شدن هست.

۲-محیطی که در اختیارتون میذاره اصطلاحا ایزوله ست..یعنی دخل و تصرف در اون مشکلی واسه سیستم اصلی تون به وجود نمیاره.(توزیع هاست مصون از تغییرات توزیع junest است.)

۳-برای نصب نرم افزار داخل این محیط ایزوله،نیازی به سطح دسترسی روت یا کاربر ریشه ندارید!

۴-میتونید از پکمن یا یایورت برای دسترسی به خیل عظیم بسته هایی که تو مخازن آرچ لینوکس هستن استفاده کنید.

۵-دسترسی به بسته های مخازنی که به هر دلیلی دارای محدودیت هایی می باشند.(از جمله سنت.او.اس و رد.هت)

۶-برای معماری های x86_64, x86 and ARM موجوده.هر چند می تونید ایمیج مختص خودتون رو هم داشته باشید(!)

۷-بر روی معماری متفاوتی نسبت به سیستم هاست به کمک فناوری QEMU میتونه اجرا بشه.

۸-تمام عشاق کباده کش لینوکس میتونن نسخه موردعلاقه خودشونو در "هر جایی" داشته باشن!

۹-از فلسفه آرچ تبعیت میکنه.(اصل KISS)

هیجان انگیزه مگه نه ؟! دی:

پس بریم که امتحانش کنیم.

شروعی تند و تیز

سه روش برای اجرای JuNest وجود داره:

  • به عنوان کاربر معمولی-اجازه برای اجرای دستورات پایه با :junest
  • به عنوان fakeroot-اجازه برای حذف/نصب بسته ها با :junest -f
  • به عنوان root:اجازه برای داشتن تمامی دسترسی های سطح روت داخل محیط JuNest (برای اجرای این کار بایستی کاربر روت باشید.)با:junest -r

اگر فایل ایمیج JuNest هنوز دانلود نشده است،اسکریپت،اون فایل رو براتون دانلود میکنه و در دایرکتوری پیش فرض با آدرس  ~/.junest قرار میده.

برای تغییر دایرکتوری پیش فرض کافیه فقط مقدار متغیر محیطی JUNEST_HOME رو تغییر بدید.

اگر به تازگی به جمع خانواده آرچی ها پیوسته اید و هنوز آشنایی کاملی با مدیر بسته pacman ندارید به صفحه pacman rosetta  سر بزنید.

نصب

JuNest برروی تمامی  توزیع های گنو/لینوکسی با حداقل نسخه کرنل 2.6.0 و معماری های 32/64 بیتی و ARM کار خواهد کرد.(تستی بر روی نسخه های قدیم تر کرنل هنوز صورت نگرفته است.)

روش اول(توصیه شده)

فقط کافی ست مخزن JuNest رو در جایی کلون کنید.(برای مثال در دایرکتوری : ~/junest)

git clone git://github.com/fsquillace/junest ~/junest
export PATH=~/junest/bin:$PATH

نصب بوسیله AUR(مختص کاربران آرچ لینوکس)

اگر از سیستم آرچ لینوکسی استفاده میکنید می توانید به عنوان راه حال جایگزین JuNest رو به شیوه زیر از مخازن دانلود و نصب کنید:

yaourt -S junest-git
export PATH=/opt/junest/bin:$PATH

روش دوم

به عنوان روشی جایگزین می تونید سورس JuNest رو به صورت مستقیم دانلود کنید و در دایرکتوری پیش فرض(~/.junest)قرار بدید:

ARCH=<one of "x86_64", "x86", "arm">
mkdir ~/.junest
curl https://dl.dropboxusercontent.com/u/42449030/junest/junest-${ARCH}.tar.gz | tar -xz -C ~/.junest
export PATH=~/.junest/opt/junest/bin:$PATH

وابستگی ها

برای اینکه JuNest بتونه بر روی اکثر توزیع ها به خوبی کار کنه از وابستگی های کمی استفاده میکنه.پیش نیاز های زیر در سیستم هاست بایستی نصب شده باشند:

  • bash
  • chown (for root access only)
  • ln
  • mkdir
  • rm
  • tar
  • uname
  • wget or curl

حداقل نسخه کرنل موردنیاز هم همان طور که پیشتر توضیح داده شد نسخه 2.6.0 به بالاتر است.

موارد استفاده پیشرفته تر

ساخت Image

شما می تونید با دستور زیر یه نسخه کاملا کاستومایز شده دستی از 0 برای خودتون بسازید:(!)

junest -b [-n]

اسکریپت،دایرکتوری ای رو که حاوی تمامی فایل های ضروری (از جمله:pacman ، yaourt ، proot) برای اجرای صحیح JuNest هست میسازه.

آپشن -n  تست های اعتبار سنجی نهایی رو در صورت عدم نیاز رد میکنه.به خاطر داشته باشید که اسکریپت برای ساخت فایل ایمیج بایستی در یک سیستم آرچ لینوکسی که بسته های  arch-install-scripts ، package-query ، git ، the base-devel بر رویش نصب شده است،اجرا گردد.

برای تغییر دایرکتوری ساخت،از UNEST_TEMPDIR استفاده کنید.(به طور پیش فرض /tmp است.)

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

junest -i junest-x86_64.tar.gz

برای کسب اطلاعات بیشتر به junest-builder مراجعه کنید.این لینک حاوی اسکریپت و سرویس systemd مورد استفاده برای ساخت خودکار فایل ایمیج JuNest می باشد.

صفحات ویکی مربوطه:

How to build a JuNest image using QEMU

اجرای JuNest با معماری ای متفاوت از QEMU:

دستور زیر فایل ایمیج(با معماری ARM البته!) JuNest رو دانلود و QEMNU رو در حالتی که سیستم میزبان یکی از معماری های x86-64 یا x86 رو داشته باشه اجرا میکنه:

$> JUNEST_HOME=~/.junest-arm junest -a arm -- uname -m
armv7l

اگه ابونتو،فدورا،مینت،سوزه یا هر توزیع دیگه ای دارین و دلتون میخواد لذت یه توزیع دلچسب غلتان رو داشته باشید میتونید junest رو تست کنید..بدون هیچ دردسری!

چسباندن دایرکتوری ها

برای چسباندن دایرکتوری میزبان به سیستم مهمان از آرگومان های proot استفاده کنید.بدین شکل:

junest -p "-b /mnt/mydata:/home/user/mydata"

آپشن های proot رو با دستور زیر چک کنید:

junest -p "--help"

یکپارچکی با Systemd

اگرچه جانست بعنوان یک ظرف کامل پیاده سازی نشده اما مجازی سازی فرآیندها به لطف systemd container میسر هست.JuNest اجازه اجرای سرویس ها را درون خودش میده طوری که سیستم میزبان میتونه اونها رو از طریق شبکه ردگیری و مشاهده کنه.اشکالات این کار اینه که سیستم میزبان باید از systemd بعنوان مدیر سرویس هاش استفاده کنه.و JuNest تنها با سطح دسترسی روت قابل اجرا شدن باشه.

برای بوت ظرف JuNest:

sudo systemd-nspawn -bD ~/.junest

صفحات ویکی مرتبط:

Internal ها:

دو زندان chroot اصلی در junest مورد استفاده قرار میگیرند.اصلی ترینش proot هست که به کاربران غیر ممتاز اجازه اجرای برنامه ها را داخل یک محیط ایزوله می دهد و برنامه بعدی jchroot است.نسخه پرتابل و کوچک شده arch-chroot که نوعی chroot پیشرفته محسوب می شود برای کاربرانی که حق دسترسی های لازمه را دارند اجازه می دهد که دایرکتوری های اصلی (به عنوان مثال: /proc, /sys, /dev and /run) را قبل از اجرای هرگونه برنامه ای داخل محیط سندباکس یا ایزوله، مانت کنند.

بازگشت اتوماتیک به chroot کلاسیک:

اگر برنامه jchroot به هر دلیلی در سیستم هاست دچار مشکل گردد.(به عنوان مثال نتواند یکی از دایرکتوری ها را مانت کند.)junest به صورت اتوماتیک تلاش میکند که به chroot کلاسیک باز گردد.

بازگشت اتوماتیک به فایل های اجرایی او.اس میزبان:

JuNest ابتدا به ساکن تلاش میکند تا فایل های اجرایی موجود در او.اس میزبان را که در جاهای مختلفی قرار دارند،اجرا کند.(/usr/bin, /bin, /usr/sbin and /sbin)اگر این عملیات با شکست مواجه شود فایل های اجرایی مشابه را در صورت وجود در ایمیج JuNest اجرا میکند.

ساخت خودکار ایمیج های JuNest:

ایمیج های JuNset هر هفته ساخته می شوند.بنابراین همواره به روزترین نسخه های نرم افزاری را در اختیار خواهید داشت.

باینری های استاتیک QEMU:

فایل های باینری استاتیک QEMU،در ایمیج JuNset موجود هستند.این فایل ها،امکان اجرای JuNest را بر روی معماری های مختلف سیستم های میزبان به شما می دهد.همگی در مسیر /opt/qemu وجود دارند.

عیب یابی:

از مخازن AUR نمی توان استفاده کرد

سوال:چرا موقع نصب یک بسته از Aur با اروری شبیه زیر مواجه می شوم؟

Cannot find the gzip binary required for compressing man and info pages.

جواب:JuNest به همراه تعداد زیادی بسته پایه نصب می شود.به جای نصب بسته ها بوسیله Yaourt،گروه بسته های base-devel را که حاوی تمامی بسته های ضروری برای کامپایل سورس کدها (هم چون:gcc, make, patch) می باشند،نصب کنید.

pacman -S base-devel

کرنل بسیار قدیمی است

سوال:چرا با ارور "FATAL: kernel too old" روبرو می شوم؟

جواب:به خاطر اینکه بسته های از پیش کامپایل شده داخل یک کرنل قدیمی نمی توانند به درستی اجرا گردند.شاید نیاز باشد از سوییچ PRoot -k استفاده کنید اگر برنامه rootfs مهمان نیازمند نسخه جدیدی از کرنل باشد.

junest -p "-k 3.10"

برای چک کردن این مطلب که یک فایل اجرایی توانایی اجرا شدن در محیط JuNest را داراست (با نسخه کرنل او.اس میزبان هماهنگی دارد)کافی است از دستور fiile استفاده کنید.

file ~/.junest/usr/bin/bash
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=ec37e49e7188ff4030052783e61b859113e18ca6, stripped

از خروجی این دستور می توانید متوجه شوید حداقل نیازمندی های نسخه کرنل چیست.

مجوزهای SUID

سوال:چرا اجازه پینگ گرفتن ندارم؟

ping www.google.com
ping: icmp open socket: Operation not permitted

جواب:فرمان ping از مجوزهای suid استفاده میکند تا به فرمانی که از مجوزهای root بهره میگیرد اجازه اجرا شدن دهد.مود fakeroot توانایی اجرای دستوری با suid را ندارد.و شما برای این کار نیازدارید که از مجوزهای روت استفاده کنید.دستورات دیگری وجود دارند که مجوز suid دارند.برای دیدن لیستی از آنها:

find /usr/bin -perm +4000

کارکترها در محیط گرافیکی قابل رویت نیستند

سوال:چرا در برنامه ای که نصب کرده ام کاراکتری مشاهده نمیکنم؟

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

pacman -S gnu-free-fonts

تفاوت بین فایل سیستم و مالکیت بسته

سوال:چرا موقع نصب یک بسته با مجوز روت،هشدار دریافت میکنم؟

pacman -S systat
...
warning: directory ownership differs on /usr/
filesystem: 1000:100  package: 0:0
...

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

هیچ سروری برای مخزن پیکره بندی نشده است

سوال:چرا نمی توانم بسته ها را نصب کنم؟

pacman -S lsof
Packages (1): lsof-4.88-2

Total Download Size:    0.09 MiB
Total Installed Size:   0.21 MiB

error: no servers configured for repository: core
error: no servers configured for repository: community
error: failed to commit transaction (no servers configured for repository)
Errors occurred, no packages were upgraded.

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

# Uncomment the repository line according to your location
nano /etc/pacman.d/mirrorlist
pacman -Syy

مستندات بیشتر

آموزش های بیشتر را از JuNest wiki page دنبال کنید.

تمامی مطالب برگردان فارسی از اینجا بود.