FreeBSD برای کاربران لینوکس


در این قسمت به بررسی تفاوت‌های موجود بین FreeBSD و لینوکس می‌پردازیم.

محتویات

پوسته

افرادی که از لینوکس به FreeBSD مهاجرت می‌کنند، معمولاً از اینکه Bash پوسته پیش فرض FreeBSD نیست متعجب می‌شوند. در حقیقت Bash حتی در نصبِ پیش فرض هم وجود ندارد. در عوض، FreeBSD از پوسته ای به نام tcsh به عنوان پوسته پیش فرض استفاده می‌کند. هرچند شما می‌توانید Bash و یا دیگر پوسته‌های مورد علاقه خود را از طریق پورت های FreeBSD نصب کنید.

اگر پوسته دیگری را نصب کرده‌اید، میتوانید با استفاده از دستور chsh پوسته پیشفرض کاربران را تغییر داده و پوسته مورد علاقه خود را به عنوان پوسته پیشفرض انتخاب کنید. با این حال توصیه می‌شود که پوسته پیشفرض کاربر root را تغییر ندهید. به این دلیل که پوسته‌هایی که در نصب پیش فرض وجود ندارند، معمولاً در مسیرهای /usr/local/bin یا /usr/bin نصب می‌شوند. بنابراین در صورت بروز یک مشکل ممکن است این فایل‌سیستم‌ها مونت نشوند و دسترسی به آن‌ها ممکن نباشد. در این صورت، کاربر root به پوسته پیش فرض خودش دسترسی نخواهد داشت و قادر به وارد شدن به سیستم نخواهد بود. اگر واقعاً می‌خواهید پوسته پیش فرض کاربر root را تغییر دهید، یک کاربر root دوم به نام toor برای شما در نظر گرفته شده است. کاربر toor دقیقاً همان امتیازهای کاربر root را دارد و حتی UID آن نیز، است. بنابراین شما با خیال راحت می‌توانید پوسته پیش فرض کاربر toor را تغییر داده و بدون اینکه نگران چیزی باشید از این کاربر برای انجام کارهای مدیریتی سیستم استفاده کنید. به صورت پیش فرض نمی‌توان به عنوان کاربر toor به سیستم وارد شد؛ چون هیچ کلمه عبوری برای آن تعیین نشده است. بنابراین در صورتی که مایل به استفاده از این کاربر هستید، ابتدا باید با استفاده از کاربر root یک کلمه عبور دلخواه برای toor تعیین کنید.

نصب نرم‌افزارها

علاوه بر روش سنتی نصب نرم‌افزارها در UNIX (دانلود کدهای منبع، استخراج، ویرایش کدهای منبع و کامپایل)، FreeBSD دو روش برای نصب نرم‌افزارها به شما پیشنهاد می‌کند: بسته های باینری و پورتهای FreeBSD. لیست کاملی از بسته‌ها و پورت‌های موجود را می‌توانید در اینجا مشاهده کنید.

بسته‌ها

بسته‌ها برنامه‌های از قبل کامپایل شده هستند. معادل بسته‌ها در سیستم‌عامل‌های مبتنی بر Debian GNU/Linux فایل‌های .deb و در سیستم‌عامل‌های مبتنی بر Red Hat فایل‌های .rpm می‌باشد. بسته‌ها با استفاده از دستور pkg_add نصب می‌شوند. به عنوان مثال دستور زیر وب سرور آپاچی را نصب خواهد کرد.

# pkg_add /tmp/apache-2.2.6_2.tbz

استفاده از گزینه ‎-r‎ باعث می‌شود تا pkg_add بسته مورد نظر به همراه تمام وابستگی‌های آن را به صورت خودکار دانلود کرده و سپس نصب کند.

# pkg_add -r apache22
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/Latest/apache22.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/expat-2.0.0_1.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/perl-5.8.8_1.tbz... Done.
[snip]
To run apache www server from startup, add apache22_enable="YES"
in your /etc/rc.conf. Extra options can be found in startup script.

پورت‌ها

