Pages

Wednesday, December 31, 2008

Giới thiệu về RPM

RPM là tên viết tắt của RedHat Package Manager, là một chương trình cho phép người dùng quản lý các phần mềm được cài đặt trên Linux một cách mềm dẻo và hữu dụng. Với RPM bạn có thể cài đặt các gói phần mềm một các tự động, có thể gỡ bỏ các phần mềm đã được cài một cách an toàn , có thể kiểm tra tính toàn vẹn của các chương trình, có thể tự đóng gói phần mềm riêng cho mì nh, có thể...rất nhiều...!

I- RPM với người dùng

1. Cài đặt phần mềm

Cú pháp đầy đủ là :

rpm -i (hoặc --install) [ các tuỳ chọ n ]

các tuỳ chọ n là :

-h (hoặc --hash) In kí tự ‘#’ trong quá trình cài đặt
--test Chỉ thử cài đặt, không cài thật--percent Hiện số phần trăm trong quá trình cài đặt
--excludedocs Không cài các tài liệu kèm theo gói
--includedocs Cài cả tài liệu đi kèm (ngầm định)
--replacepkgs Cài đè một bản mới lên gói đã cài đặt trước đó
--replacefiles Có thể chép đè lên file của gói khác
--force Bỏ qua sự xung đột giữa các gói và các file
--noscripts Không thực hiện các script pre-install và post-install
--prefix Ðổi thư mục cài đặt ngầm định của gói (nếu có thể)
--ignorearch Không kiểm tra dòng máy tính (i386, i686, noarch..)
--ignoreos Không kiểm tra hệ điều hành (OS)
--nodeps Không kiểm tra tính phụ thuộc (dependencies)
--ftpproxy Dùng máy tí nh như là một FTP proxy
--ftpport Dùng cổng làm FTP port

Khi một gói nào đó được cài đặt, chương trình rpm sẽ thực hiện các công việc sau :

- Kiểm tra tính phụ thuộc của gói. Một số gói không hoạt động đúng nếu không có một gói nào đó được cài đặt từ trước. Hoặc nó kiểm tra xem có làm thay đổi tính phụ thuộc của các gói đã được cài đặt trước hay không.

Kiểm tra tình trạng xung đột giữa các file. Trong phần này chương trình rpm phải thử cài đặt các file, sau đó kiểm tra xem có xung đột hay không, hoặc thử thay đổi các file cấu hình. Sau đó kiểm tra lại.

- Thực hiện các script trước lúc cài đặt. Một số gói trước khi được cài đặt phải thực hiện một số công việc nhất định nào đó (back up chẳng hạn). Ðây là các shell script được tạo ra bởi người đóng gói.

- Sửa lại các file cấu hì nh đang có trong hệ thống. Một trong những ưu điểm khác của RPM với các trình quản lý cài đặt khác là cách chúng xử lý các file cấu hình. Khi một phần mềm được cài đặt, chúng cần phải thay đổi một số file cấu hình có sẵn trong hệ thống, rpm không chép đè các file cấu hình mới lên các file cũ mà nó phân tích tình trạng của các file cũ để chỉ thực hiện các thay đổi cần thiết (xem phần sau)

- Bung nén các file từ gói cài đặt vào các vị trí thí ch hợp. Bước này mới thật sự là copy các file từ gói cài đặt vào hệ thống, sau đó các thuộc tính của file cũng được rpm xác lập.

- Thực hiện các script sau cài đặt. Tương tự như các script trước lúc cài đặt, bước này đối với một số gói cũng cần được thực hiện, ví dụ như chạy ldconfig để cho các thư viện liên kết động mới có thể được dùng ngay.

- Lưu lại tất cả các thông tin trên vào cơ sở dữ liệu. RPM có một cơ sở dữ liệu rất lớn lưu trữ tất cả các công việc mà nó thực hiện với các gói cùng các thông tin về các gói. Nó sẽ sử dụng cơ sở dữ liệu này để tra cứu thông tin về sau hoặc kiểm tra xung đột.

