[原创]制作从硬盘起动 ubuntu live_cd 的 initrd.gz

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

[原创]制作从硬盘起动 ubuntu live_cd 的 initrd.gz

#1

帖子 gnix_oag » 2006-03-25 22:40

制作从硬盘起动 ubuntu live_cd 的 initrd.gz

由于内核版本不一样,所有做出来的 initrd.gz 不一定通用。
故将制作从硬盘起动 ubuntu live_cd 的initrd.gz的方法介绍如下:

原理:修改起动脚本,使其挂载硬盘上的分区,而不是光盘。

首先把光盘里的 casper 和 install 目录复制到根目录里:

代码: 全选

sudo mount */ubuntu.iso /mnt -o loop 
sudo cp -R /mnt/casper /  
sudo cp -R /mnt/install /
sudo umount /mnt
再挂载压缩的文件系统:

代码: 全选

sudo mount /casper/filesystem.squashfs  /mnt -t squashfs -o loop
由于是只读的,所以把要修改的内容考贝过来:

代码: 全选

sudo cp -R  /mnt/usr/share/initramfs-tools /
修改/initramfs-tools/scripts/casper

代码: 全选

sudo gedit /initramfs-tools/scripts/casper
找到 find_cd() {*}

把它改为:(或者为自己的)

代码: 全选

find_cd() {
   mounted=
        for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
            devname=$(sys2dev "${sysblock}")
               for dev in $(subdevices "${sysblock}"); do
                    devname=$(sys2dev "${dev}")
                    case $(get_fstype "${devname}") in
                        vfat|iso9660|ntfs|etx3|udf|reiserfs)
                            mount -t $(get_fstype "${devname}") -o ro "${devname}" $mountpoint || continue
                            if casper_path $mountpoint; then
                                echo $(casper_path $mountpoint)
                                return
                            else
                                umount $mountpoint
                            fi
                            ;;
                    esac
                done
        done
}
现在再挂载回去:

sudo mount --bind /initramfs-tools /mnt/usr/share/initramfs-tools

由于 /mnt/tmp 不能写,所以也要挂载一个能写的过去:

mkdir /gaoxing
sudo mount --bind /gaoxing /mnt/tmp

好了准备好了就可以制作了:(很简单的)

代码: 全选

sudo chroot /mnt /bin/bash 
mkinitramfs -o /tmp/initrd.gz /lib/modules/2.6*
好了,大功告成,用它来起动吧(理论上可以从硬盘的vfat ntfs etx3 reiserfs分区上起动,也可从光盘起动)

从硬盘起动如下:(以前说过)

把 iso 里面的 casper 文件夹解压到一个盘的根目录下

再用光盘中的 inistall/vmlinuz 和我的这个 initrd.gz 起动

在 grub 的 menu.lst 配置文件中加入

代码:
title Kubuntu livecd

kernel */vmlinuz append boot=casper ramdisk_size=1048576 root=/dev/ram rw quiet debian-installer/locale=zh_CN splash

initrd */kubuntu_initrd.gz

boot
*/ 为你自己的路径

重起就行了

已经成功的使很多live_cd 从硬盘起动了,包括 6.06 中文件制定版。


相关内容: 修改 initrd.gz 文件 (法二) viewtopic.php?p=98012#98012

.
上次由 gnix_oag 在 2006-07-09 10:12,总共编辑 3 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2006-03-25 22:46

好贴。

似乎没有找到检查版本的部分。是不是也可以把版本检查的限制去掉。
● 鸣学
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#3

帖子 gnix_oag » 2006-03-25 22:54

如果有脚本高手就好了,

我看这个脚本看了好久,才搞清楚这个部分。
joe45
帖子: 87
注册时间: 2006-03-21 3:03

#4

帖子 joe45 » 2006-04-05 20:17

不是很明白,只有自己去实践了....
请问这些命令要用livecd去启动之后执行了,这样还是要刻盘先了...
直接装不了,我郁闷死...
头像
lvjinhua
帖子: 436
注册时间: 2006-02-23 14:46
来自: 上海
联系:

我修改了一下,可以不解压缩 iso 文件即可启动,并且支持 ntfs 分区

#5

帖子 lvjinhua » 2006-06-21 0:57

我修改了一下,可以不解压缩 iso 文件即可启动,并且支持 ntfs 分区:
viewtopic.php?t=17909
====
dubuntu-6.06-livecd-i386正式版正式完工!
====
*支持LiveCD硬盘启动
*Linux 2.6.15-23-686
*永中Office 2007
*LumaQQ+OpenQ+cycloneQQ
**N 多的编程及调试工具**
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#6

