Saturday 15 June 2013

Linux Booting Process


Booting process bắt đầu từ BIOS, BIOS sẽ nói cho computer biết là ổ cứng nào available và cố tìm ra active MBR record trên primary hard drive. Sau đó, MBR record chỉ cho booting process biết vị trí /boot partition để thực hiện đọc và kiểm tra khi thực hiện boot loader (trong trường hợp này là GRUB)
Bây giờ việc booting của computer được giao cho GRUB boot loader, nó sẽ load grub.conf file và kernel của hệ thống Linux, sau đó mount root partition (trong trường hợp này là /dev/sda3). Việc thực thi tiếp tục với kernel image nằm trong /boot partition. Kernel được load lên, và thực thi được chuyển cho Gentoo init process (với PID là 1) đã nằm trong partition hệ thống và chịu trách nhiệm cho việc khởi động toàn bộ hệ thống.
Init process sẽ thực hiện sẽ lo mọi thứ để hệ thống có thể boot thành công. Một trong những việc được thực hiện khi khởi động là chạy các script startup (thường trong thư mục /etc/rc.d/), cũng như việc mount các partition được liệt kê trong file /etc/fstab. Một khi mọi thưc được hoàn thành, login window xuất hiện, cho phép chúng ta login vào hệ thống.

BIOS và MBR

 Một trong những thành phần quan trọng của máy tính là BIOS, bắt đầu cho việc booting process ngay sau khi bấm nút turn on máy tính. Nhưng tại sao chúng ta lại cần BIOS? Lí do là vì boot loader nằm trong hard drive, ngay sau khi mở máy, processor không biết bất kì thông tin gì về boot loader nằm trên hard drive. Công việc của BIOS là tìm và load boot loader đã được cài.
Cụ thể hơn, ngay sau khi mở máy, BIOS sẽ thực hiện scan tất cả các thiết bị, xác định memory available,… Sau đó, BIOS scan bootable device được config trong BIOS setting, BIOS tìm thấy hard drive chứa MBR (Master Boot Record), đây cũng là nới chứa primary boot loader code.
Ngay khi tìm thấy MBR record, nó chuyển quyền điều khiển với primary boot loader. Boot loader scan toàn bộ bảng partition được ghi trong MBR record và tìm kiểm active partition, nơi chứa sencondary boot loader.
Let’s dump and explore:
dd if=/dev/sda of=/tmp/mbr.bin bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0358849 s, 14.3 kB/s
Xem thông tin của file mbr:
# file mbr.bin | tr ';' '\n'
mbr.bin: x86 boot sector
 partition 1: ID=0x83, active, starthead 32, startsector 2048, 40103936 sectors
 partition 2: ID=0x5, starthead 254, startsector 40108030, 1832962 sectors, code offset 0x63

Chúng ta có thể thấy được 446 byte đầu dành cho boot loader. Có 4 partion entry, cho chúng ta thấy được tại sao chỉ có thể set up 4 primary partition, nếu muốn thêm chúng ta phải sử dụng logical partition. MBR kết thúc với singature 0x55a.
# xxd /tmp/mbr.bin | sed 's/  .*//g'
0000000: eb63 9010 8ed0 bc00 b0b8 0000 8ed8 8ec0
0000010: fbbe 007c bf00 06b9 0002 f3a4 ea21 0600
0000020: 00be be07 3804 750b 83c6 1081 fefe 0775
0000030: f3eb 16b4 02b0 01bb 007c b280 8a74 018b
0000040: 4c02 cd13 ea00 7c00 00eb fe00 0000 0000
0000050: 0000 0000 0000 0000 0000 0080 0100 0000
0000060: 0000 0000 fffa 9090 f6c2 8075 02b2 80ea
0000070: 747c 0000 31c0 8ed8 8ed0 bc00 20fb a064
0000080: 7c3c ff74 0288 c252 bb17 0480 2703 7406
0000090: be88 7de8 1c01 be05 7cf6 c280 7448 b441
00000a0: bbaa 55cd 135a 5272 3d81 fb55 aa75 3783
00000b0: e101 7432 31c0 8944 0440 8844 ff89 4402
00000c0: c704 1000 668b 1e5c 7c66 895c 0866 8b1e
00000d0: 607c 6689 5c0c c744 0600 70b4 42cd 1372
00000e0: 05bb 0070 eb76 b408 cd13 730d f6c2 800f
00000f0: 84d0 00be 937d e982 0066 0fb6 c688 64ff
0000100: 4066 8944 040f b6d1 c1e2 0288 e888 f440
0000110: 8944 080f b6c2 c0e8 0266 8904 66a1 607c
0000120: 6609 c075 4e66 a15c 7c66 31d2 66f7 3488
0000130: d131 d266 f774 043b 4408 7d37 fec1 88c5
0000140: 30c0 c1e8 0208 c188 d05a 88c6 bb00 708e
0000150: c331 dbb8 0102 cd13 721e 8cc3 601e b900
0000160: 018e db31 f6bf 0080 8ec6 fcf3 a51f 61ff
0000170: 265a 7cbe 8e7d eb03 be9d 7de8 3400 bea2
0000180: 7de8 2e00 cd18 ebfe 4752 5542 2000 4765
0000190: 6f6d 0048 6172 6420 4469 736b 0052 6561
00001a0: 6400 2045 7272 6f72 0d0a 00bb 0100 b40e
00001b0: cd10 ac3c 0075 f4c3 6f1f 0100 0000 8020
00001c0: 2100 83fe ffff 0008 0000 00f0 6302 00fe
00001d0: ffff 05fe ffff feff 6302 02f8 1b00 0000
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa
Secondary boot loader có thể là GRUB hay LILO và Bootmgr cho Window. Công việc của nó là load kernel và boot OS. Primary boot loader tìm active partition và load VBR (Volume Boot Record) vào bộ nhớ. VBR là boot sector có chứa machine code cho các chương trình bootstrapping, thường được hệ điều hành lưu trong các phần khác của device.
Thường có trường hợp install GRUB hoặc LILO boot loader trực tiếp vào MBR, vì nếu chúng ta không làm vậy, BIOS vẫn cần primary bootloader sau đó load secondary one. Nhưng tại sao chúng ta không thể cài GRUB trực tiếp vào MBR như primary boot loader. Đây là thực sự cách mặc định mà GRUB/LILO được cài đặt hiện nay.
Để install GRUB như primary boot loader, ta sẽ install nó trên MBR như sau:
# grub-install --no-floppy /dev/sda
Để install GRUB trên VBR của partition /dev/sda1
# grub-install --no-floppy /dev/sda1
Nhìn vào trong thư mục /boot/grub:
# ls /boot/grub/
default     e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  menu.lst        reiserfs_stage1_5  stage1  stage2.old       ufs2_stage1_5    xfs_stage1_5

device.map  fat_stage1_5   grub.conf     jfs_stage1_5      minix_stage1_5  splash.xpm.gz      stage2  stage2_eltorito  vstafs_stage1_5
ta có thể biết boot loader hỗ trợ những kiểu file system. GRUB supports the following file systems: ext2, DOS FAT16, FAT32, FFS, JFS, ReiserFS, MinixFS, UFS, XFS, VstaFS and Iso9660.