Ðể cài đặt một gói, đơn giản là dùng lệnh :

rpm -i

Nhớ là tên gói và tên file của gói là khác nhau ví dụ tên gói có thể là : eject-1.2-2 nhưng tên file của gói lại là eject-1.2-2.i386.rpm

Các tùy chọn:

- Thay vì chỉ ra tên file cụ thể nằm trong hệ thống file của máy tính, ta có thể chỉ ra một URL chứa gói cài đặt. Ví dụ :

rpm -i ftp://ftp.redhat.com/RPMS/example-1.0-2.noarch.rpm

Có thể một lúc nào đó bạn cần phải cung cấp cả tên người dùng và mật khẩu để truy cập file đó, lúc đó cần một URL đầy đủ như sau :

ftp://elnino:passwords@ftp.redhat.com/RPMS/example-1.0-2.noarch.rpm

Nhưng xem ra để cho mật khẩu hiện lên như vậy là điều không nên. Bạn có thể chỉ cần cung cấp tên người dùng trong URL, rpm sẽ hỏi bạn mật khẩu và lúc đó mới nhập mật khẩu theo cách không hiện lên màn hình.

- Thông thường thì chỉ cần một dòng lệnh rpm -i nh- vậy là đủ. Nó sẽ thực hiện cài đặt mà không hiện gì ra màn hình cả, trừ khi có lỗi khi cài đặt. Nếu muốn hiện thêm một số thông tin bạn có thể thêm các tùy chọ n -v,-h hoặc -vv, hoặc --percent cứ thử xem.

- Có lúc bạn chỉ thử cài một gói nào đó để xem nó có xung đột hoặc cần một file nào đặc biệt không. Hãy dùng tùy chọn --test

- Có lúc một gói nào đó bị hỏng hoặc mất một số file cần cài lại. Bạn có thể dùng thêm tùy chọ n --replacepkgs. (Không phải là nâng cấp, bạn phải cài lại đúng gói đó theo đúng version và release)

- Một gói nào đó chứa một file mà file đó trong hệ thống đang thuộc về một gói khác (cơ sở dữ liệu của rpm lưu trữ tất các những thông tin này). Khi cài gói mới, rpm sẽ cảnh báo sự xung đột file này và không thực hiện cài đặt.

Nhưng nếu cần thiết phải chép đè như vậy thì hãy dùng thêm tùy chọ n --replacefiles (một file backup sẽ được rpm tạo ra *.rpmsave). Cảnh giác với điều này vì nếu một lúc nào đó bạn xóa gói cài sau ra khỏi hệ thống, file bị ghi đè kia tất nhiên sẽ biến mất. Lúc đó cần phục hồi lại bằng file .rpmsave.

- Khi một gói nào đó (A chẳng hạn) phụ thuộc vào sự tồn tại của một gói nào đó có trước (ví dụ là B). Bạn có thể sẽ không cài được gói A. Nhưng nếu bạn vẫn muốn cài gói A trước, rồi lúc nào đó cài gói B sau thì có thể dùng tùy chọ n --nodeps . Hãy lợi dụng tùy chọn này khi bạn không biết thứ tự của các gói khi cài đặt.

- Thông thường các gói cài đặt sẽ cài đặt các file của mì nh vào một số thư mục nhất định nào đó trong hệ thống. Tuy nhiên có một số phần mềm cho phép người dùng cài đặt vào một vị trí khác (relocateable). Lúc đó bạn phải thêm tùy chọn --prefix vào trong câu lệnh rpm -i.

- Tùy chọn --noscript : RPM thật sự còn làm nhiều công việc hơn là chỉ copy các file đơn thuần. Nó có các mã thi hành cần thiết trước và sau cài đặt, và điều này rất có ý nghĩa với sự hoạt động của một số phần mềm . Nhưng có lúc oái oăm nào đó bạn biết thừa là các script đó làm gì và không muốn chúng thực hiện thì hãy thêm tùy chọn --noscript.

