1.11 2006-02-16
Giới thiệu Block Device Thiết bị khối - Block Device

Hãy tìm hiểu các quan niệm về đĩa của Gentoo Linux và Linux nói chung, bao gồm các loại hệ tập tin Linux, phân vùng và block device. Khi bạn đã quen với đĩa và hệ tập tin, bạn sẽ được hướng dẫn cách thiết lập phân vùng và hệ tập tin cho Gentoo Linux.

Để bắt đầu, chúng tôi sẽ giới thiệu block device. Block device nổi tiếng nhất có lẽ là cái đại diện cho ổ đĩa SCSI thứ nhất trong hệ thống, tên là /dev/sda.

Các block device kể trên được dùng để giao tiếp với đĩa. Các chương trình có thể dùng các block device này để thao tác với đĩa mà không cần biết đĩa bạn là IDE, SCSI hay cái gì khác. Chương trình chỉ cần xem đĩa như một loạt các khối liên tục,mỗi khối 512 byte, có thể truy cập ngẫu nhiên.

Phân vùng - Partition

Mặc dù theo lý thuyết chúng ta có thể sử dụng toàn bộ đĩa cứng làm một vùng để chứa hệ thống Linux, Tuy nhiên trong thực tế thì không bao giờ sử dụng như vậy, thay vào đó, ổ đĩa cứng sẽ được chia thành các thiết bị khối nhỏ hơn, dễ quản lý hơn. Trên hệ thống x86, chúng được gọi là các phân vùng - partition.

Thiết kế mô hình phân vùng Bao nhiêu và bao lớn?

Số lượng phân vùng phụ thuộc nhiều vào môi trường của bạn. Ví dụ, nếu bạn có rất nhiều người dùng, bạn sẽ muốn dùng một phân vùng riêng cho /home để tăng cường an ninh và dễ sao lưu. Nếu bạn cài đặt Gentoo làm mail server, bạn nên dùng phân vùng riêng cho /var vì thư từ được lưu trong /var. Một lựa chọn hệ tập tin đúng sẽ tăng cường hiệu năng của hệ thống. Game server thường dùng phân vùng riêng cho /opt vì hầu hết các game server được cài vào đây. Lý do tách riêng phân vùng cũng tương tự như với /home: an toàn và sao lưu. Bạn chắc chắn sẽ cần một /usr to: nó không chỉ chứa một lượng lớn các ứng dụng, cây Portage chiếm gần 500 MB, không tính mà nguồn cũng được lưu trong đó.

Như bạn thấy, nó phụ thuộc rất nhiều vào mục đích của bạn. Phân vùng/volume rời có những ưu điểm sau:

  • Bạn có thể chọn loại hệ tập tin thích hợp nhất cho phân vùng/volume của bạn
  • Toàn hệ thống không thể nào hết vùng lưu trữ nếu như một công cụ hư hỏng nào đó cứ liên tục ghi vào phân vùng/volume
  • Nếu cần thiết, có thể tiết kiệm thời gian khi kiểm tra hệ tập tin, vì nhiều hệ tập tin có thể được kiểm tra đồng thời (mặc dù đây là ưu điểm khi có nhiều đĩa hơn là khi dùng nhiều phân vùng)
  • Tăng cường an ninh bằng cách gắn kết các phân vùng dạng chỉ-đọc, nosuid (bỏ qua bit setuid), noexec (không thực thi).

Tuy nhiên, dùng nhiều phân vùng có một bất lợi lớn: nếu cấu hình không đúng, bạn có thể có một hệ thống quá dư đĩa ở một phân vùng và thiếu đĩa trên phân vùng khác. Ngoài ra còn có giới hạn 15 phân vùng trên SCSI và SATA.

Phân hoạch đĩa cứng bằng fdisk trên MIPS Máy SGI: Tạo SGI Disk Label