دومین روش برای نصب نرم‌افزارها در FreeBSD استفاده از مجموعه پورت های FreeBSD است. در این روش برنامه‌ها ابتدا از کدهای منبع کامپایل شده و سپس نصب می‌شوند. بنابراین این روش از سرعت کمتری برخوردار است اما به شما این امکان را می‌دهد تا برنامه‌ها را سفارشی کنید. در هنگام نصب یک نرم‌افزار از طریق پورتها، سیستم کدهای منبع را دریافت کرده، وصله‌ها یا patch ها را بر روی آن اعمال می‌کند، سپس برنامه کامپایل شده و در آخر نصب می‌شود. (همین طور این کارها برای تمامی وابستگی‌ها نیز انجام می‌شود.)

مجموعه پورت های FreeBSD که گاهی اوقات درخت پورت ها هم خوانده می‌شود در مسیر /usr/ports قرار دارد. برای نصب یک برنامه از طریق پورت ها می‌توان به صورت زیر عمل کرد:

# cd /usr/ports/www/apache22
# make install clean

لطفا برای کسب اطلاعات بیشتر، نصب برنامه‌ها از طریق Ports Collection را ببینید.

سطوح اجرایی

در FreeBSD سطوح اجرایی و فایل /etc/inittab وجود ندارند. در عوض راه‌اندازی سیستم توسط ابزار rc کنترل می‌شود. اسکریپت /etc/rc با خواندن فایل‌های /etc/defaults/rc.conf و /etc/rc.conf تعیین می‌کند که چه سرویس هایی باید اجرا شوند. سپس این سرویس ها با استفاده از اسکریپت‌های آغازینی که در مسیرهای /etc/rc.d یا /usr/local/etc/rc.d قرار گرفته‌اند اجرا خواهند شد. این اسکریپت‌ها شبیه به اسکریپت‌های موجود در /etc/init.d در لینوکس هستند.

چرا اسکریپت‌های آغازین در دو مسیر متفاوت قرار دارند؟

اسکریپ‌هایی که در مسیر /etc/rc.d قرار دارند، بخشی از “پایه” سیستم هستند. (cron، sshd، syslog). اما اسکریپت هایی که در مسیر /usr/local/etc/rc.d قرار دارند، مربوط به برنامه‌های نصب شده توسط کاربر (مانند آپاچی، اسکوئید و …) هستند.

چه فرقی بین سیستم پایه و برنامه‌های نصب شده توسط کاربر وجود دارد؟

FreeBSD به عنوان یک سیستم‌عامل کامل توسعه داده می‌شود. به عبارت دیگر، هسته سیستم‌عامل، کتابخانه‌های سیستم و ابزارهای سطح کاربر مانند (ls، cat، cp و غیره) همگی با هم توسعه داده شده و انتشار می‌یابند. به همه این اجزا سیستم پایه گفته می‌شود. برنامه‌های نصب شده توسط کاربر برنامه‌هایی هستند که جزء سیستم پایه به حساب نمی‌آیند. برنامه‌هایی مانند Apache, X11, Mozilla Firefox از این قبیل هستند. این برنامه‌ها معمولاً از طریق پورت ها یا بسته‌های FreeBSD نصب می‌شوند. برای مجزا کردن این برنامه‌ها از سیستم پایه، آن‌ها در مسیر /usr/local نصب می‌شوند. بنابراین باینری‌های مربوط به این برنامه‌ها در مسیر /usr/local/bin و فایل‌های پیکربندی این برنامه‌ها در مسیر /usr/local/etc قرار دارد.

برای فعال کردن سرویس‌ها می‌توان خطی به صورت ‎ServiceName_enable=”YES”‎ را به فایل /etc/rc.conf اضافه کرد. تنظیمات پیش فرض سیستم در مسیر /etc/defaults/rc.conf قرار دارد که می توان از طریق فایل /etc/rc.conf این تنظیمات را بی اثر کرد. همیشه بعد از نصب برنامه‌ای جدید، مستندات آن برنامه را بررسی کرده تا با نحوه فعال کردن سرویس‌های مربوط به آن آشنا شوید.

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

# enable SSHD
sshd_enable="YES"
# enable Apache with SSL
apache22_enable="YES"
apache22_flags="-DSSL"

تنظیمات شبکه

لینوکس کارت‌های شبکه را به صورت ethX نام گذاری می‌کند. مثلاً اسامی eth1 به اولین کارت شبکه و eth2 به دومین کارت شبکه اطلاق می‌شود. اما FreeBSD از نام درایور کارت شبکه به همراه یک عدد برای نامگذاری کارت‌های شبکه استفاده می‌کند.

% ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
         options=b<RXCSUM,TXCSUM,VLAN_MTU>
        inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255
        ether 00:50:56:a7:70:b2
        media: Ethernet autoselect (1000baseTX <full-duplex>)
        status: active
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255
        ether 00:50:56:a7:03:2b
        media: Ethernet autoselect (1000baseTX <full-duplex>)
        status: active

تنظیمات IP

برای اختصاص دادن یک آدرس IP به یک کارت شبکه می‌توان از دستور ifconfig استفاده کرد. با این حال این تنظیمات موقت بوده و با راه‌اندازی مجدد سیستم از بین می‌روند. برای دائمی کردن این تنظیمات باید آن‌ها را در فایل /etc/rc.conf وارد کرد. در مثال زیر نحوه تنظیم hostname، آدرس IP  و default gateway نشان داده شده است:

hostname="server1.example.com"
ifconfig_em0="inet 10.10.10.100  netmask 255.255.255.0"
defaultrouter="10.10.10.1"

همین طور برای تنظیم با استفاده از یک DHCP Server می‌توان به صورت زیر عمل کرد:

hostname="server1.example.com"
ifconfig_em0="DHCP"

دیواره آتش

مشابه iptables در لینوکس، FreeBSD هم یک دیواره آتش سطح کرنل ارائه کرده است. عملاً سه دیواره آتش در FreeBSD وجود دارد:

IPFW
PF
IPF

 

۱. IPFW

IPFW یا IPFIREWALL دیواره آتشی است که توسط توسعه دهندگان FreeBSD توسعه داده شده و نگه داری می‌شود. IPFW می‌تواند با dummynet عجین شده و قابلیت Traffic Shaping و شبیه‌سازی انواع مختلف اتصالات شبکه را فراهم کند. یک مثال برای اجازه دادن به ترافیک SSH ورودی:

ipfw add allow tcp from any to me 22 in via $ext_if

۲. IPFILTER

IPFILTER دیواره آتشی است که توسط Darren Reed توسعه داده شده است. این فایروال مختص FreeBSD نبوده و به چند سیستم‌عامل مانند NetBSD ،OpenBSD ،Solaris و … پورت شده است.

یک مثال  برای اجازه دادن به ترافیک SSH ورودی:

pass in on $ext_if proto tcp from any to any port = 22

۳. PF

آخرین دیواره آتش PF نام دارد که توسط پروٓه OpenBSD توسعه داده می‌شود. PF به عنوان جایگزینی برای IPFILTER ساخته شد. به همین دلیل سینتکس PF شباهت زیادی به IPFILTER دارد. PF هم می‌ةواند با altq عجین شده تا قابلیت‌های QoS را فراهم کند.

یک مثال برای اجازه دادن به ترافیک SSH ورودی:

pass in on $ext_if inet proto tcp from any to ($ext_if) port 22

به روزرسانی FreeBSD

سه روش برای به روزرسانی FreeBSD وجود دارد: از طریق کدهای منبع، به روش باینری و از طریق دیسک‌های نصب.

به روزرسانی از کدهای منبع پیچیده‌ترین روش است اما انعطاف‌پذیری بسیار زیادی دارد. در این روش ابتدا باید کدهای منبع FreeBSD را از یک سرور Subversion دریافت کرده و سپس سیستم‌عامل را از روی این کدها کامپایل کنید.

بروزرسانی به روش باینری همانند استفاده از yum و apt-get در سیستم‌عامل لینوکس است. دستور freebsd-update آخرین به روزرسانی‌ها را دریافت کرده و سپس نصب می‌کند. در این روش می‌توان با استفاده از cron به روزرسانی سیستم را زمان‌بندی کرد.

اگر از cron برای به روزرسانی سیستم استفاده می‌کنید، لطفاً در فایل crontab خود از دستور freebsd-update cron استفاده کنید تا احتمال اینکه کامپیوترهای زیادی بخواهند به صورت هم زمان عمل به روزرسانی را انجام دهند کاهش یابد.

۰ ۳ * * * root /usr/sbin/freebsd-update cron

آخرین روش به روزرسانی، به روزرسانی از طریق دیسک‌های نصب است. کافی است سیستم خود را از روی دیسک نصب بوت کرده و گزینه update را انتخاب کنید.

Procfs

