[分享]不解压 iso 硬盘启动 ubuntu-6.06-desktop.iso (即livecd版)

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

[分享]不解压 iso 硬盘启动 ubuntu-6.06-desktop.iso (即livecd版)

#1

帖子 lvjinhua » 2006-06-19 1:53

原 创: gnix_oag

修 改: dubuntu 于 2006.6.18

本文是在 gnix_oag 大作的基础上改进的,请见文后的引用

目前测试了 ubuntu 的 LiveCD 镜像文件存放到 ntfs, fat32, ext2, ext3, reiserfs 的情况,而 xfs 及 jfs 文件系统没有进行测试。

文件下载:
为 2.6.15-23 386 内核准备:
http://ftp.ubuntu.org.cn/dubuntu/hd_boo ... 23-386.zip
为 2.6.15-23 686 内核准备:
http://ftp.ubuntu.org.cn/dubuntu/hd_boo ... 23-686.zip

比如,欲启动官方正式版 ubuntu-6.06-desktop-i386 可以下载 hd_boot-2.6.15-23-386.zip 。

使用方法在下载得到的压缩包中有详细说明。


主要是修改了 /usr/share/initramfs-tools/scripts/casper 脚本,添加了一个 find_iso() 函数,用于查找硬盘上的 iso 镜像文件并判断它是不是 ubuntu 的 livecd。

代码: 全选

gnix_oag的版本,能实现硬盘启动,但必须解压缩 iso 文件,并且不支持 ntfs:
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
} 

代码: 全选

修改后的版本,不必解压缩 iso ,支持 ntfs 等分区:
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
                        vfat|iso9660|ext2|ext3|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
                             if find_iso $mountpoint ; then
                                 echo $in_iso_squashfs
                                 return
                             else
                                 umount $mountpoint
                             fi
                            ;;
                         jfs|xfs|ntfs|minix)
                             modprobe xfs
                             modprobe jfs
                             modprobe ntfs
                             modprobe minix
                             mount -t $(get_fstype "${devname}") -o ro "${devname}" $mountpoint || continue
                             if find_iso $mountpoint ; then
                                 echo $in_iso_squashfs
                                 return
                             else
                                 umount $mountpoint
                             fi
                            ;;
                         *)
                            ;;
                    esac
                done
        done
}

代码: 全选

编辑 /etc/mkinitramfs/modules 文件,如下所示,主要是为了在生成的 initrd.gz 文件中多加入一些驱动程序。
sd_mod
raid0
raid1
raid5
ntfs
minix
loop
xfs
jfs
scsi
另请参阅:
viewtopic.php?t=16590&highlight=
viewtopic.php?t=11906&highlight=
上次由 lvjinhua 在 2006-06-21 1:05,总共编辑 5 次。
====
dubuntu-6.06-livecd-i386正式版正式完工!
====
*支持LiveCD硬盘启动
*Linux 2.6.15-23-686
*永中Office 2007
*LumaQQ+OpenQ+cycloneQQ
**N 多的编程及调试工具**
ink
帖子: 31
注册时间: 2005-05-31 9:42

#2

帖子 ink » 2006-06-19 13:29

用户名及密码不对
ink
帖子: 31
注册时间: 2005-05-31 9:42

#3

帖子 ink » 2006-06-19 21:34

楼主能不能去掉用户和密码啊?我试过很多次了,是不是有空格或者搞错了?很郁闷。
头像
lvjinhua
帖子: 436
注册时间: 2006-02-23 14:46
来自: 上海
联系:

#4

帖子 lvjinhua » 2006-06-19 22:14

确实密码不对,我马上修正并上传。
====
dubuntu-6.06-livecd-i386正式版正式完工!
====
*支持LiveCD硬盘启动
*Linux 2.6.15-23-686
*永中Office 2007
*LumaQQ+OpenQ+cycloneQQ
**N 多的编程及调试工具**
头像
lvjinhua
帖子: 436
注册时间: 2006-02-23 14:46
来自: 上海
联系:

#5

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

终于修改完成了, 由于 initrd.gz 文件系统中的 bash 同真实系统的 bash 不太一样,导致像 if 语句这此常用语法也不太一样,导致自己白忙了一天的时间。
哎,吸取教训。
====
dubuntu-6.06-livecd-i386正式版正式完工!
====
*支持LiveCD硬盘启动
*Linux 2.6.15-23-686
*永中Office 2007
*LumaQQ+OpenQ+cycloneQQ
**N 多的编程及调试工具**
ink
帖子: 31
注册时间: 2005-05-31 9:42