Mọi đĩa trong SGI đều cần một SGI Disk Label, tương tự như disklabel của Sun và DOS -- Nó lưu thông tin về phân vùng đĩa. Việc tạo SGI Disk Label sẽ tạo hai phân vùng đặc biệt trên đĩa:

  • SGI Volume Header (phân vùng thứ 9): Phân vùng này rất quan trọng. Nó là nơi chứa bootloader, và một số trường hợp chứa cả kernel image.
  • SGI Volume (phân vùng thứ 11): Phân vùng này tương tự như phân vùng thứ ba trên Sun Disklabel "Toàn bộ đĩa". Nó phủ toàn bộ đĩa và không nên đụng đến nó. Nó được dùng cho mục địch đặc biệt chứ không phải để hỗ trợ PROM.
SGI Volume Header phải bắt đầu tại cylinder 0. Thực hiện sai bạn sẽ không thể khởi động từ đĩa.

Sau đây là một ví dụ về fdisk. Hãy đọc và điều chỉnh cho phù hợp với mình...

# fdisk /dev/sda

Command (m for help): x

Expert command (m for help): m
Command action
   b   move beginning of data in a partition
   c   change number of cylinders
   d   print the raw data in the partition table
   e   list extended partitions
   f   fix partition order
   g   create an IRIX (SGI) partition table
   h   change number of heads
   m   print this menu
   p   print the partition table
   q   quit without saving changes
   r   return to main menu
   s   change number of sectors/track
   v   verify the partition table
   w   write table to disk and exit

Expert command (m for help): g
Building a new SGI disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content will be irrecoverably lost.

Expert command (m for help): r

Command (m for help): p

Disk /dev/sda (SGI disk label): 64 heads, 32 sectors, 17482 cylinders
Units = cylinders of 2048 * 512 bytes

----- partitions -----
Pt#     Device  Info     Start       End   Sectors  Id  System
 9:  /dev/sda1               0         4     10240   0  SGI volhdr
11:  /dev/sda2               0     17481  35803136   6  SGI volume
----- Bootinfo -----
Bootfile: /unix
----- Directory Entries -----

Command (m for help):
Nếu đĩa bạn đã có SGI Disklabel rồi, fdisk sẽ không cho phép tạo cái mới. Có hai cách. Một là tạo Sun hoặc MS-DOS disklabel, ghi vào đĩa, và khởi động lại fdisk. Hai là xóa trắng bảng phân vùng bằng lệnh: dd if=/dev/zero of=/dev/sda bs=512 count=1.
Lấy SGI Volume Header để chọn đúng kích thước Bước này cần thiết vì lỗi trong fdisk. Vì vài lý do, volume header không được tạo đúng, kết quả là nó bắt đầu và kết thúc đều ở cylinder 0. Vì thế không thể tạo nhiều phân vùng. Để khắc phục, hãy đọc tiếp.

Giờ SGI Disklabel đã được tạo, bạn có thể tạo các phân vùng. Trong ví dụ trên, chúng ta đã có hai phân vùng. Chúng là những phân vùng đặc biệt như đã đề cập và không nên đụng đến chúng. Ruy nhiên, để cài đăt Gentoo, chúng ta sẽ cần nạp bootloader, và có thể nhiều kernel image trực tiếp từ volume header, vì vẫn chưa có hỗ trợ SGI Bootloader trong Portage. Volume header tự nó có thể chứa tám image với kích thước bất kỳ, tên mỗi image tối đa tám ký tự.

Tiến trình mở rộng volume header không thật dễ hiểu lắm - - cần dùng vài mẹo để thực hiện. Bạn không thể đơn giản xóa đi rồi thêm lại volume header vì fdisk sẽ ứng xử rất kỳ lạ. Trong ví dụ bên dưới, chúng ta sẽ tạo Volume header 50MB kèm với phân vùng /boot 50MB. Mô hình của bạn có thể khác. Mô hình này chỉ mang tính chất minh họa thôi.

Command (m for help): n
Partition number (1-16): 1
First cylinder (5-8682, default 5): 51
 Last cylinder (51-8682, default 8682): 101
