Phân tích quá trình cài đặt bản RedHat Linux 6.2
và giải pháp cho bản cài đặt Linux Việt Nam.

Báo cáo kỹ thuật Phan Xuân Hiếu - Ðỗ Ðức Huy

A, Phân tích quá trình cài đặt của bản RedHat 6.2:

Những phiên bản gần đây của RedHat hỗ trợ khá nhiều phương thức cài đặt. Ba trong số đó là cài đặt từ ổ đĩa cứng hoặc CDROM có kèm theo một đĩa mềm khởi động, từ CDROM, và từ mạng (NFS, FTP, HTTP). Trong phạm vi báo cáo này chúng tôi chỉ đề cập đến hai phương thức đầu.

I, Dùng đĩa mềm khởi động, sau đó cài phần còn lại trên đĩa cứng hoặc trên đĩa CDROM:

1, Tạo đĩa mềm khởi động:

Dùng một đĩa mềm và đĩa CDROM Redhat 6.2 để tạo đĩa khởi động cài đặt như sau:

- Ðưa đĩa CDROM vào ỗ đĩa (giã sử đối với máy của bạn là ổ E). Sau đó chuyển thư mục hiện thời thành "E:\dosutils>"

- Thực hiện gõ lệnh sau: "E:\dosutils> rawrite"

- Ðược hỏi đường dẫn tới ảnh của trình khởi động thì gõ đường dẫn như sau: "..\images\boot.img" ("..\images\bootnet.img" đối với đĩa mềm khởi động cài đặt từ mạng)

- Ðược hỏi ỗ đĩa làm đĩa khởi động thì trả lời như sau: "A:"

Ðĩa mềm hiện tại có các file sau: boot.img, expert.img, general.img, param.img, rescue.img, snake.img, ldlinux.sys, syslinux.cfg, vmlinuz và initrd.img. Trong quá trình phân tích, chúng tôi sẽ đề cập đến vai trò của những file này.

2, Phân tích:

- Ðặt chế độ khởi động từ đĩa mềm.

- Sau khi boot sector đĩa mềm được nạp, nó tiến hành nạp file "ldlinux.sys". file này có dữ liệu nằm ở các file: boot.img, expert.img, general.img, param.img, rescue.img, snake.img và file cấu hình là syslinux.cfg có nội dung như sau:

default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 general.msg
F3 expert.msg
F4 param.msg
F5 rescue.msg
F7 snake.msg
label linux
kernel vmlinuz
append initrd=initrd.img local
label text
kernel vmlinuz
append initrd=initrd.img local text
label expert
kernel vmlinuz
append expert initrd=initrd.img local
label ks
kernel vmlinuz
append ks initrd=initrd.img local

Trong file này có bốn "lối vào" bắt đầu từ chữ "label" đại diện cho bốn kiểu cài đặt khác nhau:

- Kiểu "linux" là kiểu cài đặt bình thường: Linux installer sẽ cố gắng khởi động cài đặt ở chế độ đồ hoạ. Chỉ khi các tiêu chuẩn phần cứng không phù hợp, Linux installer mới chuyển sang chế độ văn bản.

- Kiểu "text" chỉ đơn thuần cài đặt theo mode văn bản.

- Kiểu "expert" dành cho những người "sành điệu" về Linux

- Kiểu "ks" (kickstart) cho phép người dùng cài đặt theo một file cấu hình định sẵn, cách này phù hợp cho những người ưa nhẹ nhàng.

Sau khi file "ldlinux.sys" được nạp và thi hành, nó tiến hành nạp ramdisk và nhân của Linux (Linux kernel).

- Kernel: Ðể cài đặt được Linux installer phải tạo cho mình một môi trường linux tối thiểu, do đó nhân của Linux nhất thiết phải được nạp vào đầu tiên. Cấu tạo của bộ nhân này gọn gàng nhưng phải đủ tính tuỳ biến để hiểu được cấu trúc phần cứng của máy cần cài đặt (như cấu trúc của chip vi xử lý, bộ đồng xử lý .v.v.). Bộ nhân này được nén và chứa trong đĩa mềm khởi động và chính là file "vmlinuz" (nhân này được một gói rpm trong quá trình biên dịch và xây dựng trình cài đặt)

- Sau khi được nạp, nhân tiến hành tạo hệ thống file gốc (root filesystem) cần thiết cho hệ thống hoạt động. Tại thời điểm này, đĩa cứng của chúng ta chưa được định dạng. Như vậy nhất thiết hệ thống phải tạo ít nhất một đĩa ảo trong RAM. Hệ thống file gốc được nén trong file "initrd.img" trên đĩa mềm khởi động. "ldlinux.sys" giải nén, chuyển vào RAM và gắn hệ thống file này làm hệ thống file gốc (root filesystem). Chúng ta có thể tuân theo những bước sau (trên một hệ Linux đã được cài đặt - alive Linux system) để kiểm nghiệm lại xem hệ thống file gốc này được gói gém trong file "initrd.img" như thế nào.

gunzip -dc /tmp/initrd.img > /tmp/initrd.ext2
mkdir mnt/initrd
mount -o loop /tmp/initrd.ext2 /mnt/initrd

Sau các bước này, vào thư mục /mnt/initrd chúng ta sẽ khảo sát được hệ thống file gốc (là một hệ thống file EXT2, chứa một số chương trình, thư viện và file cấu hình tối thiểu dùng cho bước đầu của quá trình cài đặt) như sau:

- ~bin (thư mục liên kết tới /sbin)

- /dev (thư mục chứa một số tối thiểu các file thiết bị đủ cho trình cài đặt) ví dụ: ttyS0-cổng COM1; tty0-console ảo thứ nhất; .v.v.

- /etc (thư mục chứa file cấu hình "passwd" và một số file khác dưới dạng nén như: fonts.cgz, keymaps.gz, lang-table, loader.tr - thư mục này sẽ được bổ sung thêm sau khi ramdisk thứ hai được nạp).

-/modules (thư mục này tại thời điểm này đang rỗng, nó sẽ chứa một số file mô đun dưới dạng *.o sau khi "hdstg2.img" là ảnh ramdisk thứ hai được trình "loader" tải vào).

/proc (thư mục này đang rỗng, nó chỉ hoạt động khi hệ thống cài đặt hoạt động thực sự).