帖子 gnix_oag » 2006-07-07 23:05

使用硬盘作联合文件系统 (加 unionfs=/dev/* use_unionfs 参数)

代码: 全选

setup_unionfs() {
	backdev="$1"
	rootmnt="$2"
        modprobe -Qb unionfs
        mkdir -p /cow

        for z in $(cat /proc/cmdline); do
	        case $g in
             unionfs=*)
		        unionfs=${z#unionfs=}
		        case $unionfs in
		        LABEL=*)
			     unionfs="/dev/disk/by-label/${unionfs#LABEL=}"
			            ;;
		        UUID=*)
			     unionfs="/dev/disk/by-uuid/${unionfs#UUID=}"
			            ;;
		        esac
		                 ;;
              unionfs_img=*)
			    unionfs_img=${z#unionfs_img=}
              esac
         done 

        if grep -q use_unionfs /proc/cmdline; then
            i=0
            # We love udev and the kernel!
            while [ "$i" -lt 10 ]; do
                cowdevice=$unionfs
                    mount -t $(get_fstype "$cowdevice") -o rw "$cowdevice" /cow || panic "Can not mount $cowdevice on /cow"
                    break
                sleep 1
                i=$(( $i + 1 ))
            done
        eles
            mount -t tmpfs tmpfs /cow
        fi

  		if [ ! -e /cow/ubuntu_rw ]; then
			mkdir -p /cow/ubuntu_rw
		fi

	mkdir -p /rofs

    if [ "$(get_fstype $backdev)" = "unknown" ]; then
        panic "Unknown file system type on $backdev"
    fi
	mount -t $(get_fstype "$backdev") -o ro "$backdev" /rofs || panic "Can not mount $backdev on /rofs"

	mount -t unionfs -o dirs=/cow/ubuntu_rw=rw:/rofs=ro unionfs "$rootmnt"

        if grep -q show-cow /proc/cmdline; then
            mkdir -p "$rootmnt/cow"
            mount -o bind /cow/ubuntu_rw "$rootmnt/cow"
        fi

        mkdir -p "$rootmnt/rofs"
        mount -o bind /rofs "$rootmnt/rofs"
}
上次由 gnix_oag 在 2006-07-07 23:09,总共编辑 1 次。
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#7

帖子 gnix_oag » 2006-07-07 23:06

找iso

代码: 全选

find_iso()
{
   local isoroot="/iso9660"
   local tmproot=$1
   isos=`ls ${tmproot}/*.iso 2>/dev/null` || return 1
   modprobe loop
   mkdir -p "$isoroot"
   for iso in ${isos}
   do
       mount -t iso9660 -o loop $iso $isoroot 2>/dev/null || continue
       if casper_path "$isoroot"; then
           #echo "$isoroot"/casper/filesystem.squashfs
           in_iso_squashfs="$isoroot"/casper/filesystem.squashfs
           return 0        else
           umount "$isoroot"
       fi
   done
   unset isos
   unset iso
   return 1
}

find_cd() {
   mounted=	
        for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
            devname=$(sys2dev "${sysblock}")
               for dev in $(subdevices "${sysblock}"); do
                    devname=$(sys2dev "${dev}")
                    case $(get_fstype "${devname}") in 	
                        iso9660|ext2|ext3|udf|reiserfs|jfs|xfs|minix)
                            modprobe $(get_fstype "${devname}")
                            mount -t $(get_fstype "${devname}") "${devname}" $mountpoint || continue
                             if find_iso $mountpoint ; then
                                 echo $in_iso_squashfs
                                 return
                             else
                                 umount $mountpoint
                             fi
                                                                         ;;
                         vfat|ntfs)
                             modprobe $(get_fstype "${devname}")
                             mount -t $(get_fstype "${devname}") -o utf8 "${devname}" $mountpoint || continue
                             if find_iso $mountpoint ; then
                                 echo $in_iso_squashfs
                                 return
                             else
                                 umount $mountpoint
                             fi
                                                                  ;;
                                                               *)
                                                                 ;;
                    esac
                done
        done
} 
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#8

帖子 gnix_oag » 2006-07-07 23:18

在 mountroot() 的

setup_cow "$overlay_method" "$(get_backing_device $live_image)" "$rootmnt"
加上
cp -r /lib "$rootmnt/lib"

可以起动不同LiveCD上内核的 LiveCD
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#9

帖子 gnix_oag » 2006-07-08 0:26

改一下:即 ext2|ext3|reiserfs|jfs|xfs|minix 分区上有 /ubuntu_rw 文件夹就用它来保存
或者有根目上有 ubuntu.img 文件 就用它来保存

代码: 全选

find_cow_device() {
    for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop); do
        for dev in $(subdevices "${sysblock}"); do
            devname=$(sys2dev "${dev}")

                    case $(get_fstype "${devname}") in    
                        ext2|ext3|reiserfs|jfs|xfs|minix)
                            modprobe $(get_fstype "${devname}")
                            mount -t $(get_fstype "${devname}") -o rw "${devname}" /cow_tmp || continue
                             if [ -e /cow_tmp/ubuntu_rw ] ; then
                                 mount -o bind /cow_tmp /cow
                                 return
                             elif [ -f /cow_tmp/ubuntu.img ]; then
                                 modprobe loop
                                 mount -t $(get_fstype /cow_tmp/ubuntu.img ) -o loop /cow_tmp/ubuntu.img /cow
                                 return 
                             else
                                 umount /cow_tmp
                             fi
                                                                         ;;
                         vfat|ntfs)
                             modprobe $(get_fstype "${devname}")
                             mount -t $(get_fstype "${devname}") -o utf8 "${devname}" /cow_tmp || continue
                             if [ -f /cow_tmp/ubuntu.img ]; then
                                 modprobe loop
                                 mount -t $(get_fstype /cow_tmp/ubuntu.img ) -o loop /cow_tmp/ubuntu.img /cow
                                 return 
                             eles
                                 umount /cow_tmp
                             fi
                                                                  ;;
                                                               *)
                                                                 ;;
                    esac
        done
    done
    return 1    
}

setup_unionfs() {
	backdev="$1"
	rootmnt="$2"
        modprobe -Qb unionfs
        mkdir -p /cow

        if grep -q use_hd_unionfs /proc/cmdline; then
				mkdir -p /cow_tmp
            i=0
            # We love udev and the kernel!
            while [ "$i" -lt 10 ]; do
                cowdevice=$(find_cow_device) 
                sleep 1
                i=$(( $i + 1 ))
            done
        else
            mount -t tmpfs tmpfs /cow
        fi

	mkdir -p /rofs
    if [ "$(get_fstype $backdev)" = "unknown" ]; then
        panic "Unknown file system type on $backdev"
    fi
	mount -t $(get_fstype "$backdev") -o ro "$backdev" /rofs || panic "Can not mount $backdev on /rofs"

	mount -t unionfs -o dirs=/cow=rw:/rofs=ro unionfs "$rootmnt"
        if grep -q show-cow /proc/cmdline; then
            mkdir -p "$rootmnt/cow"
            mount -o bind /cow "$rootmnt/cow"
        fi
        mkdir -p "$rootmnt/rofs"
        mount -o bind /rofs "$rootmnt/rofs"
}
maomaoel
帖子: 26
注册时间: 2006-07-05 16:34

#10

帖子 maomaoel » 2006-07-12 9:24

/install下没有vmliuz 怎么办? /casper下有vmliuz 可以用不?
要在移动硬盘上启动应该怎么改?
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#11

帖子 gnix_oag » 2006-07-12 12:30

6.06的位置改了,就用/casper下的vmliuz
maomaoel
帖子: 26
注册时间: 2006-07-05 16:34

#12

帖子 maomaoel » 2006-07-14 8:18

改了后,在移动硬盘上启动,只出现了启动屏幕,进度条就没反应了?是怎么回事啊?
wgzht2003
帖子: 9
注册时间: 2007-02-26 17:39
联系:

#13

帖子 wgzht2003 » 2007-02-28 9:51

可以整理一下吗,新手,不是很明白,但用你的方法下载后启动成功,但不会修改,启动后更新文件后有时会进不了系统,在启动进度条开始后停止,键盘不起作用
头像
skyx
论坛版主
帖子: 9202
注册时间: 2006-12-23 13:46
来自: Azores Islands
联系:

#14

帖子 skyx » 2007-02-28 9:53

wgzht2003 写了:可以整理一下吗,新手,不是很明白,但用你的方法下载后启动成功,但不会修改,启动后更新文件后有时会进不了系统,在启动进度条开始后停止,键盘不起作用
gnix_oag发了新脚本,也可直接上ftp下载引导
no security measure is worth anything if an attacker has physical access to the machine
wgzht2003
帖子: 9
注册时间: 2007-02-26 17:39
联系:

#15

帖子 wgzht2003 » 2007-03-03 13:42

6.10 安装成功,但7.04 h4 不能成功启动,用gnix_oag的7.04 可以启动到桌面,但鼠标不能用 不知怎么用快捷键安装,呵呵,有好些快捷方式不会用,搜也搜不出来。
回复