2. Xóa một gói ra khỏi hệ thống

Ðể xóa một gói ra khỏi hệ thống, dùng lệnh :

rpm -e (hoặc --erase) [ các tùy chọ n ]

Các tùy chọ n :

--test Thử xóa, không xóa thực sự.
--noscripts Không thực hiện các mã pre-uninstall và post-uninstall
--nodeps Không kiểm tra tí nh phụ thuộc.

Khi một gói được xóa khỏi hệ thống, rpm thực hiện các công việc sau :

- Kiểm tra xem có một gói nào trong hệ thống phụ thuộc vào gói sẽ bị xóa không.
- Thực hiện script pre-uninstall nếu có.
- Kiểm tra các file cấu hì nh có bị thay đổi không, nếu có sẽ lưu lại một bản copy.
- Tra cứu cơ sở dữ liệu rpm để xóa các file của gói đó.
- Thực hiện các script post-uninstall nếu có.
- Xóa các thông tin liên quan đến các gói trong cơ sở dữ liệu.

3. Nâng cấp một gói

Nâng cấp một gói cách thức cũng tương tự như cài đặt gói. Chỉ khác là tham số không phải -i mà là -U .

Nhưng cần chú ý : bạn có một file .rpm, sẽ có 2 khả năng, một là phần mềm đó hoàn toàn chưa có trên hệ thống của bạn, như vậy bạn chọn tham số -i để cài mới, nếu phần mềm đó đã tồn tại trong hệ thống nhưng với phiên bản cũ hơn, bạn phải chọn tùy chọn -U , nếu chọn -i sẽ xảy ra tì nh trạng xung đột các file giữa gói cũ và gói mới.

Thêm một chú ý nữa là đôi khi bạn cần cài một gói cũ hơn đè lên một gói có phiên bản mới hơn đang tồn tại trong hệ thống, lúc này bạn cần thêm tham số --oldpackage

4. Lấy thông tin về các package

Một trong những điểm thú vị nhất về rpm là nó luôn sẵn sàng cung cấp những thông tin cần thiết về toàn bộ các gói có trong hệ thống của bạn.

Cú pháp đầy đủ như sau :

rpm -q (hoặc --query) [ tùy chọ n ]

+ Chọ n các gói cần cung cấp thông tin (gọ i là query cho tiện):
* pkg1 pkg2 .. pkgN Danh sách các gói cần query (đã cài đặt).
* -p Query một file rpm có thể chưa cài.
* -f Query gói nào chứa file .
* -a Query tất cả các gói đã được cài đặt.
* --whatprovides Query gói nào cung cấp .
* -g Query gói nào thuộc nhóm .
* --whatrequires Query gói nào cần đến .

+Chọ n loại thông tin cần hiển thị :
* (Bỏ trống các tham số sau) Hiện ra tên gói.
* -i Hiện các thông tin chung về gói.
* -l Hiện danh sách các file trong gói.
* -c Hiện danh sách các file cấu hì nh.
* -d Hiện danh sách các file tài liệu.
* -s Hiện danh sách các file cùng với trạng thái.
* --script Hiện ra các script install, uninstall và verify.
* --queryformat Hiện thông tin theo một dạng riêng yêu cầu.
* --dumb Hiện tất cả các thông tin của từng file.
* --provides Hiện các file dùng chung mà gói cung cấp.
* --requires Hiện các file (gói) mà gói cần có.