اگر کاربر لینوکس بودید، ممکن است برای فهمیدن اینکه آیا IP Forwarding فعال است یا نه فایل /proc/sys/net/ipv4/ip_forward را نگاه می‌کردید. در FreeBSD برای فهمیدن این مطلب و همین طور دیگر تنظیمات سیستم باید از دستور sysctl استفاده کنید. چون که procfs در نسخه های فعلی FreeBSD وجود ندارد. (هر چند دستور sysctl در لینوکس هم موجود است)

در مثال IP Forwarding، باید از دستور زیر برای تعیین کردن اینکه آیا IP Forwarding فعال است یا نه استفاده کنید:

% sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0

از گزینه ‎-a‎ می‌توان برای نمایش لیستی از تمام تنظیمات سیستم استفاده کرد:

% sysctl -a
kern.ostype: FreeBSD
kern.osrelease: 6.2-RELEASE-p9
kern.osrevision: 199506
kern.version: FreeBSD 6.2-RELEASE-p9 #0: Thu Nov 29 04:07:33 UTC 2007
    root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
kern.maxvnodes: 17517
kern.maxproc: 1988
kern.maxfiles: 3976
kern.argmax: 262144
kern.securelevel: -1
kern.hostname: server1
kern.hostid: 0
kern.clockrate: { hz = 1000, tick = 1000, profhz = 666, stathz = 133 }
kern.posix1version: 200112
...

به این نکته توجه داشته باشید که برخی از مقادیر و پارامترهای sysctl به صورت فقط خواندنی بوده و قابل تغییر نیستند.

در بعضی موارد احتیاج به procfs دارید. مثلاً در هنگام اجرای برنامه‌های قدیمی، برای استفاده از truss، برای ردیابی فراخون‌های سیستمی و اجرای باینری‌های لینوکس (هر چند مورد آخر از procfs مخصوص به خود با نام linprocfs استفاده می‌کند.)

برای مونت کردن procfs خط زیر را به فایل/etc/fstab اضافه کنید:

proc                /proc           procfs  rw,noauto       0       0
نکته:
گزینه noauto باعث می‌شود تا procfs در هنگام بوت سیستم به صورت خودکار مونت نشود.

دستورات رایج

دستور لینوکسمعادل FreeBSDکاربرد
yum install package / apt-get install package
pkg_add -r package
نصب یک نرم‌افزار از یک مخزن راه دور
rpm -ivh package / dpkg -i package
pkg_add -v package
نصب یک بسته به صورت محلی
rpm -qa / dpkg -l
pkg_info
نمایش تمام بسته‌ّای نصب شده
دستور لینوکسمعادل FreeBSDکاربرد
lspci
pciconf
لیست دستگاه‌های PCI
lsmod
kldstat
لیست ماژول‌های فعال در هسته
modprobe
kldload / kldunload
بارگذاری و باراندازی ماژول‌ها در هسته
strace
truss
ردیابی فراخوان‌های سیستمی

نکات پایانی

  • هسته هر دو سیستم‌عامل به صورت ماژولار طراحی شده است. اما دستوراتی که برای نمایش/اضافه/حذف ماژول‌ها استفاده می‌شود، متفاوت است. برای بارگذاری ماژول ها از kldload و برای حذف ماژول از kldunload و همین طور برای نمایش لیست ماژول های فعال در هسته از kldstat استفاده کنید.
  • برای اینکه بتوانید با استفاده از دستور su به عنوان کاربر root وارد سیستم شوید، باید عضو گروهی به نام wheel باشید. از آنجا که security/sudo به صورت پیش فرض نصب نیست و کاربر root هم به صورت پیش فرض مجاز به ورود از طریق ssh نیست، شما باید عضو این گروه باشید.
  • فایل سیستم‌های مورد استفاده این دو سیستم‌عامل هم متفاوت است. لینوکس از فایل‌سیستم‌های EXT3, EXT4 و … استفاده می‌کند اما FreeBSD از سیستم‌فایل UFS استفاده می‌کند.
  • در FreeBSD فایلی به نام /etc/mtab وجود ندارد. برای دیدن لیست فایل‌سیستم‌هایی که در حال حاضر مونت شده‌اند از mount و df استفاده کنید.
  • ftp در نصب پیش فرض وجود ندارد. در عوض از fetch استفاده کنید.