/sbin (Chứa các file sau:

+ init: chính là trình "init", nó được thi hành đầu tiên sau khi nhân và ramdisk được nạp vào.

+ loader: đây là trình được gọi bởi trình "init". Chúng ta sẽ còn bàn nhiều đến trình "loader" này trong các phần sau.

+ insmod: (insert modules) là file liên kết trỏ đến "loader", có nhiệm vụ lắp ráp các mô đun vào nhân.

+ rmmod: (remove modules) là file liên kết trỏ đến "loader", có nhiệm vụ tháo bỏ các mô đun không cần thiết ra khỏi nhân.

+ modprobe: (modules probe) là trình dò tìm các mô đun và nó cũng là file liên kết tới "loader".

+ sh: (shell) là một hệ vỏ. Nó là file liên kết trỏ đến /usr/bin/sh và chỉ tồn tại thực sự khi hệ thống ramdisk thứ hai được nạp vào (hdstg2.img).

- /tmp (là một thư mục rỗng, nó thực sự được dùng khi trình cài đặt hoạt động).

- .profile (là một file chứa thông tin cho biến môi trường PATH, biến môi trường này thực sự được dùng khi trình cài đặt hoạt động).

- linuxrc (là một file liên kết đến /sbin/init. Nói đúng ra, trước khi trình "init" được kích hoạt thì file này đã được thi hành.

Trong hệ thống khác, file này có thể là một shell script, một executable file hoặc một file liên kết. Và như vậy trong trường hợp này, trình "init" của chúng ta được thi hành nhờ file liên kết này chứ không phải được thi hành một cách trực tiếp). Chúng tôi sẽ trình bày cách biên dịch và tạo file "initrd.img" trong phần "Giải pháp cho bản cài đặt Linux Việt Nam".

Sau khi nạp nhân và khởi tạo hệ thống file gốc ở trong đĩa ảo RAM (ramdisk), "ldlinux.sys" trao hệ thống cho nhân.

- Như thường lệ, nhân khởi tạo tiến trình đầu tiên của hệ thống /sbin/init. Nhưng các bạn đừng nhầm tiến trình "init" này với tiến trình "init" trên một hệ Linux đã được cài đặt tuy chúng có cùng tên gọi và cùng đường dẫn trên hệ thống file gốc. Nhân hoàn toàn không biết được sự khác nhau này và cứ gọi /sbin/init. Mã nguồn của trình "init" được viết bằng ngôn ngữ C và được RedHat cung cấp trong đĩa cài đặt CD RedHat 6.2 ở thư mục sau: /misc/src/anaconda/loader/init.c . Chúng tôi sẽ nêu cách biên dịch file này trong phần "Giải pháp cho bản cài đặt Linux Việt Nam".

- Sau khi được khởi tạo, "init" bắt đầu khởi tạo tiến trình"/sbin/loader". Tiến trình này làm một số công việc như đưa ra các hộp hội thoại cho phép người dùng chọn ngôn ngữ cài đặt, kiểu bàn phím.v.v. Sau đó "loader" hỏi người dùng dữ liệu cài đặt (các gói rpm và file cấu hình) nằm trên CDROM hay trên đĩa cứng. Người dùng có thể chọn một trong hai tuỳ theo nhu cầu của mình nhưng hai cách chọn đi theo hai hướng hoàn toàn khác nhau. Phần này, chúng tôi chỉ trình bày tiếp kịch bản cài đặt của phần còn lại trên đĩa cứng; Tuỳ chọn trên đĩa CDROM chúng tôi sẽ kết hợp trình bày trong phần "Cài đặt từ CDROM". Mã nguồn của "loader" ở /misc/src/anaconda/loader/loader.c

Sau khi chọn phần còn lại nằm trên đĩa cứng, "loader" yêu cầu bạn chỉ ra phân vùng và thư mục chứa hai thư mục sau: /RedHat/RPMS và /RedHat/base. Nếu thông tin bạn trả lời được "loader" chấp nhận thì quá trình cài đặt tiếp tục như sau.

Như chúng ta đã biết file "initrd.img" (nằm trên đĩa mềm khởi động) là ảnh của một hệ thống file EXT2 được "ldlinux.sys" nạp vào RAM và trở thành hệ thống file gốc. Hệ thống file gốc này rất "gọn gàng" và rõ ràng là không đủ dùng cho cả quá trình cài đặt, vì vậy cần được bổ sung.

Quá trình bổ sung này xảy ra ngay sau khi "loader" chấp nhận thông tin của bạn về phân vùng và thư mục chứa phần còn lại của trình cài đặt.

- "loader" tìm trong thư mục /RedHat/base file: "hdstg2.img"( là file "netstg2.img" đối với quá trình cài đặt từ mạng). File này tương tự như "initrd.img". Nó cũng chứa một hệ thống file EXT2 dưới dạng nén. áp dụng các bước như đã làm với "initrd.img" để giải nén "hdstg2.img", bạn sẽ thấy được hệ thống file này chứa những gì.

Hệ thống file này là phần bổ sung cho hệ thống file gốc đang nằm trong RAM. Các thư viện, các module, các chương trình người dùng, các file dữ liệu được nén trong các hệ thống file này dưới dạng các đuôi ".cgz". Nếu bạn có một file "filename.cgz" nằm trên thư mục /tmp, các bước sau sẽ giúp bạn xem xét trong file nén này chứa những thứ gì:

gunzip -dc /tmp/filename.cgz > /tmp/filename.cpio
mkdir /lists
cd /lists
cpio -idumv < /tmp/filename.cpio

Nội dung của "hdstg2.img" như sau:

- /etc (thư mục này bổ sung cho thư mục /etc trong hệ thống file gốc "initrd.img". Nó chứa một số file như group, services, protocols, passwd, .v.v.).

- /lib (thư mục chứa một số thư viện cần thiết).

- /modules (thư mục chứa một số mô đun hỗ trợ mạng, đó là các trình điều khiển card mạng. Các mô đun này được gói trong file modules.cgz và danh sách của chúng trong file module-info).

- /usr (đây là thư mục rất phong phú, hỗ trợ nhiều nhất cho trình cài đặt, trong thư mục này chứa các thư mục con như sau)

- /bin (thư mục chứa các file như thi hành).

- /lib (thư mục chứa các thư viện cần thiết để chạy trình cài đặt, các file còn lại của trình anaconda cũng được chứa ở đây, trong một file nén có tên là anaconda.cgz).

- /sbin (là thư mục chứa một số file thi hành được dành cho hệ thống, tuy nhiên nó cũng được gói gém trong một file có tên là sbin.cgz).

- /share (thư mục dùng chung cho tất cả các tiến trình của trình cài đặt. Nó chứa các hai thư mục con là kudzu và zoneinfo-chứa các thông tin về các vùng trên thế giới cho phép người dùng chọn vùng địa lý).

* Chúng ta tạm thời bàn sang vấn đề khác một chút:

Bản cài đặt RedHat được phân phối có kèm theo mã nguồn của chương trình cài đặt và mã nguồn này được viết dưới các ngôn ngữ C, hợp ngữ, shell scripts, perl, awk, m4 và python (python là một trình thông dịch vừa mang tính chất của perl, vừa mang tính chất hướng đối tượng của C++ và Java). Hầu hết các hỗ trợ về giao diện ở đồ hoạ lẫn văn bản đều được viết bởi python (tất nhiên python phải nhập khẩu một số hàm, thư viện từ hệ thống X-Window (giống như các hàm thư viện API trong MS-Windows). Ðối với cài đặt từ ổ đĩa cứng, giao diện cài đặt được thi hành bởi các chương trình python viết cho mode văn bản như text.py .v.v. Ðối với cài đặt từ đĩa CDROM thì python hỗ trợ đồ hoạ và điển hình là "gui.py". Anaconda là tên gọi của một trình cài đặt ở mức cao nhất của bản RedHat 6.2 được viết chủ yếu bằng shell scripts và python.

Trở lại tiến trình cài đặt:

Anaconda là trình cài đặt ở mức cao nhất. Nó nhập khẩu giao diện từ một vài mô đun. Hiện tại, kiểu cài đặt Text và GUI đã được thi hành.

Phần giao diện InstallInterface thi hành phương thức "run" để thu thập các thông tin cần thiết cho việc cài đặt. Ngay sau khi việc thu thập thông tin kết thúc, đối tượng ToDo thi hành phương thức ToDo::doInstall() để tiến hành cài đặt. Tuy nhiên, phương thức doInstall() được thi hành theo một luồng riêng biệt (separate thread). Một luồng khác giữ vai trò thông báo với người dùng quá trình cài đặt tiến triển đến đâu qua thanh progressbar, thông báo về thời gian và số package còn lại .v.v.

Trở lại với vấn đề của chúng ta là sau khi "loader" nạp ramdisk thứ hai vào RAM và tiến hành gắn (mount) và liên kết (link) với hệ thống file gốc (là hệ thống file được gói trong "initrd.img"). Chính tại đây mã của anaconda được đưa vào và thi hành. Mã của anaconda được viết chủ yếu bằng python và một phần nhỏ là shell scripts. Sau đây là quá trình tiếp theo anaconda làm.

- "loader" trao gọi thi hành /usr/bin/anaconda. Ðối với trình cài đặt từ đĩa cứng và mạng thì đây là một file shell scripts (đối với trình cài đặt từ CDROM thì đây là một file viết bằng python). Sau khi script này làm một số công việc cần thiết để tích hợp hệ thống file thứ hai vào hệ thống file gốc (một phần công việc này do "loader" đảm nhận), file /usr/bin/anaconda.real được thi hành. File anaconda.real này là một trình viết bằng python và phần lớn quá trình cài đặt bắt đầu từ đây.

- Ngay sau khi chạy, anaconda.real tiến hành kiểm tra hệ thống, thu thập các thông tin cần thiết như: tạo các phân vùng, cấu hinh LILO, tạo tài khoản người dùng Root .v.v. Tất nhiên những công việc này được thực hiện một phần nhờ các thư viện, các trình python khác.

Như đã nói ở trên, phương thức ToDo::doInstall() sẽ đảm nhận việc cài đặt thực sự, tức là thông qua một file cấu hình nào đó phương thức này sẽ mở các gói rpm và sao chép đúng vào phân vùng quy định.

* Chúng ta tạm thời bàn sang vấn đề khác một chút:

Với bản RedHat 6.2, có trên 720 gói dữ liệu dưới dạng nén (thường được gọi là các rpm) được chứa trong thư mục: /RedHat/RPMS. Mỗi một gói rpm này thường chứa trọn một ứng dụng, một tiện ích hay một module. Nên nhớ, nhân của chúng ta cũng được gói thành những gói như thế này. Thông tin trong những gói này là file thi hành, thư viện, tài liệu hướng dẫn (documentation) .v.v. và đường dẫn của các file này. Như vậy công việc chính của quá trình cài đặt là mở các gói này để "ném" các file trong đó đến đúng vị trí. Ðể làm được điều này, trình cài đặt thường nắm bắt trước thông tin về các gói được cài thông qua file dữ liệu: /RedHat/base/hdlist. Thông tin trong file này là các header của các gói rpm. Tuỳ theo số gói chúng ta có mà kích thước của file này là lớn hay bé. Chúng tôi sẽ bàn về cách tạo ra file này trong phần "Giải pháp cho bản cài đặt Linux VietNam".

Một file dữ liệu quan trọng nữa là /RedHat/base/comps. Khi cài đặt, nếu bạn chọn kiểu cài đặt là "custom" thì Linux installer sẽ đưa ra cho bạn một danh sách các mục chọ như "X - Window", "KDE", "GNOME", "WWW Server", "Kernel Development".v.v. Mỗi một mục chọn như thế này bao gồm một tập các ứng dụng, các tiện ích .v.v. Ví dụ:

0 Kernel Development {
@ Development
kernel-source
sparc64: egcs64
}

như trên được gọi là một "entry". Số "0" cho biết mục này không được mặc định; tiếp theo là tên của mục chọn "Kernel Development"; Trong cặp ngoặc nhọn là các thành phần bao gồm trong mục chọn này, trong ví dụ trên có ba thành phần trong mục chọn, trong đó có một thành phần lại là một mục chọn khác "Development".

Nhờ vào file dữ liệu này, sự chọn lựa của người dùng và file "hdlist", trình cài đặt hoàn toàn biết được những gói rpm được cài đặt và thông tin của những gói đó. Chúng ta hoàn toàn có thể sửa đổi nội dung của file này để có một bản cài đặt như ý muốn.

Sau khi ToDo::doInstall() hoàn thành, điều khiển được trả lại cho trình "init". Trình "init" sau đó gửi hai tín hiệu 15 và 9 cho tất cả các tiến trình khác để kết thúc chúng. Sau đó hàm "main" của trình "init" kết thúc và đến đây trình cài đặt hoàn thành.

II, Cài đặt RedHat 6.2 từ CDROM:

Sau khi sector khởi động của đĩa CD được nạp và trao điều khiển, Một quá trình nạp nhân (vmlinuz) và ramdisk (initrd.img) được thực hiện. Quá trình này hoàn toàn tương tự như khởi động cài đặt từ đĩa mềm.

Sau đó, file /linuxrc (như đã miêu tả ở phần I) được thi hành. Thực ra đây là quá trình nạp tiến trình "init" vì file linuxrc liên kết tới /sbin/init. Tiến trình "init" tiếp đó lại thi hành tiến trình "loader" ở thư mục /sbin. Chính thời điểm này tạo ra sự khác biệt giữa cài đặt từ đĩa cứng và từ CD. Tiến trình "loader" có khả năng nhận dạng được bạn đang cài đặt từ thiết bị nào. "loader" có từng phương án cụ thể đối với từng trường hợp và đây chính là câu trả lời cho thắc mắc: "tại sao cài đặt từ đĩa CD thì có giao diện đồ hoạ trong khi cài đặt từ đĩa cứng chỉ ở mode văn bản".

Ðối với cài đặt từ CDROM thì hoàn toàn không có quá trình nạp ramdisk thứ hai (từ "hdstg2.img" - cài đặt từ mạng cũng tồn tại quá trình nạp ramdisk thứ hai nhưng với tên file ảnh là "netstg2.img") như đối với từ đĩa cứng. Thay vào đó "loader" truy cập vào thư mục /RedHat/instimage trên đĩa CD để tiếp tục quá trình cài đặt. Nếu xem xét kỹ thư mục này, bạn sẽ thấy một sự tương ứng gần như 1-1 với "hdstg2.img" (sau khi đã giải nén) ngoại trừ thư mục /RedHat/instimage phong phú hơn nhiều bởi nó hỗ trợ cả cài đặt đồ hoạ. Sau đây là một đoạn mã nguồn viêt bằng C trong hàm "setupCdrom" trong file

/misc/src/anaconda/loader/loader.c:
devMakeInode(kd->known[i].name, "/tmp/cdrom");
if (!doPwMount("/tmp/cdrom", "/mnt/source", "iso9660", 1, 0, NULL,
NULL)) {
if (!needRedHatCD ||
!access("/mnt/source/RedHat/instimage/usr/bin/anaconda",
X_OK)) {
unlink("/mnt/runtime");
symlink("/mnt/source/RedHat/instimage", "/mnt/runtime");
return "dir://mnt/source/.";
}
umount("/mnt/source");
}
unlink("/tmp/cdrom");

Sau khi tiến hành kết gán đĩa CDROM thành công, trình "loader" cũng tiến hành gọi trình "anaconda" để bắt đầu khởi động trình cài đặt. Việc đầu tiên "anaconda" làm là nó cố khởi động chế độ đồ hoạ bằng cách kiểm tra cấu hình phần cứng như card màn hình, màn hình, chuột .v.v. Nếu quá trình kiểm tra thành công, trình "anaconda" sẽ tiến hành cài đặt ở chế độ đồ hoạ. Sau đây là một đoạn mã nguồn (được viết bằng ngôn ngữ python 1.5) khởi động chế độ đồ hoạ:

#
# startup X server is we're not already running under an X
# session
#
if (display_mode == 'g' and not os.environ.has_key('DISPLAY')):
import xserver
try:
if (reconfigOnly == 0): #Nếu cài đặt mới
result = xserver.startX () #Khởi động X mới
else: #Nếu cấu hình lại
result = xserver.start_existing_X () #Dùng hệ thống X đã tồn tại
except RuntimeError:
print "X startup failed, falling back to text mode"
display_mode = 't' #Không khởi động được X, trở về chế độ văn bản
else:
(mouseInfo, x) = (result)
#
# setup links required by graphical mode if installing and verify # display mode
#
if (display_mode == 'g'):
if not test and not localInstall and not reconfigOnly:
for i in ( "imrc", "im_palette.pal", "gtk" ):
try:
os.symlink ("../mnt/source/RedHat/instimage/etc/" + i,
"/etc/" + i)
except:
pass
from gui import InstallInterface #Nhập khẩu trình đồ hoạ
elif (display_mode == 't'):
from text import InstallInterface #Nhập khẩu trình văn bản
else:
sys.exit(1)

Trong đoạn mã nguồn trên đây, bạn thấy có hai phương thức khác nhau được dùng để kích hoạt X Server:

Phương thức thứ nhất: xserver.startX()

Phương thức này được thi hành khi bạn tiến hành cài đặt từ ban đầu tức là bạn cài mới hoặc nâng cấp từ bản đã tồn tại.

Phương thức thứ hai: xserver.start_existing_X()

Phương thức này được thi hành khi hệ thống Linux của bạn đã tồn tại và đây chỉ là quá trình cấu hình lại. Ví dụ bạn muốn cấu hình lại ngôn ngữ, cấu hình lại timezone .v.v.

Lệnh để chạy quá trình "reconfig" như sau:

- Khởi động hệ thống Linux

- Thi hành lệnh: anaconda –reconfig

Sau đó bạn thấy đoạn mã nguồn tiếp theo là:

Nếu kích hoạt được đồ hoạ thì sẽ nhập khẩu (import) giao diện từ thư viện "gui" (cũng được viết bằng python)

from gui import InstallInterface

Nếu không phải cài đặt ở chế độ văn bản:

from text import InstallInterface

Nếu không phải dừng quá trình cài đặt.

Sau khi nhập khẩu giao diện từ "gui" hoặc "text", trình cài đặt bắt đầu đi vào quá trình thu thập thông tin do người dùng đưa vào như thông tin về phân vùng đĩa, thông tin về chuột, bàn phím .v.v. Thực ra mỗi bước thu thập thông tin như thế này trình "anaconda" có thể gọi tới một tiện ích của hệ thống hoặc các file python khác. Ví dụ khi tiến hành phân vùng "anaconda" có thể gọi tới tiện ích "Druid" hoặc "fdisk" tuỳ theo sở thích của người dùng.

Sau khi thu thập đầy đủ thông tin, "anaconda" chuẩn bị thi hành cài đặt. Như đã nói ở trên, phương thức ToDo::doInstall() là phương thức được gọi để chính thức thi hành quá trình cài đặt. Nguồn của lớp ToDo trong được viết bằng python trong đĩa RedHat 6.2 ở đường dẫn sau:

RedHat/instimage/usr/lib/anaconda/todo.py

ở đây, chúng tôi chỉ trích một phần mã nguồn của lớp này. Sau đây là các phương thức được định nghĩa trong lớp ToDo:

- class LogFile: (lớp này dùng để ghi lại các sự kiện trong quá trình cài đặt)

- class NetworkDevice (lớp các thiết bị mạng)

- class Network (lớp này thi hành việc cấu hình mạng trong quá trình cài đặt như địa chỉ IP, SubNetMask .v.v.)

- class Password (lớp này cấu hình việc mã hoá mật khẩu hệ thống như thế nào)

- class Language (lớp này thi hành việc chọn và thiết lập ngôn ngữ, nó đọc thông tin về các ngôn ngữ nó hỗ trợ trong file "lang-table" và tuỳ theo người dùng chọn ngôn ngữ nào để thiết lập font và keyboard theo ngôn ngữ đó)

- class Authentication (lớp này chịu trách nhiệm về mã hoá mật khẩu. Có nhiều phương thức mã hoá như MD5, NIS, Shadow .v.v.)

- class ToDo (đây là lớp chính thức thi hành việc cài đặt, ở phiên bản sau của báo cáo, chúng tôi sẽ trình bày một cách chi tiết cấu tạo và cách thức hoạt động của lớp này)

Sau khi cài đặt thành công, tương tự như quá trình cài đặt từ đĩa cứng, điều khiển được trả về cho trình "init" và phần còn lại thi hành như đã phân tích ở phần trên.

B, Giải pháp cho bản cài đặt Linux Việt Nam:

Một câu hỏi đặt ra là tại sao chúng ta lại phân tích quá trình cài đặt của bản RedHat 6.2 và sau đó đưa ra giải pháp cho bản cài đặt Linux Việt Nam. Câu trả lời rất đơn giản, phần lớn mã nguồn của trình cài đặt RedHat 6.2 được khai thác từ cộng đồng GNU; và nếu là mã nguồn của GNU thì chúng ta có quyền sửa đổi miễn là tôn trọng và tuân theo những nguyên tắc của tổ chức. Những tài nguyên này vô cùng hữu ích trong việc xây dựng một bản cài đặt Linux Việt Nam.

Hầu hết các hãng tung ra bản Linux của mình cũng kèm theo mã nguồn của trình cài đặt bởi không phải họ hào phóng một cách khó hiểu mà họ đang tuân thủ theo những quy định của GNU. Chúng ta có thể dựa vào mã nguồn của trình cài đặt này để thi hành bản cài đặt cho Linux Việt Nam, tuy nhiên công việc này hoàn toàn không đơn giản.

Ðịnh hướng của chúng tôi là với phiên bản đầu tiên:

- Trình cài đặt ở mode văn bản và được việt hoá hoàn toàn.

- Tối ưu hoá các tuỳ chọn để phù hợp với nhu cầu sử dụng của người Việt Nam.

Hiện tại chúng tôi đã đưa được tiếng Việt vào trình cài đặt ở chế độ văn bản, hầu hết các thông báo đã được việt hoá và thay đổi được một số cấu hình cài đặt.

I, Dịch lại trình cài đặt từ mã nguồn.

1, Cấu trúc thư mục và chú thích:

Sau đây là cấu trúc thư mục mã nguồn trong đĩa RedHat 6.2 ở thư mục /misc:

misc
|-- CVS
`-- src (th- mục chứa toàn bộ mã nguồn của trình cài đặt)
|-- anaconda (thư mục chứa trình anaconda)
| |-- balkan (liên quan đến phân vùng đĩa, dos, sun ...)
| |-- collage (trình collage chứa nhiều tiện ích cho trình cài đặt)
| |-- ddcprobe
| |-- docs (tài liệu tham khảo)
| |-- gnome-map
| |-- help
| |-- isys (hầu hết các tiện ích về modules và pci)
| | |-- modutils
| | `-- pci
| |-- iw (hỗ trợ cho trình anaconda ở chế độ đồ hoạ)
| |-- kudzu (trình dò thiết bị phần cứng)
| |-- libfdisk (thư viện của trình fdisk)
| |-- loader (thư mục chứa mã nguồn của trình init, loader ...)
| |-- minislang
| |-- pixmaps (ảnh cho quá trình cài đặt ở chế độ đồ hoạ)
| |-- po (thư mục dành cho việc bản địa hoá trình cài đặt)
| |-- pump (deamon BOOTP và DHCP, dò cấu hình IP để cài đặt từ mạng)
| |-- rpmmodule
| |-- stubs
| |-- textw (hỗ trợ cho trình anaconda ở mode văn bản)
| |-- usr
| `-- utils (một số tiện ích như genhdlist - để tạo file hdlist ...)
`-- trees (chứa các tiện ích và dữ liệu để xây dựng trình cài đặt mới)
|-- boot (tiền thân của boot.img, bootnet.img và pcmcia.img)
|-- eata-dma
|-- eata_dma
|-- fonts (chứa fonts cho chế độ cài đặt từ văn bản iso02, iso09 ...)
|-- gdth
|-- hdimage (tiền thân của hdstg2.img và netstg2.img)
| |-- etc
| |-- lib
| `-- usr
| |-- bin
| |-- lib
| | `-- rpm
| |-- sbin
| `-- share
| |-- kudzu
| `-- zoneinfo
| |-- Europe
| `-- US
|-- hdstg2 (chứa các modules được thêm vào hdstg2.img)
| `-- modules
|-- initrd (tiền thân của initrd.img)
| |-- bin -> sbin
| |-- dev
| | `-- pts
| |-- etc
| | `-- terminfo
| | `-- l
| |-- modules
| |-- proc
| |-- sbin
| `-- tmp
|-- keymaps
|-- local (chứa các modules cho initrd-local.img -> initrd.img)
| `-- modules
|-- netstg2 (chứa các modules được thêm vào netstg2.img)
| `-- modules
|-- network (chứa các modules cho initrd-network.img -> initrd.img)
| `-- modules
|-- paride
|-- pcmcia (chứa các modules cho initrd-pcmcia.img -> initrd.img)
| |-- etc
| | `-- pcmcia
| | `-- cis
| `-- modules
|-- syslinux-1.45 (trình khởi động từ đĩa mềm)
`-- tmp

2, Quá trình biên dịch:

Như chúng ta đã biết, công cụ make hết sức thuận tiện trong việc biên dịch bởi có nó, hầu như công việc biên dịch được thực hiện một cách tự động.

a, Dịch trong thư mục anaconda:

Trong thư mục này ta thực hiện hai lệnh sau:

- make clean (lệnh này có tác dụng xoá tất cả những file nào trong thư mục này được sinh ra bởi lần biên dịch trước đó, vì vậy nó không cần thiết khi dịch lần đầu tiên)

- make all (thi hành tất cả việc biên dịch trong thư mục này). Thực ra có một vài tuỳ chọn như:

+ make install-reconfig (thực hiện biên dịch cho trình anaconda cấu hình lại mà chúng ta có thể chạy trình này từ hệ thống đã tồn tại bằng lệnh anaconda - reconfig

+ make install-hd (thực hiện biên dịch dành cho đĩa cứng)

+ make install (thực hiện biên dịch ở mức tổng quát hơn install-hd)

Tuỳ theo nhu cầu của bạn mà một hay nhiều các tuỳ chọn trên được thi hành.

b, Dịch trong thư mục trees:

Trong thư mục này thực hiện các lệnh sau:

- make clean

- make all (làm những công việc liên quan đến các gói RPM, các thư mục phục vụ cho quá trình cài đặt .v.v.)

"make all" lại được chia ra các bước như sau:

+ update-root, bước này thi hành lệnh upd-instroot trong thư mục anaconda. Như các bạn đã biết, khi tiến hành cài đặt từ ổ đĩa cứng thì hệ thống ramdisk thứ hai được nạp lên từ file /RedHat/base/hdstg2.img; còn khi cài đặt từ đĩa CD thì quá trình thứ hai này được thay bằng quá trình tham chiếu đến thư mục /RedHat/instimage. Ðiều quan trọng là làm sao cập nhật được những thay đổi của người dùng vào hai thư mục này.

Ðầu tiên, hai thư mục này được xoá, sau đó là "công cuộc" xây dựng lại hai thư mục này. Sau đây là đoạn mã nguồn trong file "upd-instroot"

mkdir -p ../trees/hdimage
cd ../trees/hdimage
DEST=$PWD
cd -
mkdir -p ../../../RedHat/instimage
cd ../../../RedHat/instimage
DESTGR=$PWD
cd -
... rm -rf $DEST; mkdir -p $DEST/usr/sbin
rm -rf $DESTGR; mkdir -p $DESTGR/usr/sbin

Không phải tất cả trình cài đặt được biên dịch từ mã nguồn có sẵn trong thư mục /misc. Một số tiện ích và thư viện về đồ hoạ được lấy ra từ các gói RPM và sau đây là một đoạn mã nguồn trong file "upd-instroot" thi hành điều này.

#trình cài đặt nhập khẩu thông tin từ các gói sau đây.

PACKAGES="glibc-2 ldconfig setup e2fsprogs-1 XFree86-libs XFree86-SVGAXFree86-S3 XFree86-S3V XFree86-Mach32 XFree86-Mach64 XFree86-FBDev XFree86-I128 XFree86-3DLabs XFree86-VGA16 XFree86-Sun XFree86-TGA XFree86-75dpi-fonts XFree86-100dpi-fonts XFree86-ISO8859-2 XFree86-ISO8859-9 XFree86-cyrillic-fonts XFree86-3. xpm-3 glib- gtk+- gnome-libs python-1 newt imlib-1 libpng libtiff libjpeg- libtermcap-2 zlib rpm rpm-devel rpm-python ash- bash- pygtk- pygnome- util-linux procps esound-0 audiofile-0 kernel-pcmcia-cs Xconfigurator raidtools- locale-ja open- cpio- tar- fileutils- net-tools- grep- sed- mt-st- gzip- iputils- traceroute- sh-utils- textutils- pine- less- rsh- ncurses- popt mtools- ftp- readline- mount- modutils- specspo"
...
for I in $PACKAGES; do
for J in `ls $SRC/$I* 2> /dev/null`; do
if [ "$I" != "rpm-devel" ]; then
if ! echo $J | egrep "(devel|sparcv9)" > /dev/null; then
RPMS="$RPMS $J"
fi
else
RPMS="$RPMS $J"
fi
done
done
...
for n in $RPMS; do
echo "expanding $n"
if [ $(rpm -qp --qf '%{NAME}' $n) = libc"] ; then
GLIBC=$n
fi
#Thông tin nhập khẩu từ các gói RPM được đưa vào thư mục "hdimage"
#phục vụ cho trình cài đặt khởi động từ đĩa mềm
rpm2cpio $n | (cd $DEST; cpio -E $KEEPFILE --quiet -iumd)
#Thông tin được đưa vào thư mục "instimage" cho cài đặt từ đĩa CD
rpm2cpio $n | (cd $DESTGR; cpio -E $KEEPFILEGR --quiet -iumd)
done

Sau khi quá trình "upd-instroot", hai thư mục này khá hoàn chỉnh, tuy nhiên, chúng chưa sử dụng được ngay.

+ updboot: đây là một shell scripts tạo ra thư mục "initrd" nhằm phục vụ cho quá trình "gói gém" thư mục này thành một "ramdisk image" sau này.

Việc đầu tiên nó làm là xoá thư mục "initrd" cũ. Sau đó tạo một số thư mục và file cần thiết cần thiết.

Một trong những việc quan trọng là sao chep các file đã được dịch ở thư mục /anaconda/loader sang thư mục này và sau đây là một đoạn mã nguồn thi hành điều đó:

#Các file này đã được dịch khi ta thi hành lệnh "make all" ở thư mục anaconda. và

#đây chính là quá trình dịch trình "init" và trình "loader" mà chúng tôi đã đề cập ở

#phần đầu của tài liệu.

SBIN='../anaconda/loader/init
../anaconda/loader/loader-network
../anaconda/loader/loader-local
../anaconda/loader/loader-pcmcia'
...
for n in $SBIN; do #quá trình sao chép thực sự các file trên vào initrd/sbin
file=`eval echo $n`
strip $file
cp -f $file initrd/sbin
done

Tiếp đó là việc tạo ra các file thiết bị như dev/ttyS0, dev/ram, dev/psaux...

Và bước cuối cùng là tạo các thư mục còn lại và tạo ra các liên kết cần thiết. Như vậy, "updboot" đã tạo ra thư mục /misc/src/trees/initrd với những thông tin mới nhất được cập nhật từ thư mục "anaconda" (thư mục này chứa một số file thi hành và thư viện đã được biên dịch thông qua lệnh "make all" trong thư mục "anaconda".

+ updmodules: Cập nhật hệ thống mô đun. Ðến thời điểm này, chúng ta đã tạo và cập nhật ba thư mục là /RedHat/instimage, /misc/src/trees/hdimage và thư mục /misc/src/trees/initrd. Tuy vậy trong các thư mục này vẫn chưa tồn tại các thư mục "modules". Những thư mục này thực sự quan trọng trong quá trình cài đặt, chúng hỗ trợ các thiết bị phần cứng như đĩa cứng, card mạng ...

- make do-make (làm các công việc cuối cùng của quá trình biên dịch như gói gém các file ảnh hỗ trợ quá trình khởi động và cài đặt)

Chúng ta có thể chia nhỏ "make do-make" ra làm các bước sau đây:

+ mkboot: Có ba phương thức cài đặt là "local", "network" và "pcmcia".

Công việc của công đoạn này là gói gém được tất cả các file liên quan đến quá trình nạp ramdisk (initrd.img) đầu tiên vào ba file ảnh sau (trong thư mục /images) tương ứng với ba phương thức cài đặt: "boot.img", "bootnet.img", "pcmcia.img". Tài nguyên để gói gém ba file này là một số file trong thư mục /misc/src/trees/boot (trong đó có file "vmlinuz" là nhân của Linux - nhân này được trích từ gói RPM ở bước "updmodules") và "initrd.img". Sau đây là trích dẫn một số công việc của "mkboot":

Ðể có file "initrd.img", "mkboot" phải gọi tới trình tạo ra file này là "mkinitrd" như sau:

case "$TARGET" in
"boot")
./mkinitrd local - f #chỉ dùng cho cài đặt cục bộ (từ CD hoặc từ đĩa cứng)
;;
"bootnet")
./mkinitrd network - f #dùng cho cài đặt từ mạng
;;

"pcmcia")
./mkinitrd pcmcia - f #dùng cho cài đặt qua thiết bị pcmcia
;;
esac

Chúng tôi sẽ nói rõ cách tạo ra file này trong phần sau.

Ðoạn mã nguồn sau đây làm công việc sao chép (và đổi tên) các file "initrd-local.img", "initrd-network.img", "initrd-pcmcia.img" từ thư mục /misc/src/trees vào thư mục /tmp/mkimage.mnt. Ba file trên đã được trình "mkinitrd" tạo ra.

case "$TARGET" in
"boot")
cp initrd-local.img $MNTPOINT/initrd.img
cat $BASEDIR/syslinux.cfg | sed 's/initrd.img/initrd.img local/' >\
$MNTPOINT/syslinux.cfg
;;
"bootnet")
cp initrd-network.img $MNTPOINT/initrd.img
cat $BASEDIR/syslinux.cfg | sed 's/initrd.img/initrd.img network/' >\
$MNTPOINT/syslinux.cfg
;;
"pcmcia")
cp initrd-pcmcia.img $MNTPOINT/initrd.img
cat $BASEDIR/syslinux.cfg | sed 's/initrd.img/initrd.img pcmcia/' >\
$MNTPOINT/syslinux.cfg
;;
esac

Trong đoạn trên còn thực hiện một công việc nữa là soạn thảo file "syslinux.cfg", file này là file cấu hình của trình "ldlinux.sys" được nạp vào đầu tiên khi khởi động từ ổ đĩa mềm để cài đặt.

Cuối cùng, "mkboot" làm công việc là sao chép kết quả đạt được vào thư mục /images bằng các lệnh sau:

DIR=$(echo $IMAGE | sed 's,/[^/]*$,,')
if [ $LANGDIR != "." ]; then
mkdir -p ${DIR}/${LANGTAG}
fi
cp -av $TMPFILE ${DIR}/${LANGTAG}/${TARGET}.img

+ mkinitrd: trình này gói gém hệ thống ramdisk đầu tiên là "initrd.img".

Ðầu vào của công đoạn này là các file trong thư mục misc/src/trees/initrd, /misc/src/trees/{local, network, pcmcia}. Sau đây là một đoạn mã nguồn trong file "mkinitrd" dùng để tạo hệ thống file ext2 và sao chép các file cần thiết từ các thư mục trên trước khi nén lại.

#tạo hệ thống file ext2 cho initrd.img

echo y | mke2fs -i 8096 -q /tmp/$IMAGE $SIZE > /dev/null 2>/dev/null
mkdir -p $MNTPOINT #tạo điểm gắn
#gắn hệ thống file vào điểm gắn vừa tạo
mount -o loop -t ext2 /tmp/$IMAGE $MNTPOINT
cd $BASEDIR; find . | grep -v "loader-" | cpio --quiet -p $MNTPOINT)
cd $BASEDIR; find . -name $INCLUDELOADER | cpio --quiet -p $MNTPOINT)
cd $TARGET; find . | cpio --quiet -pud $MNTPOINT)
cd $MNTPOINT/sbin; [ loader* != "loader" ] && mv loader* loader)

Sau đó, hệ thống file này được nén lại và ném vào thư mục hiện tại (/trees) bằng lệnh:

gzip -9 < $IMAGE.nogz > $IMAGE

Nếu là gặp file "initrd-local.img" thì file này được sao chép sang thư mục /dosutils/autoboot dưới cái tên "initrd.img" bằng lệnh sau:

if [ $TARGET = "local" ]; then
cp $IMAGE../../../dosutils/autoboot/initrd.img
fi

Ðến đây, công đoạn "mkinitrd" kết thúc.

+ mkstage2: Công đoạn này chủ yếu gói gém hai file là "hdstg2.img" và "netstg2.img". Sau đây là đoạn mã nguồn tạo nên ramdisk thứ hai:

BASEDIR=hdimage
SIZE=4096
MNTPOINT=/tmp/mkimage.mnt-$$ #đường dẫn điểm gắn tạm thời
for image in hdstg2 netstg2; do
IMAGE=../../../RedHat/base/${image}.img
IMAGENOGZ=/tmp/`basename $IMAGE`.nogz
rm -f $IMAGENOGZ
rm -f $IMAGE
dd if=/dev/zero of=$IMAGENOGZ bs=1k count=$SIZE
# tạo hệ thống file ext2
mke2fs -i 8096 -q $IMAGENOGZ $SIZE <<EOF
y
EOF
mkdir -p $MNTPOINT #tạo điểm gắn
#gắn hệ thống file vừa mới tạo vào điểm gắn tạm thời
mount -o loop -t ext2 $IMAGENOGZ $MNTPOINT
(cd $BASEDIR; tar cSpf - . ) | (cd $MNTPOINT; tar xSpf -)
mkdir $MNTPOINT/modules
cp $image/modules/* $MNTPOINT/modules
df $MNTPOINT
umount $MNTPOINT
echo -n "gzipping image..."
#nén hệ thống file và đồng thời sao chép sang thư mục /RedHat/base
#dưới hai tên file là "hdstg2.img" và "netstg2.img"
gzip -9 < $IMAGENOGZ > $IMAGE
echo " done."
rm -rf $MNTPOINT $IMAGENOGZ
done

Sau tất cả các bước này, bạn đã có một hệ thống cài đặt mới. Hãy thử với trình cài đặt mới của bạn và xem hiệu ứng của nó như thế nào.

II, Giải pháp cho bản cài đặt Linux Việt Nam.

Có rất nhiều giải pháp khác nhau cho bản cài đặt Linux Việt Nam, tuỳ thuộc vào mục tiêu bản địa hoá Linux như thế nào mà sau đây chúng tôi đưa ra một số giải pháp cụ thể.

1, Bản địa hoá toàn bộ:

Hiện nay Linux hỗ trợ một số ngôn ngữ như tiếng Pháp, tiếng Nga... Những ngôn ngữ này được hỗ trợ ở mức rất sâu có nghĩa là sau khi bạn cài đặt ngôn ngữ này, bạn hoàn toàn có một bản Linux bằng tiếng Pháp hay tiếng Nga gần giống như một bản tiếng Anh vậy. Tất cả các thông báo, các kiết xuất ra màn hình, hệ thống thực đơn...đã được bản địa hoá.

Nếu bản địa hoá Linux theo cách này chúng ta sẽ có một hệ thống hoạt động nhất quán. Tuy nhiên để làm được điều này, chúng ta phải có đầy đủ thông tin về cách bản địa hoá mà những nhà phân phối đã "ngầm" thông tin cho người dùng. Phải nói đây là một công việc rất lớn, chúng ta hầu như phải tìm tòi và hiểu toàn bộ trình cài đặt một cách thấu đáo, đồng thời phải thay thế được các thông báo văn bản trong các gói cài đặt... Tóm lại sau khi cài đặt, chúng ta sẽ có một bản Linux hoàn toàn Việt Nam.

Với cách này, chúng ta đưa tiếng Việt vào trình cài đặt như thế nào? ở mức nào? chúng tôi chưa đưa ra một bản thiết kế kỷ thuật chi tiết ngay giờ đây bởi lực lượng và thời lượng có hạn.

2, Bản địa hoá từng phần.

Theo cách này, việc bản địa hoá được chia thành các phân đoạn. Trong phạm vi báo cáo này, chúng tôi chỉ đề cập đến bản địa hoá trình cài đặt.

a, Sửa đổi cho bản cài đặt trên đĩa cứng và trên mạng:

Ðối với hai cách thức cài đặt này, chúng tôi đã Việt hoá gần như hoàn toàn và cách thức như sau:

+ Chuyển dòng băn bản trong các file sau thành tiếng Việt:

(các bạn có thể gõ trong Windows hoặc gõ VNI trong Linux)

/misc/src/anaconda/loader/*.c
/misc/src/anaconda/libfdisk/*.c
/misc/src/anaconda/*.py
/misc/src/anaconda/textw/*.py

Sau đó thực hiện biên dịch lại trình cài đặt.

+ Như đã nêu ở phần trên, hai file "hdstg2.img" và "netstg2.img" trong thư mục /RedHat/base phục vụ cho quá trình nạp đĩa RAM ảo thứ hai của trình cài đặt từ đĩa cứng và từ mạng. Các bạn dùng dãy lệnh sau để xem xét hai file này (giã sử bạn đã sao chép toàn bộ đĩa RedHat 6.2 vào thư mục /opt/install trong hệ thống của bạn):

cp /opt/install/RedHat/base/hdstg2.img /tmp
gunzip -dc /tmp/hdstg2.img > /tmp/hdstg2.ext2
mkdir /tmp/hdstg2
mount -o loop /tmp/hdstg2.ext2 /tmp/hdstg2

Sau khi thi hành chuổi lệnh này, bạn đã có một hệ thống file ext2 được gắn vào thư mục /tmp/hdstg2.

Nếu xem xét trong thư mục usr/bin, bạn sẽ thấy anaconda là một file shell scripts, chính ở đây chúng ta sẽ nạp tiếng Việt cho trình cài đặt.

Ðể nạp tiếng Việt, bạn cần có hai file: tcvn8x16.psf và straight.acm.

Hai file này tồn tại trong hệ thống sau khi đã cài đặt (trong thư mục /usr/lib/kbd/consolefonts và /usr/lib/kbd/consoletrans) hoặc bạn lấy từ font của vietred. Sao chép hai file này vào thư mục usr/bin của hệ thống file đồng và thực hiện lệnh:

cp /bin/consolechars /tmp/hdstg2/usr/bin

Sau đó thêm vào file anaconda hai dòng lệnh sau (nhớ là ở gần cuối file, chỉ trên lệnh thi hành anaconda.real)

cp /
/usr/bin/consolechars -f /usr/bin/tcvn8x16.psf -m \
/usr/bin/straight.acm

Sau đó tiến hành gói hai lệnh sau:

gzip /tmp/hdstg2.ext2
cp /tmp/hdstg2.ext2.gz /opt/install/RedHat/base/hdstg2.img

Ðối với cài đặt từ mạng, công việc hoàn toàn tương tự ngoại trừ làm việc với file "netstg2.img" thay vì file "hdstg2.img"

Sau đó, dùng đĩa mềm để khởi động cài đặt cục bộ hoặc từ mạng. Bạn sẽ thấy được hiệu ứng của trình cài đặt mới.

b, Sửa đổi cho bản cài đặt từ đĩa CDROM.

Như đã đề cập ở phần trước, cài đặt từ CDROM không có quá trình nạp ramdisk thứ hai như từ đĩa cứng và từ mạng. Sự khác nhau này ảnh hưởng đến cách giải quyết của chúng tôi. Chúng ta hoàn toàn có thể áp dụng cách giải quyết sau đây đối với cài đặt từ đĩa cứng và từ mạng nhưng kết quả nhìn thấy trên màn hình cài đặt không mấy khả quan.

Hẵn bạn còn nhớ những gì chúng tôi đề cập trong phần biên dịch lại hệ thống cài đặt. Một trong những bước tạo ra trình cài đặt mới là "update-root" (nó được "make all" trong thư mục /misc/src/trees gọi).

Tại công đoạn này, "update-root" mở các gói RPM, lấy một số file ở đó rồi ném vào thư mục "instimage" (bao gồm cả thư mục con).

Sau khi bước này thực hiện xong, bạn hãy xem xét trong thư mục sau:

/RedHat/instimage/usr/share/locale, đây chính là thư mục dành cho việc bản địa hoá trình cài đặt (đối với hệ thống đã cài đặt, thư mục bản địa hoá cũng là /usr/share/locale). Ví dụ, bạn muốn bản địa hoá trình cài đặt theo tiếng Pháp, hãy nhìn vào thư mục con: fr/LC_MESSAGES trong thư mục trên. Những file trong thư mục này đều có đuôi mở rộng là ".mo". Những file này chứa các thông báo hiển thị trong quá trình cài đặt theo tiếng Pháp. Hãy lưu tâm đến file "anaconda.mo" (ngoại trừ anaconda.mo tất cả các file ".mo" còn lại được trích từ các gói RPM), file này chứa toàn bộ các thông báo bản địa hoá cho trình cài đặt anaconda. Vậy file này sinh ra bằng cách nào?

File cũng được sinh ra trong công đoạn update-root, nhưng không phải lấy từ các RPM mà lấy từ thư mục sau: /misc/src/anaconda/po

Trong thư mục này ban đầu chỉ chứa các file ".po", sau khi tiến hành bước "make all" trong thư mục anaconda thì các file ".po" trong thư mục po được dịch thành các file ".mo" tương ứng và các file này được sao chép sang /RedHat/instimage. Mỗi nước (được Linux hỗ trợ) có một thư mục con trong thư mục /RedHat/instimage/usr/share/locale và nếu có hỗ trợ tiếng Pháp thì anaconda.mo tương ứng với tiếng Pháp được sao chép sang thư mục /RedHat/instimage/usr/share/locale/fr/LC_MESSAGES.

Trong quá trình cài đặt, nếu bạn chọn ngôn ngữ là tiếng Pháp thì trình anaconda sẽ tham chiếu vào file này và thay hết các thông báo trên màn hình bằng tiếng Pháp.

Trở lại với vấn đề tiếng Việt, bằng cách nào chúng ta tạo được một đĩa CDROM cho khả năng chọn tiếng Việt để cài đặt như các ngôn ngữ khác. Cách làm như sau:

- Vào thư mục misc/src/anaconda, thêm dòng sau vào cuối file:

Vietnamese vi tcvn tcvn vi_VN

- Vào thư mục /usr/lib/kbd/consoletrans đổi file straight-to-font.acm.gz thành file tcvn.acm.gz

- Vào thư mục /usr/lib/kbd/consolefonts đổi file tcvn8x16.psf.gz thành file tcvn.psf.gz

- Vào thư mục misc/src/trees thực hiện lệnh genfonts

- Vào thư mục misc/src/anaconda/po thực hiện lệnh "make all", lệnh này sẽ tạo ra một file có tên là anaconda.pot. Dùng trình soạn thảo VNI để soạn thảo các thông báo tương ứng với tiếng Anh thành tiếng Việt trong file này, sau đó đổi tên thành vi.po

- Thực hiện lệnh "make all" một lần nữa trong thư mục này, file vi.po sẽ được biên dịch thành vi.mo

Nên nhớ, tất cả quá trình này thực hiện trước khi biên dịch lại trình cài đặt. Sau khi biên dịch trình cài đặt, chúng ta đã có một trình cài đặt mới và tại danh sách ngôn ngữ, chúng ta có thể chọn tiếng Việt để cài đặt.

Tuy nhiên, do sự khác biệt giứa cài đặt từ đĩa cứng, mạng và đĩa mềm nên chúng ta không thấy được hiệu ứng mạnh khi dùng trình cài đặt này áp dụng cho đĩa cứng hoặc từ mạng.

Bây giờ lần lượt vào hai thư mục /misc/src/{anaconda, trees} và thực hiện lệnh "make clean" để "thanh lý" những file không cần thiết.

Dùng một đĩa CDROM để ghi trình cài đặt này, chúng ta đã có một đĩa cài đặt Linux Việt Nam (nhưng chỉ trong chế độ văn bản).


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com