Có rất nhiều tình huống cần đến việc lấy thông tin từ một hoặc một vài gói nào đó. Chẳng hạn như bạn gặp một file bất kỳ trong hệ thống. Bạn muốn biết file đó thuộc về gói nào, hãy dùng lệnh : rpm -qf . Hoặc bạn có một gói chương trình, bạn không biết nó có gì , chức năng của nó như thế nào... , không cần cài đặt nó, bằng lệng sau bạn có thể có các thông tin đó : rpm -qilp . Bạn có một phần mềm đã được cài đặt trong hệ thống từ rất lâu rồi nhưng không biết nó cài vào đâu và tài liệu ở đâu.v.v. tất cả các thông tin đó đều được đáp ứng bằng rpm -q.

Tips : Bạn có thể sinh ra một danh sách các tên gói đã được cài đặt trong hệ thống bằng lệnh rpm -qa > tên_file_kết_quả . Nếu cần nhiều thông tin hơn, cứ việc thêm các tham số cần thiết vào.

Tips : Bạn có thể có một cách hiển thị thông tin riêng của mì nh. Ví dụ như chỉ đưa ra tên gói và dung lượng mà không đưa ra các thông tin khác (không dùng -i). Hãy dùng thêm --queryformat ‘%{NAME}\n%{SIZE}\n\n’ , chú ý về khuôn dạng của xâu format :

- Tất cả xâu queryformat phải được đặt trong một cặp nháy đơn
- Các thẻ được đặt trong cặp {}, trước mỗi thẻ cần có ký tự %.
- Bạn có thể quy đị nh độ rộng của các trường thông tin cần đưa ra bằng cách thêm một con số n vào trước tên thẻ (sau ký tự %).

Tips : Nhiều khi bạn không rõ có bao nhiêu loại thẻ l\và tên của chúng thế nào, hãy dùng rpm -querytag . Sẽ có rất nhiều thẻ hữu dụng, hãy thử lệnh đó.

Tips : Bạn cần tì m một số gói có một xâu nào đó trong tên, chẳng hạn cần tìm các gói có tên tận cùng là sh, hãy dùng lệnh :

rpm -qa | grep -i sh

Bạn sẽ được ash, bash csh..v.v.

Tips : Dành cho những người muốn xây dựng cơ sở dữ liệu về rpm. Chẳng hạn như lập một bảng hai cột, một cột là tên gói, một cột là thông tin mô tả ngắn gọn (summary hoặc description đều được) :

rpm -qa --queryformat ‘%{NAME}#%{Summary}\n’ > result

Sau đó dùng MS Word convert nội dung tệp result sang table với sapate text at #.

4. Dùng RPM để kiểm tra các gói đã cài đặt

Sau một thời gian vận hành hệ thống, có thể có lúc bạn tự hỏi : "Hệ thống của mì nh có gì trục trặc không nhỉ, có file nào bị lỗi không ? Trạng thái của các phần mềm đang chạy như thế nào ?” Tất cả các vấn đề đó đều được giải quyết ổn thỏa bằng rpm -V.

Cú pháp đầy đủ là :

rpm -V ( --verify, -y) [ các tùy chọ n ]

Các tùy chọn có thể là :

* pkg1 .. pkgN Danh sách các gói cần kiểm tra.
* -p Kiểm tra chí nh file .rpm (không dùng rpmdb).
* -f Kiểm tra gói nào chứa file .
* -a Kiểm tra tất cả các gói.
* -g Kiểm tra các gói thuộc về nhóm .
* --noscripts Không chạy script kiểm tra.
* --nodeps Không kiểm tra tí nh phụ thuộc.
* --nofiles Không kiểm tra thuộc tí nh của file.

Như đã nói ở các phần trước, toàn bộ thông tin về các gói đều được lưu trữ trong cơ sở dữ liệu của rpm. Kể cả là nội dung của từng file ( rpm sử dụng thuật toán MD5 để lưu trữ thông tin về nội dung của một file ). Do đó, mọi sự thay đổi của các gói rpm đều được lưu lại. Lệnh rpm -V sẽ kiểm tra lại tất cả các thông tin đó xem có khớp với ban đầu hay không. Khi có một lỗi nào đó sảy ra, rpm -V sẽ cung cấp các thông tin về lỗi phát hiện được, có các loại lỗi sau :

