اجرای باینری‌های لینوکس در FreeBSD


FreeBSD قادر است فایل های باینری دیگر سیستم‌عامل‌های شبه‌یونیکس مثل لینوکس را اجرا کند. بیشتر شرکت‌ها و توسعه‌دهندگان برنامه‌های خود را فقط برای Linux ارائه می‌دهند و به هر دلیلی از ارائه یک نسخه اختصاصی از برنامه مورد نظر برای سیستم‌عامل FreeBSD خودداری می کنند. اما شما با استفاده از این قابلیت FreeBSD، می توانید حدوداً ۹۰% برنامه‌های لینوکس را بدون نیاز به هیچ گونه تغییری در FreeBSD اجرا کنید. برنامه‌هایی مثل StarOffice، نسخه‌های لینوکسی Netscape ,Adobe Acrobat ,Real Player ,VMware ,Oracle ,WordPerfect ,Doom ,Quake و … به راحتی بر روی FreeBSD اجرا می شوند. این قابلیت به صورت پیش فرض غیر فعال است. می توانید با بارگذاری یک KLD در هسته که linux نام دارد این قابلیت را فعال کنید:

# kldload linux

اگر می خواهید این قابلیت همیشه فعال باشد خط زیر را به فایل /etc/rc.conf اضافه کنید:

linux_enable="YES"

از دستور kldstat می توانید از بارگذاری صحیح این KLD در هسته اطمینان حاصل کنید:

    % kldstat
   Id Refs Address    Size     Name
    ۱    ۲ ۰xc0100000 16bdb8   kernel
    ۷    ۱ ۰xc24db000 d000     linux.ko

اگر به هر دلیلی نمی خواهید یا نمی توانید این KLD را در هسته بارگذاری کنید، می توانید این قابلیت را به صورت ایستا در هسته خود فعال کنید تا همیشه فعال باشد. برای این کار باید خط زیر را به فایل پیکربندی هسته خود اضافه کرده و آن را مجدداً کامپایل کنید:

options COMPAT_LINUX

در مرحله بعد باید کتابخانه‌های مورد نیاز برای اجرای باینری‌های لینوکس را نصب کنید. این کتابخانه‌ها را هم می توانید به صورت دستی و هم از روی ports collection نصب کنید. برای نصب از روی ports collection به مسیر زیر بروید:

# cd /usr/ports/emulators/linux_base-f10

و دستور زیر را اجرا کنید:

# make install distclean

اگر از نسخه ۸٫۰ یا قدیمی تر استفاده می کنید، باید emulators/linux_base-fc4 را به جای emulators/linux_base-f10 نصب کنید. حال باید FreeBSD شما بتواند باینری‌های لینوکس را اجرا کند.

محتویات

  • ۱ نصب کتابخانه‌های بیشتر
  • ۲ نصب باینریهای نوع ELF
  • ۳ نصب بسته های RPM
  • ۴ تنظیم DNS

نصب کتابخانه‌های بیشتر:

اگر این کتابخانه‌ها را نصب کرده‌اید و برنامه شما باز هم به کتابخانه‌های بیشتری احتیاج داشته باشد چه؟ اصلاً چگونه بفهمیم که برنامه مورد نظر ما به چه کتابخانه‌هایی احتیاج دارد؟ فرض می کنیم که باینری‌های Doom را از طریق FTP دریافت کرده و آن‌ها را بر روی یک سیستم لینوکس نصب کرده‌ایم. در این صورت می توانیم با دستور ldd linuxdoom کتابخانه‌های مورد نیاز آن را پیدا کنیم:

   % ldd linuxdoom
   libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
   libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
   libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

به طور کلی از دستور ldd می توان برای دیدن کتابخانه‌های مورد نیاز برای هر باینری دلخواهی استفاده کرد:

$ ldd /bin/ls
  linux-gate.so.1 =>  (0x00f1a000)
  libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00f80000)
  librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00b92000)
  libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0x00dc0000)
  libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00805000)
  libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00bef000)
  /lib/ld-linux.so.2 (0x00666000)
  libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x0060d000)
  libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0x00180000)

اگر دستور ldd در سیستم شما وجود نداشته و پیغام ldd: command not found را دریافت می کنید، باید بسته binutils را در توزیع لینوکس خود نصب کنید. بعد از پیدا کردن کتابخانه‌ها، باید آنها را در سیستم FreeBSD خود و در مسیر زیر کپی کنید:

/compat/linux

نصب باینری های نوع ELF:

باینری‌های نوع ELF بعضی اوقات احتیاج به یک گام اضافه به نام “branding” دارند. ممکن است در هنگام اجرای این نوع باینری ها پیغام زیر را دریافت کنید:

% ./my-linux-elf-binary
ELF binary type not known
Abort

برای اینکه به کرنل FreeBSD کمک کرده باشید تا فرق بین باینری‌های نوع ELF مربوط به خود و باینری‌های لینوکس را تشخیص دهد، می توانید از دستور brandelf به صورت زیر استفاده کنید:

% brandelf -t Linux my-linux-elf-binary

نصب بسته های RPM:

FreeBSD مدیرِ بسته مختص به خود را داشته و از بسته های rpm پشتیبانی نمی کند. با این حال اگر قصد دارید تا یک بسته rpm را نصب کنید می توانید به این صورت عمل کنید:

# cd /compat/linux
# rpm2cpio -q < /path/to/l‌inux.archive.rpm | cpio -id

تنظیم DNS

اگر DNS کار نمی کند و خطای زیر را دریافت می کنید:

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

باید فایل /compat/linux/etc/host.conf را به صورت زیر پیکربندی کنید:

order hosts, bind
multi on