همانطور که قبلاً قول داده بودم و نیز یک شماره به عنوان local authentication در FreeBSD ارایه کردم، این مطلب نیز از سری مطالب پایهای در FreeBSD میباشد.
سیستم port به عنوان package management در FreeBSD مورد استفاده قرار میگیرد و اگر از قبل با آن آشنا نیستید بهتر است موارد زیر را بخوانید:
-
بر خلاف yum و apt که یک نرمافزار را به چند بسته میشکنند و اصطلاحاً به چنین package management هایی multipart package systems گفته میشود. اما port چنین نیست. هر کدام معایب و مزایایی دارند.
-
در port بسته از اول کامپایل میشود ولی در package management هایی چون apt و yum باینری بسته نصب میشود. (هر چند علاوه بر port شما میتوانید از گزینهای دیگر برای نصب برنامه در FreeBSD نیز استفاده نمایید که سرعت کار بالا رود.)
-
port دارای یک Directory Structure در /usr/ports/ میباشد که برنامهها را طبقهبندی کرده است و هر برنامه دارای یک Makefile میباشد. اینDirectory Structure باید به روز با سرور باشد.
-
فرض بر این است که خواننده با دستور make و کامپایل کردن آشناست.
-
FreeBSD را به عنوان یک سیستمعامل لخت میشناسند و حتی بعضی از فرمانهای اولیه که بر روی port ها کار میکنند را باید نصب کرد.
۱. گام اول به روز شدن Port Tree:
۱.۱ استفاده از portsnap
نیاز است قبل از هر کاری Port Tree یعنی همان دایرکتوری /usr/ports/ را با سرور به روز کنید. بدین منظور باید از دستور portsnap استفاده کرد.
نکته: portsnap جزو دستورهای base سیستم میباشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#portsnap fetch Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found. Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done. Fetching snapshot metadata... done. Updating from Tue Mar 10 01:05:13 CET 2015 to Mon Aug 17 16:54:37 CET 2015. Fetching 4 metadata patches... done. Applying metadata patches... done. Fetching 5 metadata files... done. Fetching 11153 patches. (9200/11318) 81.28% ......… #portsnap extract . . . . /usr/ports/x11/xwud/ /usr/ports/x11/xxkb/ /usr/ports/x11/xzoom/ /usr/ports/x11/yad/ /usr/ports/x11/yakuake-kde4/ /usr/ports/x11/yalias/ /usr/ports/x11/yeahconsole/ /usr/ports/x11/yelp/ /usr/ports/x11/zenity/ Building new INDEX files... done. |
۲.۱ استفاده از svn:
راه دیگری نیز برای به روز رسانی Port Tree وجود دارد که استفاده از Subversion به صورت زیر میباشد:
1 |
# svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports |
سناریو کمی با قبل فرق دارد، زیرا دستور svn جزو فرمانهای base نمیباشد و باید در ابتدا بسته subversion را به صورت زیر نصب نمایید:
1 |
# pkg install subversion |
سپس دو فرمان زیر را به کار برید:
1 2 |
# svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports # svn update /usr/ports |
نکته: برای بار اول باید به ریشه Port Tree رفته و یک index بسازید:
1 |
# cd /usr/ports/ ; make index |
همچنین میتوانید به جای فرمان بالا از make fetchindex استفاده نمایید.
۲. کار دستی با port ها:
در این قسمت قبل از هر چیز باید وارد ریشه Port Tree شویم:
1 |
# cd /usr/ports ; |
فرض بر این است که میخواهیم tcpdump را نصب نماییم. بدین منظور اینگونه رفتار میکنیم:
1 |
# make search key=tcpdump |
اما خروجی فرمان مذکور زیاد میشود و برای جلوگیری از این موضوع key را با name تعویض میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# make search name=tcpdump Port: p5-Net-TcpDumpLog-0.11_1 Path: /usr/ports/net/p5-Net-TcpDumpLog Info: Read tcpdump/libpcap network packet logs Maint: skreuzer@FreeBSD.org B-deps: perl5-5.20.2_6 R-deps: perl5-5.20.2_6 WWW: http://search.cpan.org/dist/Net-TcpDumpLog/ Port: tcpdump-4.7.4 Path: /usr/ports/net/tcpdump Info: Ubiquitous network traffic analysis tool Maint: garga@FreeBSD.org B-deps: gettext-runtime-0.19.5.1 gmake-4.1_2 indexinfo-0.2.3 libpcap-1.7.3 libsmi-0.4.8_1 R-deps: libpcap-1.7.3 libsmi-0.4.8_1 WWW: Port: tcpdump398-1.0 Path: /usr/ports/net/tcpdump398 Info: Ubiquitous network traffic analysis tool - FreeBSD 7 version for FreeBSD 8 Maint: edwin@mavetju.org B-deps: R-deps: WWW: |
باز برای کوچکتر شدن خروجی فرمان زیر را استفاده میکنیم:
1 2 3 4 |
# make search name=tcpdump |grep ^Path: Path: /usr/ports/net/p5-Net-TcpDumpLog Path: /usr/ports/net/tcpdump Path: /usr/ports/net/tcpdump398 |
درواقع فرمان فرقی نکرد، بلکه برای مسیرها یک grep نوشتیم تا فقط آنها را چاپ نماید. سپس وارد مسیر tcpdump میشویم تا آن را نصب نماییم:
1 |
# cd ./net/tcpdump |
در دایرکتوری هر port، چندین فایل وجود دارد که یکسری از آنها بعد از کامپایل port بوجود میآیند، در این قسمت به توضیح برخی از آنها میپردازیم:
Makefile: وقتی از دستور make استفاده میکنیم باید یا به صورت پیشفرض در دایرکتوری جاری چنین فایلی وجود داشته باشد و یا به دستور make چنین فایلی را معرفی کنیم. (به صورت پیشفرض FreeBSD از GNU make استفاده مینماید.)
-
distinfo: شامل اسامی و checksum فایلهایی میباشد که باید دانلود شوند.
-
pkg-descr: جزییات بیشتری از برنامه در این فایل توضیح داده شدهاند.
-
pkg-plist: در این فایل لیست فایلهای نصب شده ذخیره میگردد. و با توجه به این فایل deinstall انجام میشود.
-
/files: این دایرکتوری شامل patchها برای کامپایل بر روی برنامه میباشد. همچنین این دایرکتوری جایگاهی است برای دیگر فایلها که به ساختن port کمک میکنند.
-
/work: در این دایرکتوری کامپایل صورت میگیرد و configuration file ها و دیگر فایلها موقت در اینجا قرار میگیرند. به عنوان مثال فایلهای دانلودی در اینجا هستند.
زمانی که وارد شاخه port یعنی /usr/ports/net/tcpdump/ شدید، میتوانید کار کامپایل را شروع نمایید.
نکته: بهتر است برای هر port لیست از dependency هایش بگیرید تا مطمئن شوید چقدر کار دارید و خدای ناکرده چیزی نامربوط به سرور نصب نکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# make all-depends-list /usr/ports/ports-mgmt/pkg /usr/ports/devel/gmake /usr/ports/net/libpcap /usr/ports/net-mgmt/libsmi /usr/ports/devel/gettext-tools /usr/ports/devel/gettext-runtime /usr/ports/print/indexinfo /usr/ports/devel/bison /usr/ports/devel/pkgconf /usr/ports/textproc/expat2 /usr/ports/devel/m4 /usr/ports/lang/perl5.18 |
سپس کار را با با دستور زیر شروع میکنیم:
1 |
#make install |
نکته: به صورت پیشفرض برای شما make config اجرا میشود، که باید port خود را قبل از کامپایل پیکربندی نمایید. برای tcpdump صفحه زیر به نمایش در میآید:
نکته: عموما چنین صفحات پیکربندی را در APT یا YUM کمتر دیدهاید.
نکته: کافیست بخواهید دوباره آن را پیکربندی نمایید و کامپایل نمایید،از دستورات زیر استفاده مینمایید:
1 |
# make config; make install |
نکته: اگر بخواهید فایل پیکربندی را پاک نمایید میتوانید از دستور زیر استفاده نمایید:
1 |
#make rmconfig |
نکته: فرض کنید، یکبار پیکربندی کردهاید، میتوانید با دستور زیر پیکربندی خود را مشاهده نمایید:
1 2 3 4 5 6 7 8 9 |
# make showconfig ===> The following configuration options are available for tcpdump-4.6.2: CHROOT=off: Chroot to /var/run/tcpdump (set CHROOTDIR to change) CRYPTO=on: Support IPSEC and TCPMD5 IPV6=on: IPv6 protocol support SMB=on: Support printing SMB information SMI=on: Allow MIBs to be loaded on the fly USER=off: Drop privileges to nobody ===> Use 'make config' to modify these settings |
نکته: در مورد متغیرهای جلوی configure/. توضیح نمیدهم، زیرا قرار بر این بود که شما با کامپایل کردن آشنا باشید. جلوی دستور make با کمی تغییر میتوانید از آنها بهره ببرید.
۳. استفاده از فرمان pkg:
تا الان مکانیزمی مبتنی بر دانلود کد و کامپایلش را مطرح کردیم. از قدیم الایام، در کنار port شما میتوانستید از این مکانیزم استفاده نموده و بسته را بصورت باینری دانلود و نصب نمایید.
نکته: وقتی یک سیستم FreeBSD را نصب نمودید فرمان زیر را اجرا کنید تا database آن از حالت قدیمی به New Generation تبدیل شود:
1 2 3 4 |
#pkg2ng Converting packages from /var/db/pkg Analysing shared libraries, this will take a while... Checking all packages: 100% |
نکته: ممکن است برای بعضی از port ها به مشکل بر بخورید بدین منظور باید در فایل etc/make.conf/ چنین بنویسید:
1 |
WITH_PKGNG= yes |
فرمان pkg را آهسته آهسته شروع کنیم. برخلاف فرمانهای BSD-base که نوع help آنها زیاد جالب نمیباشد، این فرمان سیستم help جالبی دارد. بگذارید از ابتدا شروع کنیم، این فرمان خود دارای زیرفرمانهایی همانند install و upgrade و غیره است. برای دیدن manual آنها نیاز نیست man pkg را بخوانید. کافیست از دستورات زیر استفاده نمایید:
1 2 3 |
# pkg help install # pkg help upgrade # pkg help delete |
و هر فرمان دیگری که این دستور دارد میتوان از آن help گرفت.
فرمان زیر محتوای یک بسته را نشان میدهد که معادل dpkg -L در APT میباشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# pkg list screen usr/local/bin/screen /usr/local/etc/screenrc.sample /usr/local/info/screen.info /usr/local/man/man1/screen.1.gz /usr/local/share/examples/screen/screenrc.sample-1 /usr/local/share/examples/screen/screenrc.sample-2 /usr/local/share/licenses/screen-4.3.1_1/GPLv3 /usr/local/share/licenses/screen-4.3.1_1/LICENSE /usr/local/share/licenses/screen-4.3.1_1/catalog.mk /usr/local/share/screen/utf8encodings/01 /usr/local/share/screen/utf8encodings/02 /usr/local/share/screen/utf8encodings/03 /usr/local/share/screen/utf8encodings/04 /usr/local/share/screen/utf8encodings/18 /usr/local/share/screen/utf8encodings/19 /usr/local/share/screen/utf8encodings/a1 /usr/local/share/screen/utf8encodings/bf /usr/local/share/screen/utf8encodings/c2 /usr/local/share/screen/utf8encodings/c3 /usr/local/share/screen/utf8encodings/c4 /usr/local/share/screen/utf8encodings/c6 /usr/local/share/screen/utf8encodings/c7 /usr/local/share/screen/utf8encodings/c8 /usr/local/share/screen/utf8encodings/cc /usr/local/share/screen/utf8encodings/cd /usr/local/share/screen/utf8encodings/d6 |
برای install کردن برنامه کافیست از فرمان install استفاده نماییم، در سناریوی زیر برنامه nmap را نصب کردهایم که یک dependency به همراه دارد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# pkg install nmap Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. The following 2 package(s) will be affected (of 0 checked): New packages to be INSTALLED: nmap: 6.47 pcre: 8.37_4 The process will require 23 MiB more space. 5 MiB to be downloaded. Proceed with this action? [y/N]: y Fetching nmap-6.47.txz: 100% 4 MiB 206.7kB/s 00:20 Fetching pcre-8.37_4.txz: 100% 1 MiB 117.5kB/s 00:10 Checking integrity... done (0 conflicting) [1/2] Installing pcre-8.37_4... [1/2] Extracting pcre-8.37_4: 100% [2/2] Installing nmap-6.47... [2/2] Extracting nmap-6.47: 100% |
برای پاک کردن یک port کافیست از فرمان delete استفاده نماییم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# pkg delete nmap Updating database digests format: 100% Checking integrity... done (0 conflicting) Deinstallation has been requested for the following 1 packages (of 0 packages in the universe): Installed packages to be REMOVED: nmap-6.47 The operation will free 18 MiB. Proceed with deinstalling packages? [y/N]: y [1/1] Deinstalling nmap-6.47... [1/1] Deleting files for nmap-6.47: 100% |
اگر درport های نصب نشده دنبال نامی میگردید میتوانید از فرمان زیر استفاده نمایید:
1 2 3 4 |
# pkg search tcpdump p5-Net-TcpDumpLog-0.11_1 tcpdump-4.7.4 tcpdump398-1.0 |
درواقع این فرمان معادل فرمان زیر در Port Tree میباشد:
1 2 3 4 |
# make search name=tcpdump | grep -i ^Port: | awk '{print $2}' p5-Net-TcpDumpLog-0.11_1 tcpdump-4.7.4 tcpdump398-1.0 |
اگر فرمان pkg info را بدون آرگومان که نام بسته باشد لیست کل بستهها را به شما میدهد، همانند زیر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# pkg info autoconf-2.69 Automatically configure source code on many Un*x platforms autoconf-wrapper-20131203 Wrapper script for GNU autoconf bash-4.3.42 The GNU Project's Bourne Again SHell db5-5.3.28_2 The Oracle Berkeley DB, revision 5.3 dialog4ports-0.1.5_2 Console Interface to configure ports expat-2.1.0_3 XML 1.0 parser written in C gettext-runtime-0.19.5.1 GNU gettext runtime libraries and programs gettext-tools-0.19.5.1 GNU gettext development and translation tools gmake-4.1_2 GNU version of 'make' utility gmake-lite-4.1_1 Minimalist version of gnu make help2man-1.43.3_1 Automatically generating simple manual pages from program output indexinfo-0.2.3 Utility to regenerate the GNU info page index libedit-3.1.20150325_1 Command line editor library libffi-3.2.1 Foreign Function Interface libiconv-1.14_8 Character set conversion library libyaml-0.1.6_2 YAML 1.1 parser and emitter written in C m4-1.4.17_1,1 GNU m4 p5-Locale-gettext-1.05_4 Message handling functions pcre-8.37_4 Perl Compatible Regular Expressions library perl5-5.20.2_6 Practical Extraction and Report Language pkg-1.5.6 Package manager portmaster-3.17.7 Manage your ports without external databases or languages portupgrade-2.4.14,2 FreeBSD ports/packages administration and management tool suite ruby-2.1.6,1 Object-oriented interpreted scripting language ruby21-bdb-0.6.6_4 Ruby interface to Oracle Berkeley DB revision 2 or later screen-4.3.1_1 Multi-screen window manager |
اما اگر مشخصات بستهای خاص را میخواهید میتوانید اینگونه عمل نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# pkg info portupgrade portupgrade-2.4.14,2 Name : portupgrade Version : 2.4.14,2 Installed on : Mon Aug 31 08:04:53 IRDT 2015 Origin : ports-mgmt/portupgrade Architecture : freebsd:10:x86:32 Prefix : /usr/local Categories : ports-mgmt Licenses : BSD3CLAUSE Maintainer : bdrewery@FreeBSD.org WWW : http://pkgtools.github.com/ Comment : FreeBSD ports/packages administration and management tool suite Options : DOCS : on Annotations : Flat size : 341KiB Description : Portupgrade is a tool to upgrade installed packages via ports or packages. You can upgrade installed packages without having to reinstall depending or dependent packages. It can automatically trace dependency chains up and down upgrading packages recursively. This package also includes the following utilities: portinstall: Helps you install new ports in a handy way. portcvsweb: Instantly lets you browse change history via CVSweb. portversion: Replaces pkg_version(1) and helps you upgrade packages with portupgrade(1). (runs much faster) portsclean: Cleans ports workdir's, unreferenced distfiles, old and orphan shared libraries, and stale packages. portsdb: Creates binary database from the ports INDEX. ports_glob: Expands ports globs. pkg_deinstall: Wraps pkg_delete(1) and provides additional features. pkg_fetch: Fetches packages from a remote site. pkg_glob: Expands package globs. pkg_which: Checks which package a file came from quickly. pkgdb: Manages and searches the package database. pkgdu: Display a disk usage for installed packages. WWW: http://pkgtools.github.com/ WWW: http://wiki.freebsd.org/portupgrade |
برای اینکه با بحث نسخهبندی و version بستهها آشنا شویم بهتر است با چند عملگر و دستور آشنا شویم:
-
=: این بدان معناست که بسته جاری به روز است.
-
>: این بدان معناست که بسته جاری قدیمیتر از نسخه جاری میباشد.
-
<: این بدان معناست که بسته جاری به روزتر از نسخه جاری میباشد.
-
؟: این بدان معناست که بسته در database یا Ports Tree نمایان نیست یا هنوز در Official Ports Tree قرار نگرفته است.
-
!: این بدان معناست که بسته در database نمایان نیست ولی port در Port Tree وجود دارد، Makefile این port به مشکل برخورده است و نمیتواند آخرین نسخه آن را تهیه کند.
-
# : این بدان معناست که بسته نصب شده منشاء و مبدأ ذخیره شده ندارد. میتوانید این مشکل را با pkgdb -F حل نمایید.
دو دستور اساسی برای کار نسخه بستهها وجود دارد یکی خود pkg است و دیگری portversion که در بسته portupgrade میباشد.
زمانی که برای اولین بار این بسته را اجرا میکنید چنین چیزی میبینید:
1 2 3 |
# portversion -l "<" [Reading data from pkg(8) ... - 27 packages found - done] [Updating the portsdb <format:bdb_btree> in /usr/ports ... - 25183 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000.........25000. ..... done] |
وقتی برای بستههایی که هنوز upgrade نشدهاند query میگیرید چینین چیزی میزنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# portversion -l "<" [Reading data from pkg(8) ... - 115 packages found - done] apr < atk < cairo < cmake < cmake-modules < cscope < cups-client < dejavu < expat < font-util < freetype2 < gdk-pixbuf2 < gettext-runtime < gettext-tools < glib < gmake < |
فرض کنید میخواهیم curl را upgrade نماییم ، از فرمان زیر استفاده میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# pkg upgrade curl Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. The following 2 package(s) will be affected (of 0 checked): Installed packages to be UPGRADED: curl: 7.41.0 -> 7.44.0 ca_root_nss: 3.17.4_1 -> 3.20 The process will require 145 KiB more space. 2 MiB to be downloaded. Proceed with this action? [y/N]: y Fetching curl-7.44.0.txz: 100% 1 MiB 114.5kB/s 00:13 Fetching ca_root_nss-3.20.txz: 100% 334 KiB 114.0kB/s 00:03 Checking integrity... done (0 conflicting) [1/2] Upgrading ca_root_nss from 3.17.4_1 to 3.20... [1/2] Extracting ca_root_nss-3.20: 100% [2/2] Upgrading curl from 7.41.0 to 7.44.0... [2/2] Extracting curl-7.44.0: 100% Message for ca_root_nss-3.20: ********************************* WARNING ********************************* FreeBSD does not, and can not warrant that the certification authorities whose certificates are included in this package have in any way been audited for trustworthiness or RFC 3647 compliance. Assessment and verification of trust is the complete responsibility of the system administrator. *********************************** NOTE ********************************** This package installs symlinks to support root certificates discovery by default for software that uses OpenSSL. This enables SSL Certificate Verification by client software without manual intervention. If you prefer to do this manually, replace the following symlinks with either an empty file or your site-local certificate bundle. * /etc/ssl/cert.pem * /usr/local/etc/ssl/cert.pem * /usr/local/openssl/cert.pem *************************************************************************** |
شما نیاز دارید همانند apt-get update با سرور همگام شوید و metadata های خود را با سرور یکی کنید. بدین منظور باید از فرمان زیر استفاده نمایید:
1 2 3 4 |
# pkg update Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. |
۴. نکاتی در باب یادگیری کار با بستهها و پورتها :
-
مفاهیم مربوط به backend ها را خوب hack کنید.
-
تمام دستورات مرتبط به port ها را در حالتهای خاص به کار برید، این بدان معناست که هر دستور و پارامتری جایی دارد.
-
کل سیستم را upgrade نکنید. یکی از خطرناکترین کارهایی است که میتوانید انجام دهید.
-
مفاهیم مربوط به پاکسازی دیسک (مربوط به port) را کاملاً فرا گیرید.
-
زمانی که در حال نصب port هستید، به دقت هر لحظه از آن را “بفهمید” که چه اتفاقی در حال انجام است.
-
مسیر کشهای خود را پیدا کنید.
-
کل پارامترهای make را یاد بگیرید.
-
با pkg دوست باشید.
عالی بود 😉