1. S Kích thước file.
2. M File mode.
3. 5 MD5 check sum.
4. D Số thiết bị (minor và major).
5. L Link file.
6. U Người sở hữu file.
7. G Nhóm sở hữu file.
8. T Thời điểm thay đổi nội dung của file.
9. c File cấu hì nh.
10. missing Thiếu file.
11. Một file cụ thể bị lỗi.

- Một cách kiểm tra khác :

Khi bạn có một file .rpm. Bạn đang phân vân xem có nên cài nó hay không, bạn đang không biết là liệu gói đó có là nguyên bản hay không ? Có bị một tay hacker nào đó thay đổi thông tin cũng như chương trì nh trong đó không ?. Bạn cần đến lệnh sau :

rpm -K (hoặc --checksig) [ các tùy chọ n ]

ở đây chỉ có một tùy chọ n riêng là --nopgp : không kiểm tra chữ ký PGP.

Khi bạn lấy một phần mềm nào đó về, nếu hợp pháp, bạn sẽ được nhà sản xuất cung cấp một file chữ ký số PGP. Hãy lưu thông tin này vào cơ sở dữ liệu của pgp trong hệ thống của bạn, bằng lệnh sau :

pgp -ka RPM-PGP-KEY ./somekeys.pgp

lúc này chữ ký đó đã có trong hệ thống của bạn. Khi bạn gặp một phần mềm nào đó, họ (ai đó) nói rằng đó là phần mềm của một hãng A nổi tiếng nào đó, mà bạn đã có chữ ký này lưu trong hệ thống rồi..Hãy kiểm tra lời họ nói :

rpm -K

Lệnh trên sẽ so sánh chữ ký số pgp của gói với chữ ký lưu trong hệ thống của bạn để xem có đúng là nhà sản xuất nọ đã đóng gói nó không. Tiếp theo nó kiểm tra kích cỡ file, kiểm tra MD5 checksum..để đảm bảo là file .rpm đó không bị hỏng trên đường truyền (qua internet chẳng hạn). Không nhất thiết là mỗi gói đều phải được ký với một chữ ký PGP nào đó, chi tiết hơn một chút về PGP sẽ được đề cập đến ở phần sau.

II- RPM cho người đóng gói phần mềm

