برنامه rpm چیست ؟ آموزش ایجاد rpm به زبان ساده و کاربردی
برنامه rpm چیست ؟ نحوهی دسترسی به پسوند rpm چیست ؟ به سادهترین بیان، RPM یک ابزار مدیریت پکیج و ابزارهای مدیریت بسته در ردهت است. در این مقاله صمن پاسخ به این سوال که rpm در لینوکس چیست با روشهای ایجاد RPM در لینوکس نیز آشنا خواهید شد؛ با ما همراه باشید.
برنامه rpm چیست ؟
RPM یکی از محبوبترین ابزار مدیریت بستهی پیشفرض و منبع باز میباشد و برای سیستم های مبتنی بر Red Hat مانند RHEL، CentOS و Fedora کاربرد دارد. این ابزار به مدیران و کاربران سیستم امکان میدهد تا بستههای نرم افزاری را در یونیکس و لینوکس، نصب، بهروزرسانی، حذف، جستجو، تأیید و مدیریت کنند. RPM قبلاً به عنوان فایل rpm. شناخته میشد که برنامه های نرم افزاری کامپایل شده و کتابخانه های مورد نیاز بسته ها را شامل میشد. اگر برای شما این سوال به وجود آمده است که فرمت rpm چیست باید عنوان کنیم که این ابزار تنها با بستههایی که بر اساس فرمت rpm. ساخته شدهاند کار میکند.
از CentOS نام بردیم. میدانید این توزیع لینوکس محبوب چیست و چه ویژگیهایی دارد؟ اگر میخواهید با مزایای استفاده از این سیستم عامل منبع باز بیشتر آشنا شوید، به مراجعه به وبلاگ ابرآراز از مطالب مقالهی CentOs چیست استفاده کنید.
rpm مخفف چیست ؟
rpm مخفف عبارت Red Hat Package Manager بوده و آرشیو فایلها و ابردادهها از جمله اطلاعاتی مانند وابستگیها و محل نصب را شامل میشود. همانطور که گفتیم بسته RPM از پسوند rpm. استفاده میکند و یک بسته (مجموعه) از فایلهای مختلف است که میتواند شامل موارد زیر باشد:
- فایلهای باینری که به عنوان فایلهای اجرایی (nmap، stat، xattr، ssh، sshd و…) نیز شناخته میشوند.
- فایلهای پیکربندی (sshd.conf، updatedb.conf، logrotate.conf، و…).
- فایلهای مستندات (README، TODO، AUTHOR، و…).
ویژگیهای مهم rpm
- RPM رایگان است و تحت GPL (مجوز عمومی عمومی) منتشر شده است.
- RPM اطلاعات تمام بستههای نصب شده را در پایگاه داده /var/lib/rpm نگه میدارد.
- RPM تنها راه نصب بستهها در سیستمهای لینوکس است، اگر بستهها را با استفاده از کد منبع نصب کردهاید، rpm آن را مدیریت نمیکند.
- RPM با فایلهای rpm. سروکار دارد که حاوی اطلاعات واقعی در مورد بستههاست، مانند: چیست، از کجا آمده است، اطلاعات وابستگیها، اطلاعات نسخه و…
حالتهای اصلی دستور RPM چیست ؟
- Install: برای نصب هر بسته RPM استفاده میشود.
- Remove: برای پاک کردن، حذف یا حذف هر بسته RPM استفاده میشود.
- ارتقا: برای بروزرسانی بسته RPM موجود استفاده میشود.
- Verify: برای تایید بستههای RPM استفاده میشود.
- Query : برای جستوجوی هر بسته RPM از آن استفاده میشود.
نحوهی دسترسی به بستهی RPM
در ادامه، لیستی از سایتهای rpm وجود دارد که میتوانید از طریق آنها تمام بستههای RPM را پیدا و دانلود کنید.
http://rpmfind.net
http://www.redhat.com
http://freshrpms.net
http://rpm.pbone.net
لطفاً به یاد داشته باشید که هنگام نصب بسته ها در لینوکس باید کاربر ریشه و یا ادمین باشید؛ با استفاده از امتیازاتی که ادمین بودن در اختیار شما قرار میدهد، میتوانید دستورات rpm را با گزینههای مناسب آنها مدیریت کنید.
نحوه بررسی بسته امضای RPM
همیشه امضای PGP بستهها را قبل از نصب آنها در سیستمهای لینوکس خود بررسی کنید و مطمئن شوید که یکپارچگی و منشاء آن صحیح است. از دستور زیر با گزینه –checksig (check signature) برای بررسی امضای بسته ای به نام pidgin استفاده کنید.
$ rpm --checksig pidgin-2.7.9-5.el6.2.i686.rpm
خروجی:
$ pidgin-2.7.9-5.el6.2.i686.rpm: rsa sha1 (md5) pgp md5 OK
نحوه بررسی وابستگی های بسته RPM قبل از نصب
فرض کنید میخواهید قبل از نصب یا ارتقاء یک بسته، یک بررسی وابستگی انجام دهید. برای مثال، از دستور زیر برای بررسی وابستگیهای بسته BitTorrent-5.2.2-1-Python2.4.noarch.rpm استفاده کنید:
$ rpm -qpR BitTorrent-5.2.2-1-Python2.4.noarch.rpm
لیستی از وابستگی های بسته را نمایش میدهد:
/usr/bin/python2.4
python >= 2.3
python(abi) = 2.4
python-crypto >= 2.0
python-psyco
python-twisted >= 2.0
python-zopeinterface
rpmlib(CompressedFileNames) = 2.6
آموزش نصب، بروزرسانی و حذف بسته های RPM
معمولاً برای نصب یک بسته جدید بر روی توزیعهای مبتنی بر Red Hat، از دستورات yum یا dnf استفاده میشود که می توانند تمام وابستگیهای بسته را حل و نصب کنند. هنگام نصب، بروزرسانی و حذف بسته ها، همیشه باید استفاده از yum یا dnf را به rpm ترجیح دهید.
قبل از نصب بسته RPM ، ابتدا باید بسته را با استفاده از مرورگر یا ابزارهای خط فرمان مانند curl یا wget بر روی سیستم خود دانلود کنید. هنگام نصب بستههای RPM ، مطمئن شوید که برای معماری سیستم شما و نسخه سیستم شما ساخته شدهاند. هنگام تعویض یا بروزرسانی بستههای مهم سیستم، مانند glibc، systemd یا سایر سرویسها و کتابخانههایی که برای عملکرد صحیح سیستم شما ضروری هستند، بیشتر مراقب باشید.
فقط کاربران روت یا با دسترسی sudo میتوانند بسته های RPM را نصب یا حذف کنند. برای نصب یک بسته RPM با rpm، از گزینه -i و به دنبال آن نام بسته استفاده کنید:
$ sudo rpm -ivh package.rpm
گزینه -v به rpm اعلام میکند که خروجی پرمطلبتری را نشان میدهد (verbose) و گزینه -h برای نشان دادن نوار پیشرفت علامت گذاری شده هش میباشد.
میتوانید قسمت دانلود را رها کنید و URL بسته RPM را به دستور rpm ارائه دهید:
$ sudo rpm -ivh https://example.com/package.rpm
نحوهی ارتقا RPM
برای ارتقاء یک بسته RPM، از گزینه U- استفاده کنید و اگر بسته نصب نشده باشد، نصب خواهد شد:
$ sudo rpm -Uvh package.rpm
اگر بسته ای که نصب می کنید یا به روز می کنید به بسته های دیگری بستگی دارد که در حال حاضر نصب نشده اند، rpm لیستی از تمام وابستگی های گم شده را نشان می دهد. شما باید تمام وابستگی ها را به صورت دستی دانلود و نصب کنید.
برای نصب بسته RPM بدون نصب تمام وابستگی های مورد نیاز روی سیستم، از گزینه nodeps– استفاده کنید:
$ sudo rpm -Uvh --nodeps package.rpm
برای حذف (پاک کردن) یک بسته RPM، از گزینه e- استفاده کنید:
$ sudo rpm -e package.rpm
گزینه nodeps– هنگامی که می خواهید بسته ای را بدون حذف وابستگی های آن حذف کنید نیز مفید است:
$ sudo rpm -evh --nodeps package.rpm
گزینه –test به rpm می گوید که دستور نصب یا حذف را بدون هیچ کاری انجام دهد. فقط نشان می دهد که آیا دستور کار می کند یا خیر:
sudo rpm -Uvh --test package.rpm
جستوجو (query ) از بسته های RPM
گزینه q- به دستور rpm می گوید که یک پرس و جو یا همان کوئِری را اجرا کند.
برای query (جستجو) که آیا بسته خاصی نصب شده است، نام بسته را به دستور rpm -q منتقل کنید. دستور زیر به شما نشان می دهد که آیا بسته OpenJDK 11 بر روی سیستم نصب شده است یا خیر:
$ sudo rpm -q java-11-openjdk-devel
اگر بسته نصب شده باشد، چیزی شبیه به زیر را خواهید دید:
java-11-openjdk-devel-11.0.4.11-0.el8_0.x86_64
برای دریافت اطلاعات بیشتر در مورد بسته مورد نظر، از i- استفاده کنید:
$ sudo rpm -qi java-11-openjdk-devel
برای دریافت لیستی از تمام فایل های یک بسته RPM نصب شده:
$ sudo rpm -ql package
اگر می خواهید بفهمید یک فایل خاص به کدام بسته نصب شده تعلق دارد، تایپ کنید:
$ sudo rpm -qf /path/to/file
برای دریافت لیستی از تمام بسته های نصب شده روی سیستم خود از گزینه a- استفاده کنید:
$ sudo rpm -qa
از دستور rpm زیر با گزینه -qa (query all) استفاده کنید، همه بستههای rpm اخیراً نصب شده را فهرست میکند.
$ rpm -qa –last
نحوهی بررسی بسته های RPM چیست ؟
هنگام تأیید یک بسته، دستور rpm بررسی می کند که آیا هر فایل نصب شده توسط یک بسته در سیستم، خلاصه فایل، مالکیت، مجوزها و غیره وجود دارد یا خیر. برای تایید یک بسته نصب شده، از گزینه V- استفاده کنید. به عنوان مثال، برای تأیید بسته openldap باید اجرا کنید:
$ sudo rpm -V openldap-2.4.46-9.el8.x86_64
اگر بررسی تایید شود، هیچ خروجی چاپ نمی شود. در غیر این صورت، اگر برخی از بررسی ها ناموفق باشد، کاراکتری نشان می دهد که تست شکست خورده را نشان می دهد.
به عنوان مثال، خروجی زیر نشان می دهد که mTime فایل تغییر کرده است (“T”):
.......T. c /etc/openldap/ldap.conf
در مورد معنای هر شخصیت به صفحه مرد RMP مراجعه کنید.
برای تایید تمام بسته های rpm نصب شده دستور زیر را اجرا کنید:
$ sudo rpm -Va
نحوه ایجاد یک بسته RPM چیست ؟
برای ساخت بسته RPM به اجزای زیر نیاز دارید:
- یک workstation (محیط کار) یا یک ماشین مجازی که توزیع مبتنی بر RPM را اجرا می کند، مانند RHEL یا Fedora.
- نرم افزار ساخت پکیج
- کد منبع به بسته.
- فایل SPEC برای ساخت RPM.
- نصب نرم افزار مورد نیاز
برای ساخت بسته RPM باید بسته های زیر نصب شوند:
$ sudo dnf install -y rpmdevtools rpmlint
پس از نصب rpmdevtools، درخت فایل مورد نیاز برای ساخت بسته های RPM را ایجاد کنید:
$ rpmdev-setuptree
شما بسته های RPM را به عنوان یک کاربر معمولی (نه روت) می سازید، بنابراین محیط ساخت شما در فهرست اصلی شما قرار می گیرد. شامل این ساختار دایرکتوری است:
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
بررسی قسمتهای مختلف یک بسته RPM
- دایرکتوری BUILD در طول فرآیند ساخت بسته RPM استفاده می شود. اینجا جایی است که فایل های موقت ذخیره می شوند، جابه جا می شوند و غیره.
- دایرکتوری RPMS بستههای RPM ساخته شده برای معماریهای مختلف و noarch را در صورت مشخص شدن در فایل spec. یا در حین ساخت نگهداری میکند.
- دایرکتوری SOURCES، همانطور که از نام آن پیداست، دارای منابع است. این می تواند یک اسکریپت ساده، یک پروژه C پیچیده که باید کامپایل شود، یک برنامه از پیش کامپایل شده و غیره باشد. معمولاً منابع به صورت فایل های .gz یا tgz. فشرده می شوند.
- دایرکتوری SPEC حاوی فایل های .spec است. فایل spec. نحوه ساخت یک بسته را مشخص می کند. بیشتر در مورد آن بعدا.
- دایرکتوری SRPMS بسته های .rpm را نگه می دارد. بسته منبع RPM به یک معماری یا توزیع تعلق ندارد. ساخت بسته rpm واقعی بر اساس بسته .src.rpm است.
بسته src.rpm. بسیار منعطف است، زیرا می توان آن را بر اساس هر توزیع و معماری دیگر مبتنی بر RPM ساخته و دوباره ساخت.
اکنون با آنچه در هر دایرکتوری وجود دارد آشنا هستید، بنابراین اکنون یک اسکریپت ساده برای توزیع ایجاد کنید:
$ cat << EOF >> hello.sh #!/bin/sh echo "Hello world" EOF
این یک پوسته اسکریپت به نام hello.sh ایجاد می کند که “Hello world” را در ترمینال چاپ می کند. ساده است، اما برای نشان دادن بسته بندی کافی است.
قرار دادن اسکریپت در دایرکتوری
برای ساختن یک بسته برای اسکریپت خود، باید اسکریپت خود را در دایرکتوری قرار دهید که سیستم ساخت RPM انتظار دارد که در آن باشد. یک دایرکتوری برای آن ایجاد کنید، با استفاده از نسخهسازی معنایی مانند اکثر پروژهها، و سپس hello.sh را به آن منتقل کنید:
$ mkdir hello-0.0.1 $ mv hello.sh hello-0.0.1
بیشتر کد منبع به صورت بایگانی توزیع می شود، بنابراین از دستور tar برای ایجاد یک فایل بایگانی استفاده کنید:
$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1
سپس tarball را که به تازگی ایجاد کرده اید به فهرست SOURCES منتقل کنید:
$ mv hello-0.0.1.tar.gz SOURCES
منظور از ایجاد فایل spec. در rpm چیست ؟
یک بسته RPM توسط یک فایل spec. تعریف می شود. نحوی یک فایل spec. سختگیرانه است، اما rpmdev می تواند یک فایل boilerplate برای شما ایجاد کند:
$ rpmdev-newspec hello
با این کار فایلی به نام hello.spec تولید می شود که باید آن را به دایرکتوری SPECS منتقل کنید. درخت ~/rpmbuild را اجرا کنید تا ببینید ساختار دایرکتوری چگونه است:
/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── hello-0.0.1.tar.gz
├── SPECS
│ └── hello.spec
└── SRPMS
فایل hello.spec ایجاد شده نقطه شروع خوبی را ارائه می دهد، اما اطلاعات خاصی در مورد آنچه می سازید ندارد. فایل .spec تولید شده فرض می کند که ما قصد داریم نرم افزار را کامپایل و بسازیم.
شما در حال بسته بندی یک اسکریپت Bash هستید، بنابراین می توانید کارهای ساده ای انجام دهید. به عنوان مثال، هیچ فرآیند ساخت وجود ندارد زیرا هیچ کدی برای کامپایل وجود ندارد. من BuildArch: noarch را اضافه کرده ام زیرا این بسته برای 32 بیت، 64 بیت، Arm و هر معماری CPU دیگری که Bash را اجرا می کند معتبر است.
اضافه کردن Requires: bash
همچنین Requires: bash را اضافه کردهام تا بسته از نصب Bash اطمینان حاصل کند. این اسکریپت ساده «hello world» البته روی هر پوستهای اجرا میشود، اما این برای همه اسکریپتها صادق نیست، بنابراین این یک راه خوب برای نشان دادن وابستگیها است.
Name: hello Version: 0.0.1 Release: 1%{?dist} Summary: A simple hello world script BuildArch: noarch License: GPL Source0: %{name}-%{version}.tar.gz Requires: bash %description A demo RPM build %prep %setup -q %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/%{_bindir} cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir} %clean rm -rf $RPM_BUILD_ROOT %files %{_bindir}/%{name}.sh %changelog * Sun Nov 18 2020 Valentin Bajrami <valentin.bajrami@slimmer.ai> - 0.0.1 - First version being packaged
همانطور که می توانید بگویید، میانبرهای زیادی در فایل های spec. وجود دارد. آنها ماکرو نامیده می شوند و لیستی عالی از آنچه در اسناد بسته بندی فدورا موجود است وجود دارد. استفاده از ماکروها در فایلهای spec. مهم است. آنها به اطمینان از یکنواختی در همه سیستمهای RPM کمک میکنند، به شما کمک میکنند از اشتباه در نام فایلها و شمارهگذاری نسخهها جلوگیری کنید، و هنگامی که نسخه جدیدی از اسکریپت خود را منتشر میکنید، بهروزرسانی فایل .spec را آسانتر میکنند.
برای مثال، لازم است که دقیقاً مشخص کنید کدام فایلها در قسمت files % نصب شدهاند. در اینجا من به صراحت خط زیر را قرار داده ام:
%files %{_bindir}/%{name}.sh
ماکروهای مفید دیگر:
- %{name} نام بسته (همانطور که در قسمت Name: تعریف شده است)
- %{version} نسخه بسته (همانطور که در قسمت Version: تعریف شده است)
- %{_datadir} داده به اشتراک گذاشته شده (/usr/sbin به طور پیشفرض)
- دایرکتوری پیکربندی %{_sysconfdir} (/etc بصورت پیشفرض)
بررسی خطای فایل .spec (rpmlint)
دستور rpmlint می تواند خطاها را در فایل های spec. پیدا کند:
$ rpmlint ~/rpmbuild/SPECS/hello.spec SPECS/hello.spec: W: no-%build-section SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz 0 packages and 1 specfiles checked; 0 errors, 2 warnings.
2 خطا گزارش شده است، اما هر دو قابل قبول هستند. هیچ کدی برای ساخت وجود ندارد، بنابراین نیازی به بخش ساخت % نیست و آرشیو منبع یک فایل محلی است و URL شبکه ندارد.
مراحل ساخت پکیج (rpmbuild) در rpm چیست ؟
برای ساخت بسته RPM از دستور rpmbuild استفاده کنید. قبلا در این آموزش به تفاوت بسته .src.rpm (بسته RPM منبع) و بسته rpm اشاره کردم.
برای ایجاد بسته rpm .src:
$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec
flags -bs معانی زیر را دارند:
- -b: build
- -s: source
برای ایجاد بسته باینری rpm:
$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec
flags -bb معانی زیر را دارند:
- -b: build
- -b: binary
از ba- برای ساخت هر دو استفاده کنید.
پس از اتمام فرآیند ساخت، ساختار دایرکتوری زیر را دارید:
$ tree ~/rpmbuild/ /home/tux/rpmbuild/ ├── BUILD │ └── hello-0.0.1 │ ├── hello.sh ├── BUILDROOT ├── RPMS │ └── noarch │ └── hello-0.0.1-1.el8.noarch.rpm ├── SOURCES │ └── hello-0.0.1.tar.gz ├── SPECS │ └── hello.spec └── SRPMS