#6

帖子 ink » 2006-06-21 20:45

多谢,可以使用了,但是进一步安装ubuntu时发现没有办法挂载/分区,无论自动空闲分区还是用gparter,都在格式化后没有办法挂载根分区。自动空闲分区后起码开始安装后还复制了一部分文件才报告安装崩溃,我好像没有发现其它人有这个问题,应该是用分区工具后就可以安装了,难道这个只能启动不能进一步安装?
另外我的鼠标在这个环境不能使用,普通的三键鼠标啊。安装时区设置上选择上海东8区后怎么显示的时间是桌面右上角正确的系统时间加上8小时,这个没有理由啊,怎么搞出两个时间了。
头像
lvjinhua
帖子: 436
注册时间: 2006-02-23 14:46
来自: 上海
联系:

#7

帖子 lvjinhua » 2006-06-24 12:12

ink 写了:多谢,可以使用了,但是进一步安装ubuntu时发现没有办法挂载/分区,无论自动空闲分区还是用gparter,都在格式化后没有办法挂载根分区。自动空闲分区后起码开始安装后还复制了一部分文件才报告安装崩溃,我好像没有发现其它人有这个问题,应该是用分区工具后就可以安装了,难道这个只能启动不能进一步安装?
另外我的鼠标在这个环境不能使用,普通的三键鼠标啊。安装时区设置上选择上海东8区后怎么显示的时间是桌面右上角正确的系统时间加上8小时,这个没有理由啊,怎么搞出两个时间了。
第一个问题: 由于从硬盘启动,因此有一个问题得小心,因为 live-cd 的 iso 文件放到了一个硬盘分区中,因此这个分区是绝对动不了的,即不能删除与不能格式化,最重要的是它前边的那些分区也不能动(比如你的 iso 文件放在 hda5 上,那么 hda1-4 都不能动),所以在启动之前最好将 livecd 的 iso 文件放在比较靠前的分区中。

另外, ubuntu 自带的那个 livecd 安装程序自我感觉实在是不怎么样,我就从来没有成功用它安装过系统,推荐你使用 dubuntu 吧,我们学校的 linux 组在 ubuntu 的基础上改进的版本。

第二个问题:关于鼠标,我们升级到 2.6.15-23-686 的内核后,学校一部分牌子的联想机器也不能使用,最后只能为 ps/2 键盘配置一个 usb-> ps/2 的转换器。
====
dubuntu-6.06-livecd-i386正式版正式完工!
====
*支持LiveCD硬盘启动
*Linux 2.6.15-23-686
*永中Office 2007
*LumaQQ+OpenQ+cycloneQQ
**N 多的编程及调试工具**
ink
帖子: 31
注册时间: 2005-05-31 9:42

#8

帖子 ink » 2006-06-24 15:08

iso文件我已经放在第一个分区了,等正式版出来我试试dubuntu,不过好像带了很多编程和调试工具。
abcsand
帖子: 20
注册时间: 2006-05-07 23:51

#9

帖子 abcsand » 2006-06-24 18:57

这个能起动你的DUBUNTU么??
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#10

帖子 gnix_oag » 2006-06-24 22:33

要安装的话可以先在WinXP下用分区工具留一空的分区

我在笔记本上成功安装了官方的 xubuntu-desktop

ubuntu-desktop 用起来很慢(主要是内存太小),不建义用这个安装。
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#11

帖子 gnix_oag » 2006-06-24 22:42

建议:

硬盘的挂载可去掉只读属性 (去掉-o ro )
挂载vfat ntfs 时加上中文持 (加上-o utf8)
头像
lvjinhua
帖子: 436
注册时间: 2006-02-23 14:46
来自: 上海
联系:

#12

帖子 lvjinhua » 2006-06-25 15:26

gnix_oag 写了:建议:

硬盘的挂载可去掉只读属性 (去掉-o ro )
挂载vfat ntfs 时加上中文持 (加上-o utf8)
试一下,看能不能成功。
====
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
来自: 湖南永州
联系:

#13

帖子 gnix_oag » 2006-07-07 20:55

代码: 全选

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 在 2006-07-07 23:13,总共编辑 1 次。
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#14

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

使用硬盘作联合文件系统 (加 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
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#15

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

在 mountroot() 的

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

可以起动不同LiveCD上内核的 LiveCD
回复