<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>images &#8211; bhzhuOS爱好者(原StartOS爱好者)</title>
	<atom:link href="https://www.bhzhu203.com/tag/images/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bhzhu203.com</link>
	<description>QQ群号125732839</description>
	<lastBuildDate>Tue, 04 Apr 2017 15:31:50 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>
	<item>
		<title>将物理机正使用的操作系统制作成LiveCD笔记[未测试]</title>
		<link>https://www.bhzhu203.com/2017/04/04/%e5%b0%86%e7%89%a9%e7%90%86%e6%9c%ba%e6%ad%a3%e4%bd%bf%e7%94%a8%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e5%88%b6%e4%bd%9c%e6%88%90livecd%e7%ac%94%e8%ae%b0%e6%9c%aa%e6%b5%8b%e8%af%95/</link>
		
		<dc:creator><![CDATA[bhzhu203]]></dc:creator>
		<pubDate>Tue, 04 Apr 2017 15:31:49 +0000</pubDate>
				<category><![CDATA[bhzhuOS]]></category>
		<category><![CDATA[linux知识]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[img]]></category>
		<category><![CDATA[livecd]]></category>
		<guid isPermaLink="false">http://www.bhzhu203.com/?p=432</guid>

					<description><![CDATA[目录(?)[+] 将物理机正使用的操作系统制作成LiveCD笔记[未测试] 作者 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="bog_copyright"></div>
<div></div>
<div>
<p>目录<a title="系统根据文章中H1到H6标签自动生成文章目录" href="file:///home/tmp/Desktop/all/%E5%B0%86%E7%89%A9%E7%90%86%E6%9C%BA%E6%AD%A3%E4%BD%BF%E7%94%A8%E7%9A%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%88%B6%E4%BD%9C%E6%88%90LiveCD%E7%AC%94%E8%AE%B0[%E6%9C%AA%E6%B5%8B%E8%AF%95]%20-%20%E6%8A%80%E6%9C%AF%E5%B9%B6%E8%89%BA%E6%9C%AF%E7%9D%80%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET.html#">(?)</a><a title="展开" href="file:///home/tmp/Desktop/all/%E5%B0%86%E7%89%A9%E7%90%86%E6%9C%BA%E6%AD%A3%E4%BD%BF%E7%94%A8%E7%9A%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%88%B6%E4%BD%9C%E6%88%90LiveCD%E7%AC%94%E8%AE%B0[%E6%9C%AA%E6%B5%8B%E8%AF%95]%20-%20%E6%8A%80%E6%9C%AF%E5%B9%B6%E8%89%BA%E6%9C%AF%E7%9D%80%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET.html#">[+]</a></p>
</div>
<div></div>
<div id="article_content" class="article_content">
<p align="center"><strong>将物理机正使用的操作系统制作成LiveCD笔记[未测试]</strong></p>
<h2><a name="t0"></a>作者：张华  发表于：2013-09-30<br />
版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明</h2>
<h2><a name="t1"></a>( http://blog.csdn.net/quqi99 )</h2>
<p>1, 使用物理机上的相关目录制作根文件系统<br />
1）准备块设备<br />
dd if=/dev/zero of=/bak/images/livecd.img bs=10M count=1024<br />
mkfs.ext4 /bak/images/livecd.img<br />
sudo mount -o loop /bak/images/livecd.img /mnt<br />
2）拷贝物理机上的相关目录，并删除不必要的文件减小体积，因为LiveCD要采用专用的模块故删掉模块，到时候再安装新内核。<br />
sudo mkdir /mnt/system<br />
sudo cp -a /{bin,etc,lib,lib64,sbin,root,usr} /mnt/system/<br />
cd /mnt/system<br />
sudo rm -rf usr/src<br />
sudo rm -rf lib/modules<br />
sudo rm -f lib/udev/write_*<br />
sudo rm -f etc/udev/rules.d/70*<br />
3）创建/etc/fstab与/etc/mtab, 注意，因为是LiveCD，并没有挂载根分区，而是proc和sys等启动过程必要的分区。<br />
在initrd切换到根文件系统之前, 挂载信息不会体现在/etc/mtab文件中，为保持一致，我们也添加/etc/mtab文件。<br />
cat &gt; /mnt/system/etc/fstab &lt;&lt; EOF<br />
none    /proc       proc        defaults        0    0<br />
sysfs    /sys       sysfs    defaults        0    0<br />
devpts    /dev/pts   devpts   gid=4,mode=620  0    0<br />
tmpfs    /dev/shm   tmpfs    defaults        0    0<br />
EOF<br />
cat &gt; /mnt/system/etc/mtab &lt;&lt; EOF<br />
none    /proc       proc        defaults        0    0<br />
sysfs    /sys       sysfs    defaults        0    0<br />
devpts    /dev/pts   devpts   gid=4,mode=620  0    0<br />
EOF<br />
如果不是LiveCD，而是一个可以直接启动的镜像的话, 这个文件可以不变。<br />
除非根文件系统所在的块设备是个新的才需要给它设置卷标(如：tune2fs -L my-rootfs ubuntute.img），然后修改/etc/fstab中的UUID。<br />
sudo mount -o loop ubuntut.img /mnt<br />
sudo vi /mnt/etc/fstab<br />
UUID=my-rootfs / ext4 defaults 0 0<br />
4) 可将这些目录压缩成一个块设备：<br />
sudo mksquashfs bin etc lib lib64 sbin root usr SYSTEM.img<br />
这样，initrd就可以解压这些目录(mount -o loop -t squashfs /mnt/SYSTEM.img /mnt/system)，<br />
如果是LIVECD这个目录是只读的，所以可以创建一个在tmpfs文件系统，然后用aufs将这两个(一个可写的/SYSTEM和SYSTEM.img挂载的只读的/mnt/system)合起来再挂载到/SYSTEM上。<br />
注意：/SYSTEM即作源目录又作为目标目录，aufs将它们理解成两个不同的目录，不会发生冲突。<br />
sudo mount -t tmpfs tmpfs /SYSTEM<br />
sudo mount -t aufs -o dirs=/SYSTEM=rw:/mnt/system=ro aufs /SYSTEM<br />
然后再在initrd里补齐其他目录，并设置相应的权限，这样就是一个完整的根文件系统了。<br />
sudo mkdir -pv dev proc sys tmp mnt home root<br />
sudo chmod 1777 tmp<br />
sudo 0700 root<br />
sudo mkdir -pv var/{run,log,lock,mail,spool}<br />
sudo mkdir -pv var/{opt,cache,lib/{misc,locate},local}<br />
sudo touch var/run/utmp var/log/{btmp,lastlog,wtmp}<br />
sudo chgrp utmp var/run/utmp var/log/lastlog<br />
sudo chmod 644 var/run/utmp var/log/lastlog</p>
<p>2, 编译内核, 以下配置都应该编译进内核，而不是模块，所以应是&#8221;*&#8221;,而不是&#8221;m&#8221;。<br />
在运行make menuconfig之前先打AUFS的patch, 内核中没有AUFS的代码，要先打patch(撤销patch加-R参数） ，选择origin/aufs3.9分支（因为内核用的是3.9版本）。<br />
git clone http://git.code.sf.net/p/aufs/aufs3-standalone<br />
cd aufs3-standalone/<br />
git checkout -b aufs3.9 origin/aufs3.9<br />
cd /bak/images/download/linux-2.6<br />
git checkout -b v3.9  v3.9<br />
patch -p1 &lt; /bak/images/download/aufs3-standalone/aufs3-kbuild.patch<br />
patch -p1 &lt; /bak/images/download/aufs3-standalone/aufs3-base.patch<br />
patch -p1 &lt; /bak/images/download/aufs3-standalone/aufs3-proc_map.patch<br />
patch -p1 &lt; /bak/images/download/aufs3-standalone/aufs3-standalone.patch<br />
patch -p1 &lt; /bak/images/download/aufs3-standalone/aufs3-loopback.patch<br />
cp -av /bak/images/download/aufs3-standalone/{fs,include} ./<br />
1)，支持initrd [默认已经是&#8221;*&#8221;了]<br />
General setup -&gt; Initial RAM fielsystem and RAM disk(initramfs/initrd) support<br />
Device Drivers -&gt; Block devices -&gt; RAM block device support，并设置&#8221;Default RAM disk size(kbytes)&#8221;不小于16384.<br />
2), Loop Device的支持 [默认已经是&#8221;*&#8221;了]<br />
Device Drivers -&gt; Block devices -&gt; Loopback device support<br />
3), SquashFS文件系统的支持，SquashFS文件系统用于将目录压缩成块设备 [默认已经是&#8221;*&#8221;了]<br />
File system -&gt; Miscellaneous filesystems -&gt; SquashFS 4.0 &#8211; Squashed file system support<br />
4), AUFS文件系统的支持, 用于将不同目录的文件合在一个目录下. LiveCD的SquashFS不可写，所以在TmpFS上创建可写的文件系统，然后用AUFS将它们连起来。<br />
File system -&gt; Miscellaneous filesystems -&gt; Aufs (Advance multi layered unification filesystem) support<br />
-&gt; Detect direct branch access (bypassing aufs)<br />
-&gt; NFS-exportable aufs<br />
-&gt; Readdir in userspace<br />
-&gt; Respect the attributes (mtime/ctime mainly) of special files<br />
-&gt; Ramfs (initramfs/rootfs) as an aufs branch<br />
5), EXT2文件系统支持，initrd一般使用ext2文件系统。<br />
File system -&gt; Second extended fs support，及其下的所有子项也都打*项，<br />
6), ISO960文件系统的支持 [默认已经是&#8221;*&#8221;了]<br />
File system -&gt; CD-ROM/DVD filesystems -&gt; ISO 9660 CDROM file system support<br />
7), CDROM设备的支持 [默认已经是&#8221;*&#8221;了]<br />
Divice Drivers -&gt; SCSI device support -&gt; SCSI disk support<br />
-&gt; SCSI generic support<br />
-&gt; SCSI CDROM support<br />
8), [可选]如果是做LIVEUSB的话，在上面的基础上，还要加一个驱动：<br />
USB设备驱动  [默认已经是&#8221;*&#8221;了],<br />
Device Drivers -&gt; HID Devices<br />
-&gt; USB support<br />
LiveUSB一般采用VFAT或EXT3文件系统<br />
File system -&gt; Ext3 jouralling file system support, diable“Default to &#8216;data=ordered&#8217; in ext3&#8243;，然后enable它下列所有的子项<br />
File system -&gt; DOS/FAT/NT Filesystems, 将MSDOS编译进内核，将VFAT编译成模块（因为VFAT并非内核启动过程中必须支持的文件系统）<br />
9), 最后编译安装内核及模块<br />
编译内核, make -j 4<br />
安装内核，cp arch/x86/boot/bzImage /mnt/boot/livecd-kernel<br />
安装模块</p>
<p>3, 创建initramfs<br />
可以根据已有系统创建initramfs，也可以从头创建initramfs。<br />
1) 我们先说前者，使用mkinitrd命令可生成已有的/boot/initramfs-3.9.10-100.fc17.x86_64.img生成一个新的，-f指这个的新的initramfs的路径，<br />
其后的3.9.8-100.fc17.x86_64是指/lib/modules/3.9.8-100.fc17/, 添加新模块用&#8211;with参数：<br />
sudo mkinitrd -f /boot/initramfs-3.9.10-100.fc17.x86_64.new.img 3.9.8-100.fc17.x86_64 &#8211;with usb-storage<br />
还有一种方法是，解压initramfs，修改了之后，再重新生成即可。<br />
mkdir /tmp/tmp &amp;&amp; cd /tmp/tmp<br />
sudo gzip -cd /boot/initramfs-3.9.10-100.fc17.x86_64.img |sudo cpio -id<br />
修改了之后，再重新生成即可，<br />
find . -print |cpio &#8211;quiet -c -o |gzip -9 &gt; /boot/initramfs-3.9.10-100.fc17.x86_64.new.img<br />
2)如果从重开始创建intramfs的话，首先创建一些目录：<br />
1, cd /mnt/initramfs &amp;&amp; mkdir bin etc lib proc sys<br />
2,/bin目录，即下面init脚本用到的所有命令都得拷过来<br />
cp -a /bin/{bash,chgrp, cp, grep, mkdir,sed,dd,cat,chmod,mount,sleep} bin<br />
cp -a usr/bin/{touch,killall} bin<br />
cp -a /sbin/{switch_root,udevd,udevadm} bin<br />
3,/lib目录，可以使用一个脚本将/bin目录脚本的ldd所依赖的库全部持过来<br />
cp -a /lib/udev lib<br />
cp -a /etc/udev etc<br />
sudo ./create_lib.sh$MYLINUX<br />
$ cat create_lib.sh<br />
ROOT=$1<br />
libs=`find $ROOT/bin-type f -perm /111 -exec &#8220;ldd&#8221; {} \;|cut -d \&gt; -f 2|cut-d <span id="MathJax-Element-1-Frame" class="MathJax"><span id="MathJax-Span-1" class="math"><span id="MathJax-Span-2" class="noError">-f 1|sort |uniq`<br />
echo $libs<br />
for lib in $libs<br />
do<br />
if [ -f $lib ];then<br />
if [ !-f $ROOT/$lib ] ;then<br />
dir=`dirname $ROOT$lib`<br />
if [ ! -d $dir ];then<br />
mkdir -pv $dir<br />
fi<br />
cp -av $lib $ROOT$lib<br />
if [ -h $lib ]; then<br />
source=`dirname $lib`/`readlink $lib`<br />
cp -av $source $ROOT$source<br />
echo $source &gt;&gt; liblist<br />
fi<br />
fi<br />
fi<br />
done<br />
echo &#8220;Done!&#8221;<br />
4, 用户及组信息,<br />
cp -a /etc/{group, passwd} etc<br />
5, 创建一个空的fstab,<br />
touch etc/fstab<br />
6,创建LiveCD的卷标，这个和下面init脚本中的要一致<br />
echo &#8220;mylivecd&#8221; &gt; /mnt/LABEL<br />
7,首先创建init脚本，解释见脚本中的注释：<br />
#!/bin/bash<br />
##先要加载内核文件系统sysfs，以及很多地方都要用到的proc文件系统<br />
mount -t proc proc /proc<br />
mount -t sysfs sysfs /sys<br />
##使用udev加载dev设备到内存中(tmpfs)<br />
mount -n -t tmpfs -o mode=0755 udev /dev<br />
##启动udev设备需先创建三个特殊设备文件console, null和stdin<br />
mknod -m 600 /dev/console c 5 1<br />
mknod -m 666 /dev/null c 1 3<br />
mknod -m 666 /dev/stdin c 22 0<br />
chmod 1777 /dev/shm<br />
##避免如果uevent_helper里值是/sbin/hotplug时发消息给/sbin/hotplug<br />
echo &#8220;&#8221; &gt; /sys/kernel/uevent_helper<br />
##使用udev创建设备<br />
udevd &#8211;daemon<br />
mkdir -p /dev/.udev/queue<br />
udevadm trigger<br />
udevadm settle<br />
##initramfs执行完之后会switch_root到/SYSTEM目录，所以先创建一些mount要用到的目录<br />
export SYSTEM=/SYSTEM<br />
mkdir -p ${SYSTEM} /mnt<br />
mount -t tmpfs tmpfs /mnt<br />
mkdir -p /mnt/{cdrom,system}</p>
<p>##搜索LiveCD所在的设备，光盘的卷标位于32808节点开始的32个字节，找到之后去掉前后空格再比较<br />
CDROM_OK=&#8221;F&#8221;<br />
while [ &#8220;${CDROM_OK}&#8221; = &#8220;F&#8221; ]<br />
do<br />
for i in $(cat /proc/sys/dev/cdrom/info | grep &#8220;drive name&#8221; \<br />
| sed &#8216;s@drive name:@@g&#8217;)<br />
do<br />
LABEL=$(dd if=/dev/${i} bs=1 skip=32808 count=32 2&gt;/dev/null)<br />
LABEL=$(echo &#8220;${LABEL}&#8221; | grep -o &#8220;[^ ]\+\(\+[^ ]\+</span></span></span>*&#8221;)<br />
if [ &#8220;${LABEL}&#8221; = &#8220;mylivecd&#8221; ]; then<br />
mount -t iso9660 /dev/${i} /mnt/cdrom<br />
CDROM_OK=&#8221;T&#8221;<br />
break;<br />
fi<br />
done<br />
if [ &#8220;${CDROM_OK}&#8221; = &#8220;F&#8221; ]; then<br />
sleep 3<br />
fi<br />
done</p>
<p>##LIVECD的挂载(/mnt/system)目录是只读的(mount -o loop -t squashfs /mnt/SYSTEM.img /mnt/system)，<br />
##所以再创挂载一个可写目录/SYSTEM在内存tmpfs文件系统之上，最后用aufs将这两个目录合起来再挂载到/SYSTEM目录<br />
mount -t tmpfs tmpfs ${SYSTEM}<br />
mount -o loop -t squashfs /mnt/cdrom/SYSTEM.img /mnt/system<br />
mount -t aufs -o dirs=${SYSTEM}=rw:mnt/system=ro aufs ${SYSTEM}</p>
<p>##创建除SYSTEM.img中bin,etc,lib,lib64,sbin,root,usr以外的最终根文件系统所需要的其他目录<br />
mkdir -p ${SYSTEM}/{dev,proc,sys,tmp,mnt,initrd,home}<br />
chmod 1777 ${SYSTEM}/tmp<br />
chmod 0700 ${SYSTEM}/root<br />
mkdir -p ${SYSTEM}/var/{run,log,lock,mail,spool}<br />
mkdir -p ${SYSTEM}/var/{opt,cache,lib/{misc,locate},local}<br />
mkdir -p ${SYSTEM}/usr/src{,-all,-tmp}<br />
mount -t tmpfs tmpfs ${SYSTEM}/usr/src-tmp<br />
mount -o loop -t squashfs /mnt/cdrom/SOURCES.img ${SYSTEM}/usr/src-all<br />
mount -t aufs -o dirs=${SYSTEM}/usr/src-tmp=rw:${SYSTEM}/usr/src-all aufs ${SYSTEM}/usr/src</p>
<p>case $(cat /proc/cmdline | awk -F&#8217;book=&#8217; &#8216;{print $2}&#8217; | awk &#8216;{print $1}&#8217;) in<br />
CROSS)<br />
ln -s cross-sources ${SYSTEM}/usr/src/sources<br />
ln -s cross-patches ${SYSTEM}/usr/src/patches<br />
;;<br />
HURD)<br />
ln -s hurd-sources ${SYSTEM}/usr/src/sources<br />
ln -s hurd-patches ${SYSTEM}/usr/src/patches<br />
;;<br />
LOCAL | *)<br />
ln -s local-sources ${SYSTEM}/usr/src/sources<br />
ln -s local-patches ${SYSTEM}/usr/src/patches<br />
;;<br />
esac</p>
<p>touch ${SYSTEM}/var/run/utmp ${SYSTEM}/var/log/{btmp,lastlog,wtmp}<br />
chgrp utmp ${SYSTEM}/var/run/utmp ${SYSTEM}/var/log/lastlog<br />
chmod 664 ${SYSTEM}/var/run/utmp ${SYSTEM}/var/log/lastlog</p>
<p>killall udevd<br />
##initrd使用pivot_root命令针对挂载在根文件系统上的设备进行切换，<br />
##但initramfs本身就直接建立在根文件系统(rootfs,tmpfs的一个实例）之上，<br />
##不存在挂载，pivot_root无法完成任务,所以使用switch_root, switch_root相当于：<br />
## find -xdev / -exec rm &#8216;{}&#8217; &#8216;;&#8217; &amp;&amp; cd /newmount &amp;&amp; mount &#8211;move . / &amp;&amp; chroot . &amp;&amp; exec init<br />
exec switch_root ${SYSTEM} /sbin/init</p>
<p>8, 使用linux kernel源码里的gen_iniramfs_list.sh和gen_init_cpi脚本生成initramfs<br />
cd /mnt/initramfs/..<br />
sh ./gen_initramfs_list.sh initramfs &gt; file_list<br />
./gen_init_cpio file_list &gt; initramfs.img<br />
gzip -9 initramfs.img<br />
cp initramfs.img.gz /mnt/boot/</p>
<p>4, 安装grub<br />
1)创建目录，mkdir -p /mnt/boot/grub<br />
2)安装grub模块文件<br />
cp -a /usr/lib/grub/i386-pc/*.mod /mnt/boot/grub<br />
cp -a /usr/lib/grub/i386-pc/*.lst /mnt/boot/grub<br />
3)创建grub配置文件<br />
cat /mnt/boot/grub/grub.cfg<br />
set timeout=5<br />
menuentry &#8220;LiveCD for make GNU/Linux&#8221; {<br />
linux /boot/livecd-kernel book=LOCAL<br />
initrd /boot/initramfs.img.gz<br />
}<br />
menuentry &#8220;LiveCD for cross make GNU/Linux&#8221; {<br />
linux /boot/livecd-kernel book=CROSS<br />
initrd /boot/initramfs.img.gz<br />
}<br />
menuentry &#8220;LiveCD for make GNU/Hurd&#8221; {<br />
linux /boot/livecd-kernel book=HURD<br />
initrd /boot/initramfs.img.gz<br />
}<br />
insmod vbe<br />
set gfxpayload=800x600x16</p>
<p>5, 创建livecd启动文件，grub-mkimage命令将iso9660,linux和biosdkist模块合并一个模块组合文件，再用cat命令合并cdboot.img<br />
grub-mkimage -o core.img iso9660 linux biosdisk<br />
cat /usr/lib/grub/i386-pc/cdboot.img core.img &gt; /mnt/boot/livecd.img</p>
<p>6, 使用mkisofs生成iso文件<br />
mkisofs -R -boot-info-table -b /mnt/boot/livecd.img -V &#8216;mylived&#8221; -o mylivecd.iso iso</p>
<p>总结，<br />
如果不是将物理机正使用的操作系统做成LiveCD的话，只是想将物理机正使用的操作系统做一个OpenStack镜像的话，我想应该不用这么周折。<br />
<strong>不过这些我都没有测试</strong>，只是我理论上的想象。怎么做具有多个分区的镜像呢？有空再研究吧。<br />
1）准备块设备<br />
dd if=/dev/zero of=/bak/images/livecd.img bs=10M count=1024<br />
mkfs.ext4 /bak/images/openstack.img<br />
sudo mount -o loop /bak/images/openstack.img /mnt<br />
2）拷贝物理机上的相关目录{bin,etc,lib,lib64,sbin,root,usr}，并删除不必要的文件减小体积。<br />
注意：这里和上面不同的地方是不需要删除lib/modules，因为我们不需要重新编译内核<br />
sudo mkdir /mnt<br />
sudo cp -a /{bin,etc,lib,lib64,sbin,root,usr} /mnt<br />
sudo rm -rf usr/src<br />
sudo rm -f lib/udev/write_*<br />
sudo rm -f etc/udev/rules.d/70*<br />
因为根文件系统所在的块设备的UUID (<strong> 可用“sudo fdisk -l &amp;&amp; sudo blkid lxc.img”命令检查</strong>)变化了，所以要更新/etc/fstab文件<br />
UUID=00b037f0-8332-42e2-abf2-04207283b7f6 / ext4 defaults 1 1<br />
或者使用tune2fs给这个新设备设置一个新标签：<strong>tune2fs -L my-rootfs </strong>/bak/images/openstack.img，还要改/etc/fstab, 改成“<strong>LABEL=my-rootfs / ext4 defaults 0 0</strong>”</p>
<p>这样/boot/grub/grub.conf文件里的kernel段，下面两种方式都是可以的(如果是USB启动的话，设备名总是会变，还是用UUID为好）：</p>
<p>kernel /vmlinux ro<strong> root=LABEL=/</strong> rhgb quiet</p>
<p>kernel /vmlinux ro <strong>root=UUID=my-rootfs </strong>rhgb quiet</p>
<p>3）不需要重新编译内核，因为不是livecd，额外的驱动似乎不必要</p>
<p>4)initramfs也不需要重新生成，因为不是livecd, 不需要为livecd定制什么，<br />
但是对于initramfs里除bin,etc,lib,lib64,sbin,root,usr以外的最终根文件系统所需要的其他目录<br />
##创建除SYSTEM.img中bin,etc,lib,lib64,sbin,root,usr以外的最终根文件系统所需要的其他目录{dev,proc,sys,tmp,mnt,initrd,home}还应该要创建的。<br />
mkdir -p /mnt/{dev,proc,sys,tmp,mnt,initrd,home}<br />
chmod 1777 /mnt/tmp<br />
chmod 0700 /mnt/root<br />
mkdir -p /mnt/var/{run,log,lock,mail,spool}<br />
mkdir -p /mnt/var/{opt,cache,lib/{misc,locate},local}<br />
mkdir -p /mnt/usr/src{,-all,-tmp}<br />
touch /mnt/var/run/utmp ${SYSTEM}/var/log/{btmp,lastlog,wtmp}<br />
chgrp utmp /mnt/var/run/utmp /mnt/var/log/lastlog<br />
chmod 664 /mnt/var/run/utmp /mnt/var/log/lastlog<br />
5)应该就完了<br />
或者2)3)4)步直接通过dd命令全部拷过来了再删除不必要的目录，如: losetup -a &amp;&amp; dd /dev/sda7 /dev/loop0<br />
2013.10.05更新：</p>
<p>如果是qcow2格式的镜像文件，可以使用nbd打开, (<strong>还可以用kpartx或者guestfish</strong>)</p>
<p>1, nbd可以查看qcow2镜像中的分区，指定max_part参数开启nbd模块，默认nbd的增加分区的功能是关闭的，这个参数指定了一个nbd设备可以有多少个分区。<br />
modprobe nbd max_part=8<br />
2, 加载qcow2镜像到nbd设备中<br />
$ sudo qemu-nbd &#8211;connect=/dev/nbd0 /bak/images/centos6.4.img<br />
$ ls /dev/nbd0*<br />
/dev/nbd0  /dev/nbd0p1  /dev/nbd0p2  /dev/nbd0p3<br />
$ sudo fdisk -l /dev/nbd0<br />
Disk /dev/nbd0: 21.2 GB, 21172846592 bytes<br />
255 heads, 63 sectors/track, 2574 cylinders, total 41353216 sectors<br />
Units = sectors of 1 * 512 = 512 bytes<br />
Sector size (logical/physical): 512 bytes / 512 bytes<br />
I/O size (minimum/optimal): 512 bytes / 512 bytes<br />
Disk identifier: 0x000591db</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/nbd0p1            2048    18434047     9216000   83  Linux<br />
/dev/nbd0p2        18434048    20482047     1024000   82  Linux swap / Solaris<br />
/dev/nbd0p3   *    20482048    41353215    10435584   83  Linux<br />
3, sudo mount /dev/nbd0p3 /mnt2/</p>
<p>一个制作根文件系统的脚本：</p>
<p>#!/bin/bash<br />
# vim: set ts=4 sw=4 et nu<br />
set -e<br />
usage=&#8221;Usage: $0 &lt;name&gt;&#8221;<br />
name=$1<br />
if [ -z &#8220;$name&#8221; ]; then<br />
echo $usage<br />
exit 1;<br />
fi</p>
<p>libvirt_xml=&#8221;/bak/images/lxc/$name/libvirt.xml&#8221;<br />
rootfs=&#8221;/bak/images/lxc/$name/rootfs&#8221;</p>
<p>echo &#8220;Initializing rootfs: $rootfs&#8221;</p>
<p>mkdir -p $rootfs</p>
<p>mkdir -p $rootfs/home<br />
mkdir -p $rootfs/opt<br />
mkdir -p $rootfs/proc<br />
mkdir -p $rootfs/sys<br />
mkdir -p $rootfs/root<br />
mkdir -p $rootfs/media<br />
mkdir -p $rootfs/mnt<br />
mkdir -p $rootfs/srv<br />
mkdir -p $rootfs/var</p>
<p>for d in bin etc lib lib64 mnt sbin selinux usr var; do<br />
echo &#8220;Preparing files /$d &#8230;&#8221;<br />
#rsync -ap &#8220;/$d/&#8221; &#8220;$rootfs/$d&#8221;<br />
mkdir -p $rootfs/$d &amp;&amp; mount &#8211;bind /$d $rootfs/$d<br />
done</p>
<p>rm -rf &#8220;$rootfs/var/cache/*&#8221;</p>
<p>echo &#8220;Creating /dev&#8221;</p>
<p>dev_path=&#8221;$rootfs/dev&#8221;<br />
rm -rf $dev_path<br />
mkdir -p $dev_path<br />
mknod -m 666 ${dev_path}/null c 1 3<br />
mknod -m 666 ${dev_path}/zero c 1 5<br />
mknod -m 666 ${dev_path}/random c 1 8<br />
mknod -m 666 ${dev_path}/urandom c 1 9<br />
mkdir -m 755 ${dev_path}/pts<br />
mkdir -m 1777 ${dev_path}/shm<br />
mknod -m 666 ${dev_path}/tty c 5 0<br />
mknod -m 666 ${dev_path}/tty0 c 4 0<br />
mknod -m 666 ${dev_path}/tty1 c 4 1<br />
mknod -m 666 ${dev_path}/tty2 c 4 2<br />
mknod -m 666 ${dev_path}/tty3 c 4 3<br />
mknod -m 666 ${dev_path}/tty4 c 4 4<br />
mknod -m 600 ${dev_path}/console c 5 1<br />
mknod -m 666 ${dev_path}/full c 1 7<br />
mknod -m 600 ${dev_path}/initctl p<br />
mknod -m 666 ${dev_path}/ptmx c 5 2</p>
<p>echo &#8220;Creating network config eth0&#8221;<br />
cat &lt;&lt;EOF &gt; ${rootfs}/etc/sysconfig/network-scripts/ifcfg-eth0<br />
DEVICE=eth0<br />
BOOTPROTO=dhcp<br />
ONBOOT=yes<br />
TYPE=Ethernet<br />
USERCTL=yes<br />
PEERDNS=yes<br />
IPV6INIT=no<br />
EOF</p>
<p>#echo &#8220;Creating network config resolv.conf&#8221;<br />
#cat &lt;&lt;EOF &gt; ${rootfs}/etc/resolv.conf<br />
#nameserver 8.8.8.8<br />
#EOF</p>
<p>echo &#8220;Creating network config sysconfig/network&#8221;<br />
# set the hostname<br />
cat &lt;&lt;EOF &gt; ${rootfs}/etc/sysconfig/network<br />
NETWORKING=yes<br />
HOSTNAME=${name}<br />
EOF</p>
<p>echo &#8220;Creating config fstab&#8221;<br />
#<br />
cat &lt;&lt;EOF &gt; ${rootfs}/etc/fstab<br />
none /dev/pts devpts defaults 0 0<br />
none /proc    proc   defaults 0 0<br />
none /sys     sysfs  defaults 0 0<br />
none /dev/shm tmpfs  defaults 0 0<br />
EOF</p>
<p>echo &#8220;Creating etc/hosts&#8221;<br />
# set minimal hosts<br />
cat &lt;&lt;EOF &gt; $rootfs/etc/hosts<br />
127.0.0.1 localhost $name<br />
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6<br />
EOF</p>
<p># selinux<br />
echo &#8220;Creating selinux&#8221;<br />
cat &lt;&lt;EOF &gt; $rootfs/etc/selinux/config<br />
SELINUX=disabled<br />
SELINUXTYPE=targeted<br />
EOF</p>
<p>#<br />
echo &#8220;Creating init for guest&#8221;<br />
cat &lt;&lt;EOF &gt; $rootfs/bin/lxc_guest_init.sh<br />
#!/bin/bash<br />
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin<br />
export PS1=&#8221;[\u@\h \W]\\$ &#8221;</p>
<p>mount -t devtmpfs none /dev<br />
mount -t devpts none /dev/pts<br />
mount -t tmpfs none /dev/shm</p>
<p>/etc/init.d/network start<br />
/etc/init.d/sshd start</p>
<p>exec /bin/bash<br />
EOF<br />
chmod 755 &#8220;$rootfs/bin/lxc_guest_init.sh&#8221;</p>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