Có hai kiểu đóng gói phần mềm, một là đóng gói chương trì nh (binary, hai là đóng gói mã nguồn (source code). Một gói binary là một gói chương trì nh thực sự, cài nó vào hệ thống tức là bạn cài đặt một phần mềm. Còn gói source code là một gói chứa các file mã nguồn của một phần mềm nào đó. Thông thường một gói source code sẽ có một file nén, các file patch, và một file .spec để xây dựng lên gói binary. Chuyện có một gói source code mà xây dựng thành một gói binary là vấn đề cũng cần phải bàn kỹ hơn...

Trước khi đưa ra cú pháp của lệnh đóng gói rpm, cần đề cập đền một số vấn đề sau.

1- Cấu trúc thư mục dành cho quá trì nh đóng gói

RPM cần một số thư mục đặc biệt để phục vụ cho quá trình đóng gói (RedHat ngầm định một thư mục gốc, đó là /usr/src/redhat (Ta sẽ thay đổi điều này, sẽ đề cập đến trong file rpmrc ở phần cuối !!!).

* /usr/src/redhat/SOURCE Chứa các file source code (file nén), các file patch, các file icon. Nếu ta cài đặt một gói source code, nó sẽ ném các file mã nguồn vào đây.

* /usr/src/redhat/SPECS Chứa các file .spec điều khiển quá trình xây dựng gói. Khi cài một gói source code, file .spec của gói binary cũng được copy vào đây.

* /usr/src/redhat/BUILD Thư mục diễn ra qua trình xây dựng gói

* /usr/src/redhat/RPMS Thư mục mà các gói binary được tạo ra sau quá trình xây dựng. Thật ra còn có các thư mục cấp nhỏ hơn là i386, i686, noarch chứa gói ứng với từng hệ thống cụ thể.

* /usr/src/redhat/SRPMS Thư mục mà các gói source code được tạo ra đặt ở đây.

2- File .spec trái tim của quá trì nh đóng gói rpm

Ðể đóng gói được một phần mềm, rpm cần đến một file mô tả tất cả các quá trình nó cần tiến hành, tất cả các thông tin liên quan đến phần mềm đó, file .spec là một file text thông thường (bạn có thể nghĩ file .spec như là cái gì đó gần giống với Makefile).

Có thể chia nó ra thành các phần sau :

Phần thông tin chung

Ðây là phần chứa tất cả các thông tin về gói mà bạn xây dựng. Nó sẽ được hiện ra khi người dùng query với tham số -i nh- đã nói ở trên.

Phần này bao gồm :

Name: Tên gói (tên chương trì nh), tên này sẽ được kèm theo trong tên file rpm.

Version: Số hiệu phiên bản, số này nên gồm một số phiên bản chính (major) một dấu chấm "." và hai số phiên bản nhỏ (minor). Hai số này sẽ được ghép vào trong tên file rpm tạo ra.

Release: Lần phát hành, thường mỗi lần đóng gói người ta lại tăng số này lên (không nhất thiết là phải thay đổi nội dung của phần mềm). Số này cũng được ghép kèm vào tên file rpm.

Group: Tên nhóm, tên này chỉ ra một nhóm của phần mềm đó. Khi người dùng cài gói vào hệ thống của họ , gói sẽ thuộc nhóm đó. Tên nhóm cha phân cách với nhóm con bởi dấu "/". Về lý thuyết thì ta có thể đặt bất cứ cái tên nhóm nào mà ta muốn, nhưng nên chú ý tới cách mà hệ thống sẽ dùng phần mềm này sắp xếp các gói, nhờ đó mà người dùng của chúng ta có thể query dễ dàng các thông tin về gói.

Copyright: Bản quyền, đây là thông tin xác đị nh bản quyền của phần mềm, có GNU hay không, có thương mại hay không...

Summary: Là các thông tin ngắn gọ n nói lên chức năng, đặc điểm của phần mềm, thông thường chỉ nằm trên một dòng (thông thường), nếu có xuống dòng thì cũng không chứa ký tự xuống dòng \n.

Distribution: Nhà phân phối - tên của nhà phân phối bản Linux mà gói này được dùng trong bản Linux đó.

Vendor: Nhà sản xuất - tên của nhà sản xuất phần mềm, là tổ chức sẽ chịu trách nhiệm về sản phẩm này.

Packager: Người đóng gói, hoặc tổ chức thực hiện việc đóng gói phần mềm.

Source: Nơi lưu trữ source code mà người dùng có thể lấy sau này (một URL).

Do đặc tí nh của các chương trình thuộc khuôn khổ GNU, một phần mềm thường có cả source code được cung cấp miễn phí . Ðây thông thường là một địa chỉ url có tận cùng là một tên file .src.rpm. Tên của gói source này phải trùng với tên file đặt trong thư mục /.../SOURCE. Cần chính xác nếu ta đị nh build gói source.

URL: Là đị a chỉ chứa các thông tin liên quan đến phầm mềm này, là nơi người dùng sẽ nhận được các thông tin về phần mềm đó một cách trực tuyến.

%description: Là mô tả chi tiết hơn về gói phần mềm đó, nó có thể chứa nhiều dòng, có thể có các ký tự xuống dòng.

Provides: Các file dùng chung có thể có ích cho các chương trình khác (thư viện động chẳng hạn..

Require: Cần một số gói nào đó có trước, hoặc một số file nhất đị nh nào đó (phần lớn là các thư viện động)..

Conflict: Một hoặc một số chương trì nh nào đó xung đột với phần mềm này, cần phải chỉ ra chúng ở đây.!

Còn rất nhiều tag khác nữa (xem trong maximum rpm trang 397)...

Phần chứa các script

Phần này chia thành 2 loại script khác nhau, một là loại script cần cho quá trình xây dựng gói, hai là script cần cho quá trình cài đặt.

- Các script cần cho quá trì nh đóng gói :

%prep
........

Phần này là các script chuẩn bị cho quá trình đóng gói (nó có thể chứa các macro rất tiện lợi mà rpm cung cấp), nhưng nếu bạn định đóng gói lại một chương trình đang chạy ổn định trong hệ thống thì phần này sẽ không có gì ..! Oái oăm thay, công việc thật sự hiếm khi lại như vậy. Nhiều khi bạn phải đóng gói một phần mềm từ source code .? Sẽ liên quan đến Makefile, config, patch... Ðó là cả một mảng vấn đề lớn,,,? tôi sẽ dần tìm hiểu, sorry! Xin hãy tạm thời chấp nhận ở mức đơn giản này..!

%build
........

Ðã có phần %prep dường như là đủ chỗ cho bạn đặt các script của mình rồi nhưng để cho mọi đoạn mã được rõ ràng, phần này vẫn là các script giúp bạn tiến hành xây dựng gói rpm từ source code. Thông thường chỉ là một lệnh make (càng làm mới càng thấy công cụ make thật quá tuyệt vời).

Nhưng này !! nếu bạn mới tập tành build rpm từ các file đang chạy ổn định trong hệ thống thì bỏ trống nó và cả phần dưới đây nhé ...!* ! Thank and sorry.!

%install
.........

Lại phải cám ơn công cụ make một lần nữa ! ở đây cũng chỉ cần một lệnh make install có lẽ là đủ cho nhiều trường hợp. (Chú ý đọc dòng in ngiêng ở trên!)

%clean
........

Nghe cái tên đã biết nó là gì ..! Thật vậy, nếu trong quá trình đóng gói, bạn có để lại rác rưởi gì thì hãy dọn dẹp đi bằng các script trong phần này.

- Các script dành cho quá trì nh cài đặt gói :

%pre
.......

Phần này là đoạn script cần thi hành trước khi gói thật sự cài đặt. Theo kiểu những chuyên gia dùng UNIX thì hiếm khi có gì phải làm ở phần này. Nhưng nếu chúng ta định cung cấp phần mềm cho enduser thì bạn hãy cứ thoải mái thêm các script thông báo gì đó, hỏi gì đó..ở đây...!!!?

%post
........

Ðoạn script sau phần này sẽ được thực hiện sau khi gói đã được cài đặt thành công. Có nhiều lý do hơn để viết script ở đoạn này, bạn có thể chạy ldconfig để các thư viện động có thể được dùng ngay, có thể cập nhật lại các file cấu hình, các init script, có thể restart lại một số tiến trình deamon nào đó để có thể dùng ngay được mà không cần reboot máy tí nh...

%preun

Ðến một lúc nào đó phần mềm của bạn không được user tin dùng nữa thì họ sẽ loại bỏ nó. Trước khi họ thật sự loại bỏ nó, bạn thích là gì ở đây thì tuỳ...!

%postun

Lúc này thì phần mềm của bạn ở hệ thống đó đã tiêu rồi...!! Bạn cần phải trả lại trạng thái cũ như trước khi gói đó chưa được cài đặt. Hãy nhớ là bạn đã sửa những file nào, đã thêm gì vào đâu, rồi giải quyết hậu quả ở đây...!! Sau đó chớ quên chạy ldconfig nếu như bạn có một thư viện dùng chung nào đó, restart lại một số dịch vụ có liên quan, nói chung là không nên để người dùng phải reboot lại hệ thống.

Ngoài ra còn một phần script nữa là :

%verifyscript

..... là các script mà bạn muốn chạy để thực hiện các công việc ngoài các công việc mà lệnh rpm -V làm..Ví dụ như là kiểm tra nội dung một file cấu hì nh nào đó không phải thuộc gói của bạn..v.v.

Ngoài ra (lại ngoài ra), còn có các macro %setup và %patch do rpm cung cấp giúp bạn tiện lợi hơn trong quá trì nh xây dựng gói rpm

Phần danh sách các file

%files

Phần này bạn phải chỉ rõ danh sách các file mà gói của bạn có, mỗi file trên một dòng.

Chẳng hạn :

/usr/bin/myprogram
/usr/lib/mylib.so

-Nếu có file cấu hình thì thêm %config vào trước tên file đó, ví dụ :

%config /etc/myprogram.conf

-Nếu là file tài liệu thì thêm %doc vào trước tên file đó, ví dụ :

%doc /usr/doc/myprogram/README

Nếu bạn muốn kèm theo cả thuộc tính file, hãy thêm %attr(filemode,owner,group) vào trước tên mỗi file. Thường thì owner,

group đều là root (hiếm khi ai đó đóng gói phần mềm chỉ riêng cho một người dùng cụ thể trên một hệ thống cụ thể..!)

Tips: Bạn có thấy là việc sinh ra một danh sách file loằng ngoằng như vậy là rất chán không ? Tôi chưa tìm hiểu rõ về việc sinh ra danh sách file từ source code (mà tôi đoán là có tool--hãy thử autoconf). Nhưng nếu bạn không chê mẹo nhỏ sau thì hãy dùng :

- Tạo một thư mục temp nào đó, coi nó như là /

- Chép tất cả các file thuộc gói vào trong thư mục temp đó nhưng theo cấu trúc mà nó thật sự sẽ tồn tại trong hệ thống (có /usr/bin, có /etc...)

- Tại thư mục temp, dùng lệnh find > list

- Bạn sẽ có một danh sách các file trong file list. Hãy edit lại một chút bằng cách loại bỏ tất cả các xâu “./” ở đầu mỗi dòng, nhanh thôi mà..! (bằng mc)

- Sau đó dùng tí nh năng chép vào clipboard của mc (^+insert).

- Mở file .spec cũng bằng mc, paste vào sau %files (Shift+insert).

Ðược chứ..!

Viết một thôi một hồi như vậy, bây giờ mới đến lúc bạn cần phải build :

3- Cú pháp lệnh rpm -b :

rpm -b [các tuỳ chọ n]

là một trong các ký tự sau :

* p Thi hành %prep.
* c Thi hành %prep và %build
* i Thi hành %prep, %build và %install
* b Thi hành %prep, %build, %install và đóng gói binary.
* a Thi hành %prep, %build, %install đóng gói cả binary và source
* l Chỉ kiểm tra %files (kiểm tra danh sách file)
* s Chỉ đóng gói source code.

Các tuỳ chọn là :

* --test Chỉ thử đóng gói.
* --clean Dọ n dẹp sau khi đóng gói.
* --sign Ký chữ ký số PGP vào gói.
* --buildroot Thay thư mục BUILD ngầm định.
* --buildarch Ðóng gói riêng cho một hệ thống nhất định (i386, i686, hoặc noarch)
* --buildos Ðóng gói riền cho một hệ điều hành cụ thể (Linux, Sun Solaris...)

Còn rất nhiều phần thú vị nữa chưa viết hết được :

-RPM cho người lập trì nh với các hàm giao tiếp với các ngôn ngữ lập trì nh như C, python..

-Tạo và ký chữ ký số vào gói rpm.....

Tôi sẽ cố gắng cùng một vài người nữa hoàn thành tài liệu này sao cho thật đầy đủ.

No comments: