archlinux 2009.02硬盘安装DIY
- syrano
- 帖子: 4313
- 注册时间: 2007-10-06 18:40
archlinux 2009.02硬盘安装DIY
转自http://www.linuxsir.org/bbs/thread347396.html
我从2006年开始使用 linux(ubuntu),一直觉得很方便。前些天不小心把linux弄崩了,一直没管。最近刚好有人推荐了archlinux,在windows里面弄了个virtualbox试用了下,简洁干净,感觉真是不错。马上在机器上装。我不喜欢光盘安装,总是怕把光驱读坏了。所以先搜了些硬盘安装的办法,结果全部失败了,呵呵。没办法,那就光盘吧,好不容易把盘子刻好了放进去,出来个No emulation Booting,就停住了。接着搜,有人推荐用u盘安装,弄了下,发现我的主板居然不支持从u盘引导!NND!
所有的方法都搞不定,但是真的挺喜欢这个系统的。想那就只能DIY了。反正以前一直对linux启动的机制不了解,趁这个机会来了解一下也不错。恩,那说做就做。折腾了一下就搞定了,其实挺简单的,得益于arch清晰简洁的启动流程,呵呵。不过说实话,arch的安装体验做的还不是很成熟,搜索的时候看到很多人也问这个,就把他写出来,和大家交流下。
说下我的水平。我用过c,java,python,但是以前对脚本和linux启动一点都不懂,所以文章应该是入门级水平,大家多多帮助哦~
开始吧。
既然arch启动以后能够进到一个livecd的状态,那么它应该完成了一个完整的linux启动过程。linux的启动有两阶段,第一是由grub把控制权交给指定的kernel和initrd文件,先加载一个临时的小系统;第二,再通过kernel和initrd的努力把完整的linux系统启动出来。 kernel是内核文件,initrd是个临时的小文件系统,它被加载进入内存,里面存着一些引导出真正的系统需要的代码和工具。光盘里面等价于 initrd的是archiso_pata.img文件,我自然要从它下手。
找个可以用的linux系统,因为需要里面的工具。我的做法是用我virtualbox里面的那个arch,当然如果有个linux当然更好。从光盘里面把boot文件夹解压出来。
1.解压archiso_pata.img文件
archiso_pata.img文件在光盘的/boot文件夹里面,取得它,然后操作步骤是:
代码:
mkdir initrdHack
cp archiso_pata.img initrdHack/archiso_pata.img.gz
cd initrdHack
gzip -d archiso_pata.img.gz
cpio -i --no-absolute-filenames < archiso_pata.img
rm archiso_pata.img
archiso_pata.img 文件是个先用gz格式压缩了的,再用cpio压缩了的文件系统。这里用上面的命令把它解开,注意在执行cpio命令的时候一定要加--no- absolute-filenames,如果不加,所有的文件会覆盖根文件系统,你用的那个linux就挂啦~
成功以后,initrdHack文件夹里面有这一个基本的文件系统的目录结构。
启动的流程差不多是启动时执行init脚本,它里面有引导到真正系统的全部流程。大概看看这个脚本,看到第66行就知道,在启动过程中执行了hooks文件夹里面一系列hook文件来加载一系列的准备操作。我们看看hooks文件夹里面会发现有个archiso文件。它就是关键。
2.修改archiso这个hook文件
读读archiso文件,可以知道它的工作正是找到光驱,然后把它里面的内容挂载,再启动系统。具体看到第71-83行
代码:
for cdrom in /dev/hd[a-z] /dev/sr[0-9]* /dev/scd[a-z] /dev/sg[0-9]*; do
[ ! -e "${cdrom}" ] && continue
if mount -r -t iso9660 "${cdrom}" /bootmnt >/dev/null 2>&1; then
if [ -e "/bootmnt/isomounts" ]; then
found=1
msg "${cdrom}"
break
fi
else
echo "Failed to mount ${cdrom}"
fi
[ ${found} -eq 0 ] && umount /bootmnt >/dev/null 2>&1
done
这段说的是先找到光驱,然后挂在它到虚拟系统里面的/bootmnt,如果光盘里面有isomounts文件,就挂成功了,把found置为1;要不然就错了。这点代码是光盘启动的核心。那么如果把它改成在硬盘里找到iso文件,然后把它挂在/bootmnt里面,就可以实现硬盘启动了。很简单吧。
改吧,先把这段注释掉。我把2009.02文件命名为archlinux.iso,放在我的第三个分区上,就是sda3或者hda3上,它的文件系统是fat32。我写的代码是:
代码:
/bin/modprobe -q loop >/dev/null 2>&1 #加载loop模块,loop模块表示可以把文件看成设备,加载iso文件需要它
for harddisk in /dev/hda3 /dev/sda3 #找到硬盘
do
[ ! -e "${harddisk}" ] && continue
/bin/mkdir /hard
mount -t vfat "${harddisk}" /hard #挂载含有iso文件的硬盘分区
/bin/losetup /dev/loop0 /hard/archlinux.iso #把iso文件连接到loop0环路设备
mount -r -t iso9660 /dev/loop0 /bootmnt #挂载环路设备
found=1 #把found置为1表示找到光盘
break
done
这里有个小地方要注意就是mount的写法。initrd里面的这些小工具和平时使用的有些不同的,里面的工具一般功能都很简单。如果把加载iso文件的过程写成一句:
代码:
mount -t iso9660 -o loop ...
在我的电脑上是不行,必须断成两段,自己连接loop环路设备。
最后一点要改的就是,这里我们已经使用了0号环路设备loop0,而且它要一直被使用,所以后面如果还要使用环路设备,应该从loop1开始。在archiso里面往后找,看到这句
代码:
export LOOP_NUM="0"
自然要改成
代码:
export LOOP_NUM="1" #loop0被占了,从1开始。
3. 生成新的archiso_pata.img
搞定了archiso这个hook,清除掉hooks文件夹下面的临时文件,然后回到initrdHack目录里执行:
代码:
find . | cpio -o -H newc > ../archiso_pata.img
cd ..
gzip -c archiso_pata.img > archiso_pata.img.gz
mv archiso_pata.img.gz archiso_pata.img
cpio接受目录树的文件列表,把他们压缩到一个img文件里面。然后把这个img文件用gzip压缩,最后重新再命名成img文件。这好像是initrd文件的约定。
注意find . | cpio -o -H newc > ../archiso_pata.img 这句里我把生成的文件放在了外面而不是直接放在里面,放里面生成的文件的大小是不对的。不过我还不知道原因,有同学知道可以告诉我阿。
4. 看看搞定没有
把生成的新archiso_pata.img连同VMLINZ26内核文件和archlinux.iso一起放在sda3根目录下面。VMLINZ26也放在光盘里的/boot文件夹下面。
找个可以用的grub,进去的时候点c,进入命令行,输入
代码:
root (hd0,2) #sda3是hd(0,2)
kernel /VMLINZ26
initrd /archiso_pata.img
就搞定拉~
我学习bash才几天,只能看懂,但是写起来很困难,呵呵。上面的代码很基础,只能说明原理,他们只针对我的电脑,我也不知道怎么写出更好的通用的initrd文件,各位要是有好的建议可以分享下阿~
我从2006年开始使用 linux(ubuntu),一直觉得很方便。前些天不小心把linux弄崩了,一直没管。最近刚好有人推荐了archlinux,在windows里面弄了个virtualbox试用了下,简洁干净,感觉真是不错。马上在机器上装。我不喜欢光盘安装,总是怕把光驱读坏了。所以先搜了些硬盘安装的办法,结果全部失败了,呵呵。没办法,那就光盘吧,好不容易把盘子刻好了放进去,出来个No emulation Booting,就停住了。接着搜,有人推荐用u盘安装,弄了下,发现我的主板居然不支持从u盘引导!NND!
所有的方法都搞不定,但是真的挺喜欢这个系统的。想那就只能DIY了。反正以前一直对linux启动的机制不了解,趁这个机会来了解一下也不错。恩,那说做就做。折腾了一下就搞定了,其实挺简单的,得益于arch清晰简洁的启动流程,呵呵。不过说实话,arch的安装体验做的还不是很成熟,搜索的时候看到很多人也问这个,就把他写出来,和大家交流下。
说下我的水平。我用过c,java,python,但是以前对脚本和linux启动一点都不懂,所以文章应该是入门级水平,大家多多帮助哦~
开始吧。
既然arch启动以后能够进到一个livecd的状态,那么它应该完成了一个完整的linux启动过程。linux的启动有两阶段,第一是由grub把控制权交给指定的kernel和initrd文件,先加载一个临时的小系统;第二,再通过kernel和initrd的努力把完整的linux系统启动出来。 kernel是内核文件,initrd是个临时的小文件系统,它被加载进入内存,里面存着一些引导出真正的系统需要的代码和工具。光盘里面等价于 initrd的是archiso_pata.img文件,我自然要从它下手。
找个可以用的linux系统,因为需要里面的工具。我的做法是用我virtualbox里面的那个arch,当然如果有个linux当然更好。从光盘里面把boot文件夹解压出来。
1.解压archiso_pata.img文件
archiso_pata.img文件在光盘的/boot文件夹里面,取得它,然后操作步骤是:
代码:
mkdir initrdHack
cp archiso_pata.img initrdHack/archiso_pata.img.gz
cd initrdHack
gzip -d archiso_pata.img.gz
cpio -i --no-absolute-filenames < archiso_pata.img
rm archiso_pata.img
archiso_pata.img 文件是个先用gz格式压缩了的,再用cpio压缩了的文件系统。这里用上面的命令把它解开,注意在执行cpio命令的时候一定要加--no- absolute-filenames,如果不加,所有的文件会覆盖根文件系统,你用的那个linux就挂啦~
成功以后,initrdHack文件夹里面有这一个基本的文件系统的目录结构。
启动的流程差不多是启动时执行init脚本,它里面有引导到真正系统的全部流程。大概看看这个脚本,看到第66行就知道,在启动过程中执行了hooks文件夹里面一系列hook文件来加载一系列的准备操作。我们看看hooks文件夹里面会发现有个archiso文件。它就是关键。
2.修改archiso这个hook文件
读读archiso文件,可以知道它的工作正是找到光驱,然后把它里面的内容挂载,再启动系统。具体看到第71-83行
代码:
for cdrom in /dev/hd[a-z] /dev/sr[0-9]* /dev/scd[a-z] /dev/sg[0-9]*; do
[ ! -e "${cdrom}" ] && continue
if mount -r -t iso9660 "${cdrom}" /bootmnt >/dev/null 2>&1; then
if [ -e "/bootmnt/isomounts" ]; then
found=1
msg "${cdrom}"
break
fi
else
echo "Failed to mount ${cdrom}"
fi
[ ${found} -eq 0 ] && umount /bootmnt >/dev/null 2>&1
done
这段说的是先找到光驱,然后挂在它到虚拟系统里面的/bootmnt,如果光盘里面有isomounts文件,就挂成功了,把found置为1;要不然就错了。这点代码是光盘启动的核心。那么如果把它改成在硬盘里找到iso文件,然后把它挂在/bootmnt里面,就可以实现硬盘启动了。很简单吧。
改吧,先把这段注释掉。我把2009.02文件命名为archlinux.iso,放在我的第三个分区上,就是sda3或者hda3上,它的文件系统是fat32。我写的代码是:
代码:
/bin/modprobe -q loop >/dev/null 2>&1 #加载loop模块,loop模块表示可以把文件看成设备,加载iso文件需要它
for harddisk in /dev/hda3 /dev/sda3 #找到硬盘
do
[ ! -e "${harddisk}" ] && continue
/bin/mkdir /hard
mount -t vfat "${harddisk}" /hard #挂载含有iso文件的硬盘分区
/bin/losetup /dev/loop0 /hard/archlinux.iso #把iso文件连接到loop0环路设备
mount -r -t iso9660 /dev/loop0 /bootmnt #挂载环路设备
found=1 #把found置为1表示找到光盘
break
done
这里有个小地方要注意就是mount的写法。initrd里面的这些小工具和平时使用的有些不同的,里面的工具一般功能都很简单。如果把加载iso文件的过程写成一句:
代码:
mount -t iso9660 -o loop ...
在我的电脑上是不行,必须断成两段,自己连接loop环路设备。
最后一点要改的就是,这里我们已经使用了0号环路设备loop0,而且它要一直被使用,所以后面如果还要使用环路设备,应该从loop1开始。在archiso里面往后找,看到这句
代码:
export LOOP_NUM="0"
自然要改成
代码:
export LOOP_NUM="1" #loop0被占了,从1开始。
3. 生成新的archiso_pata.img
搞定了archiso这个hook,清除掉hooks文件夹下面的临时文件,然后回到initrdHack目录里执行:
代码:
find . | cpio -o -H newc > ../archiso_pata.img
cd ..
gzip -c archiso_pata.img > archiso_pata.img.gz
mv archiso_pata.img.gz archiso_pata.img
cpio接受目录树的文件列表,把他们压缩到一个img文件里面。然后把这个img文件用gzip压缩,最后重新再命名成img文件。这好像是initrd文件的约定。
注意find . | cpio -o -H newc > ../archiso_pata.img 这句里我把生成的文件放在了外面而不是直接放在里面,放里面生成的文件的大小是不对的。不过我还不知道原因,有同学知道可以告诉我阿。
4. 看看搞定没有
把生成的新archiso_pata.img连同VMLINZ26内核文件和archlinux.iso一起放在sda3根目录下面。VMLINZ26也放在光盘里的/boot文件夹下面。
找个可以用的grub,进去的时候点c,进入命令行,输入
代码:
root (hd0,2) #sda3是hd(0,2)
kernel /VMLINZ26
initrd /archiso_pata.img
就搞定拉~
我学习bash才几天,只能看懂,但是写起来很困难,呵呵。上面的代码很基础,只能说明原理,他们只针对我的电脑,我也不知道怎么写出更好的通用的initrd文件,各位要是有好的建议可以分享下阿~
E=m c^2
- adagio
- 论坛版主
- 帖子: 22110
- 注册时间: 2008-02-17 23:47
- 来自: 美丽富饶的那啥星球
Re: archlinux 2009.02硬盘安装DIY
爱因斯坦也叛变了
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……
---------------------------------------------------------------------------------
★ [图片版]新手当自强(续)FAQ
★ [新手进阶]挂载、fstab、调整linux分区
★ [图片版]E17桌面环境配置手把手
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……
---------------------------------------------------------------------------------
★ [图片版]新手当自强(续)FAQ
★ [新手进阶]挂载、fstab、调整linux分区
★ [图片版]E17桌面环境配置手把手
- HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
- john.wu
- 帖子: 1006
- 注册时间: 2007-10-18 17:40
- gza633
- 帖子: 799
- 注册时间: 2009-03-13 14:26
- ibear
- 帖子: 787
- 注册时间: 2006-10-19 8:43
- 来自: 长江口
Re: archlinux 2009.02硬盘安装DIY
其实有u盘的话,用u盘启动最简单,啥配置也不用
我一开始刻了个ftp版iso,结果死活都安装不了,后来改用U盘启动一下就OK了
我一开始刻了个ftp版iso,结果死活都安装不了,后来改用U盘启动一下就OK了
好好地做一个碌碌无为的人
- syrano
- 帖子: 4313
- 注册时间: 2007-10-06 18:40
- qiang_liu8183
- 论坛版主
- 帖子: 10699
- 注册时间: 2006-09-10 22:36
- 系统: Arch Debian
- 来自: 北京
- adam8157
- 帖子: 2794
- 注册时间: 2009-03-05 16:31
- 联系:
Re: archlinux 2009.02硬盘安装DIY
事实上 我在linuxsir里贴了一篇2009.02最简单的硬盘U盘安装方法 结果没人理
简单说 不用提取img 因为iso和img里的文件一样的 md5都一样
直接提取iso 安装grub 改启动项就ok了
loop hook都不用 我肉测的哦
http://www.linuxsir.org/bbs/thread347370.html
简单说 不用提取img 因为iso和img里的文件一样的 md5都一样
直接提取iso 安装grub 改启动项就ok了
loop hook都不用 我肉测的哦
http://www.linuxsir.org/bbs/thread347370.html
- yafengabc
- 帖子: 137
- 注册时间: 2007-10-19 16:26
Re: archlinux 2009.02硬盘安装DIY
ftp://ftp.archlinux.org/iso/archboot/20 ... chboot.iso
Archboot是老格式的安装盘,最适合硬盘安装得,都出到2009.5了,何苦还用2009,2呢.......
Archboot是老格式的安装盘,最适合硬盘安装得,都出到2009.5了,何苦还用2009,2呢.......
菜鸟的贴你就不顶了吗?!!!
DELL D620
Core2 Duo T5500
1G DDR II 667
i945GM GMA950
AMD 64x2 5200+
GA-MA78GM-S2HP
2G DDR2 800
ATI Radeon HD 3200
DELL D620
Core2 Duo T5500
1G DDR II 667
i945GM GMA950
AMD 64x2 5200+
GA-MA78GM-S2HP
2G DDR2 800
ATI Radeon HD 3200
- shanliang8008
- 帖子: 1362
- 注册时间: 2007-07-16 19:43
- 来自: tangshan
Re: archlinux 2009.02硬盘安装DIY
光盘装不上 两个启动选项都试试 我有一个装不上 u盘是另外一个装不上
- adagio
- 论坛版主
- 帖子: 22110
- 注册时间: 2008-02-17 23:47
- 来自: 美丽富饶的那啥星球
Re: archlinux 2009.02硬盘安装DIY
我证明,你这法子管用,而且最简单,也是肉测的哦!adaml 写了:事实上 我在linuxsir里贴了一篇2009.02最简单的硬盘U盘安装方法 结果没人理
简单说 不用提取img 因为iso和img里的文件一样的 md5都一样
直接提取iso 安装grub 改启动项就ok了
loop hook都不用 我肉测的哦
http://www.linuxsir.org/bbs/thread347370.html
下次贴到这边,肯定顶你
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……
---------------------------------------------------------------------------------
★ [图片版]新手当自强(续)FAQ
★ [新手进阶]挂载、fstab、调整linux分区
★ [图片版]E17桌面环境配置手把手
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……
---------------------------------------------------------------------------------
★ [图片版]新手当自强(续)FAQ
★ [新手进阶]挂载、fstab、调整linux分区
★ [图片版]E17桌面环境配置手把手
- adam8157
- 帖子: 2794
- 注册时间: 2009-03-05 16:31
- 联系:
Re: archlinux 2009.02硬盘安装DIY
adagio 写了:我证明,你这法子管用,而且最简单,也是肉测的哦!adaml 写了:事实上 我在linuxsir里贴了一篇2009.02最简单的硬盘U盘安装方法 结果没人理
简单说 不用提取img 因为iso和img里的文件一样的 md5都一样
直接提取iso 安装grub 改启动项就ok了
loop hook都不用 我肉测的哦
http://www.linuxsir.org/bbs/thread347370.html
下次贴到这边,肯定顶你
- HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
Re: archlinux 2009.02硬盘安装DIY
不至于没人理吧,呵呵...adaml 写了:事实上 我在linuxsir里贴了一篇2009.02最简单的硬盘U盘安装方法 结果没人理
简单说 不用提取img 因为iso和img里的文件一样的 md5都一样
直接提取iso 安装grub 改启动项就ok了
loop hook都不用 我肉测的哦
http://www.linuxsir.org/bbs/thread347370.html
我之前就是全丢到u盘上然后用syslinux的...
HUNT Unfortunately No Talent...