通過grub-install命令把grub安裝到u盤-總結
通過grub-install命令把grub安裝到u盤
②把u盤格式化(我把u盤格式化成FAT、fat32格式了,最後證明也是成功的)。
③開啟linux系統,打開命令行終端。進入root模式,然後輸入命令行:
mount
grub-install --root-directory=/tmp/boot --no-floppy /dev/sdb
註意:上面/dev/sdb是我的u盤,在linux系統裏的盤符吧,那個/dev/sdb3為什麽是“3”。這個因不同的實際情況而不同吧。
總的來說,/dev/sdb就是我的u盤的名字,/dev/sdb3就是我的u盤的一個分區。
④這個時候。你會發現,你的u盤。已經多了一個boot文件夾,裏面有一些內容,這個時候,boot文件夾的路徑是/dev/sdb3/boot/。
⑤把“/boot/grub/grub.conf”和“/boot/grub/splash.xpm.gz”。拷貝到“/dev/sdb3/boot/grub/”以下(也就是“u盤/boot/grub/”)。
⑥然後把/dev/sdb3/boot/grub/grub.conf改動成以下內容:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:
#
#
#
#
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Enterprise Linux Server 1280*1024(3.4.0)
kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=795 fb:on
initrd /boot/initrd.img-3.4.0
title Red Hat Enterprise Linux Server 1600*1200(3.4.0)
root (hd0,0)
kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=858 fb:on
initrd /boot/initrd.img-3.4.0
⑦重新啟動計算機。在BIOS裏。設置為從u盤啟動,就可以。
說明:grub2.0以後支持的是grub.cfg
set default=0 set timeout=5 set gfxmode=1280x1024 menuentry ‘Red Hat Enterprise Linux Server 1280*1024(3.4.0)‘ { set gfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480 linux /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=795 initrd /boot/initrd.img-3.4.0 }
制作步驟:
先用cfdisk 在U盤中,創建個兩個分區,第二個一會兒作為boot分區。
0:mkfs.ext3 /dev/sdc5
1:mount /dev/sdc5 /tmp/boot
2:grub-install --root-directory=/tmp/boot --no-floppy
自己改動一下menu.lst文件吧。這個簡單。
****************************************************************************
以上所有推翻重寫。
須要懂得理論上的知識,才幹做出正確的結果。
****************************************************************************
首先理解引導中U盤引導部分的過程。
1:當BISO通電引導到磁盤時。會檢查MBR區域(MBR:446+DPT:64+ENDFLAG:2=512)
MBR裏面必須存在引導程序,一般會是我們熟悉grub,dos,95dos引導等。否則無法引導。
這裏做個簡要說明:尋常我們將系統安裝硬盤上,通常安裝都是安裝windows,再安裝linux,而通常當安裝linux時。會提示你是否安裝到MBR裏面,或者安裝到你的某個磁盤分區裏面,一般是你的/boot的所在分區。
安裝在MBR,或者某個磁盤分區。這2者之間存在區別。
a:當安裝到MBR時。會將已經存在的Win自己在MBR的引導程序替代,變成GRUB引導。
b:當安裝到某個分區時。會由存在的Win的引導程序,引導到那個分區的Grub,再有Grub引導到各個操作系統。
這就是2者的區別。
win沒有為其他系統考慮過。到了自己的磁盤分區之後。對於引導其他系統,沒有提供能夠直接引導的命令。僅僅能進入後改動它的boot.ini文件。而grub提供命令命令菜單,能夠進行手工引導。
2:grub的制作
筆者發現win僅僅能自己主動識別出U盤的第一個分區,而對於第二個分區無動於衷。
所以做了這種分區方案。
第一個分區用來存儲數據。第二個分區用來放置引導信息,這樣不至於在使用過程中。自己創建的grub的boot分區,被別人勿刪除,或者格式化。
我的1G U盤分區例如以下:
/dev/sdc1
/dev/sdc5
) 用於存儲引導文件。
運行命令
mount /dev/sdc5 /tmp/boot
grub-install --root-directory=/tmp/boot --no-floppy
此處腳下留神。必須講grub安裝到/dev/sdc,否則眼下對於U盤的MBR來講。沒有能夠用的引導程序。
此命令運行後,會在/tmp/boot/文件夾。也就是/dev/sdc5,以下產生文件夾/boot/grub.裏面有*stage*等文件。
最後在/boot/grub 文件夾中建立menu.lst文件。
文件內容例如以下:
timeout
default
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
makeactive
chainloader +1
講一下。假設你用U盤引導後,他會把自己標記為hd0。
而已經安裝在硬盤上的win操作系統覺得自己的宿主硬盤是hd0。此時引導win操作系統時就會造成盤符錯位。
因此我們須要用map進行一下映射轉換。
map 的解釋及使用例如以下:
map TO_DRIVE
映射 驅動器FROM_DRIVE 到TO_DRIVE.
當你鏈式引導向dos一樣的操作系統。而且該系統沒有在第一個驅動器上時,必須進行該映射。
that‘s Ok!
****************************************************************************
隨著我的使用的愈加頻繁。menu.lst上面的內容多了起來。
****************************************************************************
以下分享一下。裏面的內容。首先是文件夾結構。
[email protected]:~# fdisk -l /dev/sdb
Disk /dev/sdb: 1010 MB, 1010826752 bytes
32 heads, 61 sectors/track, 1011 cylinders
Units = cylinders of 1952 * 512 = 999424 bytes
/dev/sdb1
/dev/sdb2
[email protected]:~# mount /dev/sdb2 /tmp/boot/
[email protected]:~# tree -d /tmp/boot
/tmp/boot
|-- boot
|
|-- centos4.4
|-- centos4.4-64
|-- lost+found
`-- ubuntu704
6 directories
以下是menu.lst的內容。
[email protected]:~# cat /tmp/boot/boot/grub/menu.lst
color light-gray/blue
timeout
default
title
map
map
rootnoverify
makeactive
chainloader
title
root
kernel
initrd
boot
title
root
kernel
initrd
boot
title
root
kernel
initrd
boot
註意:
1:成功的關鍵是MBR的內容。能夠用dd if=/dev/sdc of=/tmp/mbr.bin bs=446 count=1 提取 出。
hexdump -C/tmp/mbr.bin 查看
2:有時候MBR會有問題。
用這個命令清零吧。
dd if=/dev/zero of=/dev/sdc bs=446 count=1由於一個是0.97版(grub-legacy),一個是2.02版(grub2)
grub-legacy 沒有 /boot/grub/grub.cfg 這個文件,而是使用 menu.lst 文件。
root (hd0,0)
kernel /boot/vmlinuz-3.10xxx
initrd /boot/initrd-3.10xxx
boot
這個格式是grub格式。或者grub一代
root (hd0,msdos0)
linux /boot/vmlinuz-3.10xxx
initrd /boot/initrd-3.10xxx
boot
這是grub2的寫法
rhel6曾經都採用grub一代,到rhel7則採用grub2模塊化引導管理器
grub和grub2的異同還請參考官方文檔或自行百度!
我的筆記:
系 統:虛擬機RHEL6.4(2.6.32)
裁剪內核:linux-2.6.34
在虛擬機+虛擬硬盤、945主板+USB,均引導內核成功,系統未作復雜裁剪,未作壓縮鏡像
1. linux內核編譯:
詳細步驟:
# tar zxvf linux-2.6.tar.gz -C /usr/src
# cd /usr/src/linux2.6
# make menuconfig
# make
# make modules_install
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6
# make install
對照/boot/grub/grub.cfg文件的改動
2. 安裝啟動盤(U盤、硬盤)
# Fdisk /dev/sdb
#mkfs.ext2 /dev/sdb1
# mkdir /tmp/boot ; mount /dev/sdb1/tmp/boot
# grub-install--root-directory=/tmp/boot --no-floppy /dev/sdb
# cp /boot/grub/grub.conf /tmp/boot/boot/grub/
# cp /boot/grub//boot/grub/splash.xpm.gz /tmp/boot/boot/grub/
# cp /boot/vmlinuz-2.6.34/mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.34.img/mnt/boot/initramfs.img
3. 構建系統文件夾
# mkdir dev proc etc sbin bin lib mntusr
# cp /bin /tmp/boot/
# cp –dpr /dev/{console,fd0.hda,hda8,hda9,hda10,initctl,initrd,kmem,mem,null,ram,ram0,ramdisj,sda,tty1,tty} /tmp/boot/
# cp/etc/{default,ld.so.cache,ld.so.conf,login.defs,fstab,groub,init.d,inittab,issue,modules.conf,mtab,nsswitch.conf,pam.d,profile,rc.d} /tmp/boot/
4. 編輯grub.conf
Default為默認啟動項
Grub2 grub.cfg
set default=0
set timeout=5
set gfxmode=1280x1024
menuentry ‘Red Hat EnterpriseLinux Server 1280*1024(3.4.0)‘ {
setgfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480
linux/boot/vmlinuz-3.4.0 root=/dev/sda1selinux=0 init=/sbin/init vga=795
initrd/boot/initrd.img-3.4.0
}
5. 加入必要的命令
比如:ls
Ldd ls,加入相應的依賴庫文件;ldd ls > 1.txt
6. 改動initrd
又一次編譯內核後,可能加入了自己定義的模塊。就有可能須要改動init文件。而init文件就在initrd中,這裏記錄下操作步驟,以防遺忘。
1. cp /boot/initrd-3.2.img /tmp/mylinux/initrd-3.2.img.gz
這裏之所以進行改名。是由於initrd-3.2.img是經過gzip壓縮過的,所以須要對其解壓,可是gzip對解壓的文件的文件後綴名又有要求。所以就先進行改名。
2. gunzip initrd-3.2.9.img.gz
3. cpio -id < initrd-3.2.9.img
經過以上三步,就在當前文件夾下解壓了initrd文件。從而得到了init文件。
依據自己的需求改動init文件後。通過以下命令又一次生成initrd文件。
4. find . | cpio -H newc -o | gzip -9 > /boot/initrd-3.2.9.img
find . | cpio -H newc -o | gzip -9>../initrd.img-3.4.0
7. 內核加入fb0
mknod /dev/fb0 c 29 0
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices--->
318 31b 35a
1024 1280 1600
8. 加入網絡驅動
# initrd,img/init
echo "0: linuxrunning on initrd.img"
echo "1: linuxrunning on usb ext2 filesystem"
read -p "select:" data
if [ $data ="0" ]; then
echo "0: linux running oninitrd.img selected"
uname -r
insmod lib/modules/3.4.0/kernel/drivers/net/mii.ko
insmod lib/modules/3.4.0/kernel/drivers/net/ethernet/realtek/r8169.ko#加入網絡
insmod lib//modules/3.4.0/kernel/drivers/usb/storage/usb-storage.ko#加入USB
sleep 1
mkdir usb
mount /dev/sda1usb
ifconfig -a
ifconfig eth0192.168.1.88
sleep 1
sh
else
echo "1: linux running on usb ext2filesystem selected"
sleep 1
fi
通過grub-install命令把grub安裝到u盤-總結