(Chú ý fdisk chỉ cho phép phân vùng #1 được tạo lại, bắt đầu tại cylinder  tối thiểu là 5)
(Nếu bạn đã thử xóa và tạo lại SGI Volume theo cách này, bạn sẽ gặp vấn đề tương tự.)
(Trong ví dụ, chúng ta muốn có /boot 50MB, vì vậy chúng ta sẽ bắt đầu tại cylinder 51 (Volume Header cần bắt đầu tại cylinder 0, nhớ không?), và kết thúc tại cylinder 101, coi như được 50MB (+/- 1-5MB))

Command (m for help): d
Partition number (1-16): 9
(Xóa phân vùng #9 (SGI Volume Header))

Command (m for help): n
Partition number (1-16): 9
First cylinder (0-50, default 0): 0
 Last cylinder (0-50, default 50): 50
(Tạo lại phân vùng #9, kết thúc ngay trước phân vùng #1)

Nếu bạn không chắc cách dùng fdisk, hãy đọc phần phân vùng trên Cobalt. Khái niệm hoàn toàn như nhau -- chỉ cần nhớ là đừng đụng vào volume header và phân vùng whole disk.

Khi đã xong, bạn có thể tạo các phân vùng của bạn an toàn. Sau khi đã bố trí xong mọi phân vùng, bảo đảm đặt ID phần vùng swap là 82, Linux Swap. Mặc định nó là 83, Linux Native.

Giờ các phân vùng đã được tạo, hãy tiếp tục với Tạo hệ tập tin.

Máy Cobalt: Phân vùng ổ đĩa

Với máy Cobalt, BOOTRPM cần thấy MS-DOS MBR, vì thế phân vùng ổ cứng khá dễ hiểu -- thật ra, nó hoàn toàn giống cách phân vùng trên máy x86. Tuy nhiên có vài thứ cần nhớ.

  • Cobalt Firmware cần /dev/hda1 là phân vùng Linux được định dạng EXT2 Revision 0. Phân vùng EXT2 Revision 1 sẽ KHÔNG HOẠT ĐỘNG! (Cobalt BOOTROM chỉ hiểu EXT2r0)
  • Phân vùng đã nói phải chứa ELF image được nén bằng gzip, vmlinux.gz trong thư mục gốc của phân vùng, dùng để nạp như kernel

Vì lý do này, chúng tôi đề nghị tạo phân vùng /boot khoảng 20MB định dạng EXT2r0 để cài đặt CoLo và kernel. Nó cho phép bạn chạy những hệ tập tin mới hơn (EXT3 hoặc ReiserFS) trên phân vùng gốc.

Giả định bạn đã tạo /dev/hda1 để mount lát nữa thành phân vùng /boot. Nếu bạn muốn thực hiện với /, bạn sẽ cần nhớ những yêu cầu của PROM.

Vậy hãy tiếp tục.. Để tạo phân vùng, bạn dùng gõ fdisk /dev/hda ở dấu nhắc. Những lệnh chính cần biết là:

  • o: Xoá bảng phân vùng cũ, bắt đầu với bảng phân vùng MS-DOS rỗng
  • n: Tạo phân vùng mới
  • t: Đổi kiểu phân vùng
    • Dùng 82 cho Linux Swap, 83 cho Linux FS
  • d: Xoá phân vùng
  • p: Hiển thị bảng phân vùng
  • q: Thoát -- giữ nguyên bảng phân vùng cũ
  • w: Thoát -- lưu bảng phân vùng mới
# fdisk /dev/hda

The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

(Bắt đầu bằng cách xoá các phân vùng hiện có)
Command (m for help): o
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.


The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

(Giờ kiểm tra bảng phân vùng đã sạch chưa)

Command (m for help): p

Disk /dev/hda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System

(Tạo phân vùng /boot)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1

(Nhấn ENTER để chấp nhận mặc định)

First cylinder (1-19870, default 1):
Last cylinder or +size or +sizeM or +sizeK (1-19870, default 19870): +20M

(và giờ nếu gõ 'p' lần nữa, chúng ta sẽ thấy phân vùng mới)
Command (m for help): p

Disk /dev/hda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1          40       20128+  83  Linux

(Phần còn lại dùng để tạo phân vùng mở rộng)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 2

(Một lần nữa, nhấn ENTER là đủ)

First cylinder (41-19870, default 41):
Using default value 41

(Chúng ta muốn dùng toàn bộ đĩa, vì thế nhấn ENTER lần nữa)
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870):
Using default value 19870

(Giờ, phân vùng / -- Tôi dùng phân vùng riêng cho /usr, /var,
... để / đủ nhỏ. Hãy điều chỉnh theo ý thích của bạn.)

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (41-19870, default 41):<Press ENTER>
Using default value 41
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870): +500M

(... và tương tự cho những phân vùng khác ...)

(Cuối cùng, swap.  Đề nghị ít nhất 250MB swap, thông thường 1GB)

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (17294-19870, default 17294): <Press ENTER>
Using default value 17294
Last cylinder or +size or +sizeM or +sizeK (1011-19870, default 19870): <Press ENTER>
Using default value 19870

(Giờ nếu bạn kiểm tra bảng phân vùng, mọi thứ sẽ ổn trừ một
việc...)

Command (m for help): p

Disk /dev/hda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot      Start         End      Blocks      ID  System
/dev/hda1               1          21       10552+  83  Linux
/dev/hda2              22       19870    10003896    5  Extended
/dev/hda5              22        1037      512032+  83  Linux
/dev/hda6            1038        5101     2048224+  83  Linux
/dev/hda7            5102        9165     2048224+  83  Linux
/dev/hda8            9166       13229     2048224+  83  Linux
/dev/hda9           13230       17293     2048224+  83  Linux
/dev/hda10          17294       19870     1298776+  83  Linux

(Chú ý #10, phân vùng swap vẫn là 83?)

Command (m for help): t
Partition number (1-10): 10
Hex code (type L to list codes): 82
Changed system type of partition 10 to 82 (Linux swap)

(Cần sửa nó... để chắc chắn...)

Command (m for help): p

Disk /dev/hda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot      Start         End      Blocks      ID  System
/dev/hda1               1          21       10552+  83  Linux
/dev/hda2              22       19870    10003896    5  Extended
/dev/hda5              22        1037      512032+  83  Linux
/dev/hda6            1038        5101     2048224+  83  Linux
/dev/hda7            5102        9165     2048224+  83  Linux
/dev/hda8            9166       13229     2048224+  83  Linux
/dev/hda9           13230       17293     2048224+  83  Linux
/dev/hda10          17294       19870     1298776+  82  Linux Swap

(Giờ ghi bảng phân vùng vào đĩa)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

#

Tất cả là thế. Bạn có thể tiếp tục với bước kế: Tạo hệ tập tin.

Tạo các hệ tập tin Giới thiệu

Sau khi đã tạo phân vùng, bạn cần cài hệ tập tin lên đó. Nếu bạn không quan tâm loại hệ tập tin cần chọn và sẵn sàng dùng loại hệ tập tin mặc định như trong sách này thì bạn có thể tiếp tục với Cài hệ tập tin lên phân vùng. Nếu không hãy đọc tiếp để tìm hiểu về những loại phân vùng được hỗ trợ...

Loại hệ tập tin?

Linux kernel hỗ trợ nhiều loại hệ tập tin khác nhau. ReiserFS, Ext2 và ext3 hoạt động ổn định trên MIPS. Những loại khác vẫn còn đang thử nghiệm.

ext2 là hệ tập tin cho Linux, nhưng nó không có metadata journaling, nghĩa là việc kiểm tra hệ tập tin lúc khởi động có thể tốn nhiều thời gian. Có nhiều hệ tập tin mới hơn với tính năng journal để chọn lựa, tốn ít thời gian kiểm tra hơn so với những loại không có tính năng journal. Các hệ tập tin journal giúp tránh đợi lâu lúc khởi động khi hệ tập tin bạn không ổn định.

ext3 là phiên bản ext2 với tính năng journal, giúp phục hồi nhanh kèm theo những đặc điểm khác của tính năng journal như full data, ordered data journaling. ext3 là một lựa chọn tốt và an toàn. Nó còn có tùy chọn hashed b-tree index giúp tăng hiệu năng trong hầu hết trường hợp. Bạn có thể bật index bằng cách thêm -O dir_index vào lệnh mke2fs. Nói tóm lại, ext3 là một lựa chọn xuất sắc.

ReiserFS là hệ tập tin dựa trên B*-tree có hiệu năng tốt và vượt xa cả ext2 và ext3 khi xử lý các tập tin nhỏ (nhỏ hơn 4k), thường vượt gấp 10-15 lần. ReiserFS còn hoạt động tốt trong nhiều điều kiện khác nhau và hỗ trợ metada journal. Với các kernel 2.4.18 trở đi, ReiserFS là lựa chọn tốt để sử dụng hằng ngày cũng như những trường hợp cực kỳ như các hệ tập tin lớn, hệ tập tin chứa nhiều tập tin nhỏ, những tập tin cực lớn và thư mục chứa hàng ngàn tập tin.

XFS là hệ tập tin hỗ trợ metadata journal và một tập tin năng mạnh mẽ, được tối ưu để thích hợp với nhiều điều kiện khác nhau. Chúng tôi chỉ khuyến khích dùng loại hệ tập tin này trên Linux với hệ thống SCSI và/hoặc fibre channel kèm bộ nguồn bảo đảm không bị ngắt. Vì XFS cache in-transit data trong bộ nhớ một cách đáng kể, những chương trình không được thiết kế phù hợp (những chương trình không để ý các phòng ngừa khi ghi tập tin vào đĩa - có vài chương trình như vậy) có thể làm mất một lượng dữ liệu lớn nếu hệ thống bị ngừng đột ngột.

JFS hệ tập tin hiệu suất cao hỗ trợ journal của IBM. Không có đủ các báo cáo tích cực cũng như tiêu cực về tính ổn định của nó vào thời điểm này.

Cài hệ tập tin lên phân vùng

Để tạo hệ tập tin trên phân vùng hoặc volume, cần có các công cụ cho mỗi loại hệ tập tin:

ext2mke2fsext3mke2fs -jreiserfsmkreiserfsxfsmkfs.xfsjfsmkfs.jfs
Hệ tập tin Lệnh tạo

Ví dụ, để định dạng phân vùng boot (/dev/sda1 trong ví dụ này) dùng loại ext2 và phân vùng gốc (/dev/sda3 trong ví dụ này) dùng loại ext3 (như trong ví dụ), bạn dùng:

# mke2fs /dev/sda1
# mke2fs -j /dev/sda3

Bây giờ tạo hệ tập tin cho những phân vùng của bạn.

Nếu cài đặt trên Cobalt server, nhớ rằng /dev/hda1 PHẢI là EXT2 revision 0; Mọi thứ khác (vd, EXT2 revision 1, EXT3, ReiserFS, XFS và những thứ khác) SẼ KHÔNG HOẠT ĐỘNG Bạn có thể định dạng phân vùng bằng lệnh: mke2fs -r 0 /dev/hda1. Ngoài ra cần nhớ rằng arcboot hiện thời không thể đọc bất kỳ hệ tập tin nào trừ EXT2, EXT3 và ISO9660 (phiên bản mới). Vì thế /boot trên máy SGI phải nằm trên phân vùng EXT2 hoặc EXT3.
Kích hoạt phân vùng Swap

mkswap là lệnh để tạo và khởi tạo phân vùng swap:

# mkswap /dev/sda2

Để kích hoạt sử dụng phân vùng swap, dùng swapon:

# swapon /dev/sda2

Giờ hãy tạo và kích hoạt phân vùng swap của bạn bằng những lệnh trên.

Mount (Gắn kết)

Các phân vùng của bạn đã được tạo và định dạng xong. Giờ là lúc để gắn các phân vùng này vào hệ thống. Hãy dùng lệnh mount. Đừng quên tạo những thư mục mount cần thiết trước khi mount các phân vùng bạn đã tạo vào. Như trong ví dụ, chúng tôi sẽ mount phân vùng gốc và phân vùng boot:

# mount /dev/sda3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
Nếu bạn muốn /tmp nằm trên một phân vùng riêng, hãy đảm bảo quyền truy cập của nó sau khi mount: chmod 1777 /mnt/gentoo/tmp. Điều này cũng cần được thực hiện với /var/tmp.

Chúng ta cũng sẽ mount hệ tập tin proc (một hệ tập tin ảo để giao tiếp với kernel) vào /proc. Nhưng trước hết hãy cho các tập tin vào phân vùng.

Hãy tiếp tục với Cài đặt các tập tin cài đặt Gentoo.