LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: springwind426

LiveCD是这么产生的

[复制链接]
发表于 2009-2-21 22:07:35 | 显示全部楼层
好东西,学习了
回复 支持 反对

使用道具 举报

发表于 2009-2-26 11:54:41 | 显示全部楼层
感谢这么详细的资料。
回复 支持 反对

使用道具 举报

发表于 2009-3-9 20:52:50 | 显示全部楼层
感谢lz,正需要
回复 支持 反对

使用道具 举报

发表于 2009-8-27 10:03:40 | 显示全部楼层

find . | cpio -o -H newc | gzip -9 > /boot/initrd.img-2.6.22.1是什么意

find . | cpio -o -H newc | gzip -9 > /boot/initrd.img-2.6.22.1是什么意思??
Post by springwind426;1744786
[color="Magenta"]属于原创作品,如果转载,请注明出处和作者(springwind@bhu.edu.cn)

[color="Blue"]
内核配置文件和busybox的配置文件,以及squashfs的补丁在附件中
LFS部分是参考LFS-6.3rc1来进行的,需要特别修改的地方已经标明在下面
全程制作过程见附件livecd.sh.gz


[color="Magenta"]glibc-2.5
[color="Red"]安装locale部分,使用自定义方式,只安装下面我需要的locale

  1. mkdir -pv /usr/lib/locale
  2. localedef -i en_US -f ISO-8859-1 en_US
  3. localedef -i en_US -f UTF-8 en_US.UTF-8
  4. localedef -i zh_CN -f GB2312 zh_CN
  5. localedef -i zh_CN -f GBK zh_CN.GBK
  6. localedef -i zh_CN -f GB18030 zh_CN.GB18030
  7. localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
复制代码


[color="Red"]按照晨想版主的建议,使用PRC

  1. cp -v --remove-destination /usr/share/zoneinfo/PRC /etc/localtime
复制代码



[color="Magenta"]第八章

  1. mv -v /etc/udev/rules.d/{75-cd-aliases-generator.rules,../}
  2. mv -v /etc/udev/rules.d/{75-persistent-net-generator.rules,../}
  3. rm -v /etc/udev/rules.d/70-persistent-cd.rules

  4. cat >/etc/udev/rules.d/81-cdrom.rules <<"EOF"
  5. # /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions.

  6. ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", PROGRAM="getcdrom %k", SYMLINK+="cdrom%c", GROUP="cdrom"
  7. EOF
  8. cat >/lib/udev/getcdrom <<"EOF"
  9. #!/bin/sh
  10. i=0
  11. while [ -e /dev/cdrom${i} ]
  12. do
  13.    [ X$(realpath /dev/cdrom${i}) == X/dev/$1 ] && break
  14.    let i=i+1
  15. done
  16. echo $i
  17. exit 0
  18. EOF
  19. chmod 755 /lib/udev/getcdrom
复制代码

[color="Magenta"]解释:
[color="Red"]
1、75-cd-aliases-generator.rules
75-persistent-net-generator.rules
的作用是创建一些静态的规则(写文件),在livecd上没有意义,在liveUSB上,会引起问题(因为每台机器的网卡的MAC都不同,直接导致的后果是每在一台新的机器上运行后,网卡的编号是递增的,比如在A机上启动后,网卡的名字是eth0,可是,到另外一台机器上启动后,网卡是eth1,....,另外,CDROM的名字也有这样的情况发生)
2、修改81-cdrom.rules,作用是在/dev目录下创建cdrom?这样的符号连接,链接到实际的光驱上面,第一个光驱是cdrom0,第二个是cdrom1,依次类推(/lib/udev/getcdrom是一个shell脚本,目的就是获取某个光驱的编号,返回值从0开始)



  1. cat > /etc/sysconfig/clock << "EOF"
  2. # Begin /etc/sysconfig/clock

  3. UTC=0

  4. # End /etc/sysconfig/clock
  5. EOF
复制代码

[color="Magenta"]解释:
[color="Red"]
设置UTC=0,就是使用本地时间,否则看起来别扭,总是差8个小时



  1. echo "HOSTNAME=livecd" > /etc/sysconfig/network
  2. cd /etc/sysconfig/network-devices
  3. mkdir -v ifconfig.eth0
  4. cat > ifconfig.eth0/ipv4 << "EOF"
  5. ONBOOT=yes
  6. SERVICE=ipv4-static
  7. IP=192.168.1.1
  8. GATEWAY=192.168.1.2
  9. PREFIX=24
  10. BROADCAST=192.168.1.255
  11. EOF

  12. cat > /etc/resolv.conf << "EOF"
  13. # Begin /etc/resolv.conf

  14. #domain <Your Domain Name>
  15. nameserver 202.96.64.68
  16. nameserver 202.96.69.38

  17. # End /etc/resolv.conf
  18. EOF

  19. cat > /etc/fstab << "EOF"
  20. # Begin /etc/fstab

  21. # file system  mount-point  type   options         dump  fsck
  22. #                                                        order

  23. #/dev/<xxx>     /            <fff>  defaults        1     1
  24. #/dev/<yyy>     swap         swap   pri=1           0     0
  25. proc           /proc        proc   defaults        0     0
  26. sysfs          /sys         sysfs  defaults        0     0
  27. devpts         /dev/pts     devpts gid=4,mode=620  0     0
  28. shm            /dev/shm     tmpfs  defaults        0     0
  29. # End /etc/fstab
  30. EOF
复制代码

[color="Magenta"]解释:
[color="Red"]
1、设置机器名字为livecd
2、使用静态IP
3、DNS服务器是我使用的,这个需要按照实际情况改动
4、因为是用于liveCD或者liveUSB,因此,在/etc/fstab中是没有/和swap的,因此不需要写


[color="Magenta"]内核编译部分

  1. wget http://nchc.dl.sourceforge.net/sourceforge/squashfs/squashfs3.2-r2.tar.gz
  2. tar xf squashfs3.2-r2.tar.gz
  3. cd linux-2.6.22.1
  4. patch -Np1 -i ../squashfs3.2-r2/kernel-patches/linux-2.6.20/squashfs3.2-patch
  5. cd /sources/squashfs3.2-r2/squashfs-tools
  6. make
  7. cd /sources/linux-2.6.22.1
  8. patch -Np1 -i ../linux-2.6.22.1-squashfs.patch
  9. make
  10. make modules_install
  11. cp -v arch/i386/boot/bzImage /boot/vmlinuz-2.6.22.1
  12. cp -v System.map /boot/System.map-2.6.22.1
  13. cp -v .config /boot/config-2.6.22.1


  14. cd /sources/aufs
  15. make KDIR=/lib/modules/2.6.22.1/build/ -f local.mk
  16. install -m 500 -p mount.aufs umount.aufs auplink aulchown /sbin
  17. echo FLUSH=ALL > /etc/default/auplink
  18. mkdir /lib/modules/2.6.22.1/kernel/fs/aufs
  19. cp aufs.ko /lib/modules/2.6.22.1/kernel/fs/aufs/
  20. depmod -a 2.6.22.1

  21. echo 6.3-rc1 > /etc/lfs-release

  22. #mkinitrd
  23. cd /sources
  24. tar xf busybox-1.5.1.tar.bz2
  25. cd busybox-1.5.1
  26. make defconfig
  27. make

  28. mkdir /initrd
  29. cd /initrd
  30. mkdir bin dev etc lib mnt/{,cdrom,root,roroot,rwroot} proc root sbin sys tmp
  31. chmod 1777 tmp
  32. cp /sbin/{modinfo,udevd,udevtrigger,depmod,modprobe,udevcontrol,udevsettle} sbin/
  33. cp -a /sources/busybox-1.5.1/_install/{bin,sbin} .
  34. cp -a /etc/udev etc/
  35. cp -a /lib/udev lib/
  36. cp -a /lib/{ld-linux.so.2,libc.so.6,libvolume_id.so.0,libvolum_id.so.0.78.0} lib/
  37. mkdir -p lib/modules/2.6.22.1/kernel/{drivers,fs}
  38. cp -a /lib/modules/2.6.22.1/kernel/drivers/{ata,block,cdrom,hid,ide,input,pcmia,scsi,usb} lib/modules/2.6.22.1/kernel/drivers/
  39. cp -a /lib/modules/2.6.22.1/kernel/fs lib/modules/2.6.22.1/kernel/
  40. cat >init <<"EOF"
  41. #!/bin/sh
  42. PATH=/bin:/sbin

  43. mount -t proc proc /proc
  44. mount -t sysfs sysfs /sys

  45. ro=-r
  46. INIT=/sbin/init
  47. ROOTDELAY=
  48. DEBUG=
  49. NOAUFS=

  50. for i in $(cat /proc/cmdline)
  51. do
  52.   case "$i" in
  53.     rootdelay=*)
  54.     ROOTDELAY=${i#rootdelay=}
  55.     ;;
  56.   esac
  57. done

  58. /sbin/depmod -a

  59. echo > /proc/sys/kernel/hotplug
  60. cp -a /lib/udev/devices/* /dev
  61. /sbin/udevd --daemon
  62. /sbin/udevtrigger
  63. /sbin/udevsettle

  64. if [ X$ROOTDELAY != X ]
  65. then
  66.   echo "wait $ROOTDELAY seconds ......"
  67.   sleep $ROOTDELAY
  68. fi

  69. for i in $(cat /proc/cmdline)
  70. do
  71.   case "$i" in
  72.     root=*)
  73.       ROOT=${i#root=}
  74.       case "$ROOT" in
  75.         UUID=*)
  76.           ROOT=${ROOT#UUID=}
  77.           ROOT=$(realpath /dev/disk/by-uuid/$ROOT)
  78.           ;;
  79.         /dev/*)
  80.           ROOT=$ROOT
  81.           ;;
  82.         *)
  83.           ROOT=
  84.       esac
  85.       ;;
  86.     init=*)
  87.       INIT=${i#init=}
  88.       ;;
  89.     ro)
  90.       ro=-r
  91.       ;;
  92.     rw)
  93.       ro=
  94.       ;;
  95.     debug)
  96.       DEBUG=1
  97.       ;;
  98.     noaufs)
  99.       NOAUFS=1
  100.       ;;
  101.   esac
  102. done

  103. if [ X$DEBUG != X ]
  104. then
  105.   echo "enter debug mode..."
  106.   PS1='\[\033[0;34m(debug)\033[0m\]$ ' /bin/sh -i
  107. else
  108.   PS1='\[033[0;31m(initramfs)\033[0m\]$ '
  109.   [ -d /mnt/cdrom ] || mkdir /mnt/cdrom
  110.   [ -d /mnt/root ] || mkdir /mnt/root
  111.   [ -d /mnt/roroot ] || mkdir /mnt/roroot
  112.   [ -d /mnt/rwroot ] || mkdir /mnt/rwroot
  113.   if [ X$ROOT == X ]
  114.   then
  115.     echo "mount cdrom ......"
  116.     modprobe iso9660
  117.     for i in 1 2 4 8
  118.     do
  119.       for CDROM in /dev/cdrom*
  120.       do
  121.         mount -nt iso9660 -o ro $CDROM /mnt/cdrom
  122.         mountpoint -q /mnt/cdrom && break
  123.         [ -f /mnt/cdrom/root.sqfs ] && break
  124.         umount /mnt/cdrom
  125.       done
  126.       [ -f /mnt/cdrom/root.sqfs ] && break
  127.       sleep $i
  128.     done
  129.   else
  130.     echo "mount rootdev(${ROOT}) ......"
  131.     FSTYPE=$(/lib/udev/vol_id -t "${ROOT}" 2> /dev/null)
  132.     if [ X$FSTYPE != X ]
  133.     then   
  134.       modprobe nls_iso8859-1
  135.       modprobe nls_cp437
  136.       modprobe $FSTYPE
  137.       for i in 1 2 4 8
  138.       do
  139.         mount -nt $FSTYPE -o ro $ROOT /mnt/cdrom
  140.         mountpoint -q /mnt/cdrom && break
  141.         sleep $i
  142.       done
  143.     fi
  144.   fi
  145.   mountpoint -q /mnt/cdrom || (echo "no rootdev";/bin/sh -i)

  146.   if [ X$AUFS == X ]
  147.   then
  148.     echo "mount roroot ......"
  149.     mount -o remount,rw /mnt/cdrom
  150.     modprobe loop
  151.     modprobe squashfs
  152.     for i in 1 2 4 8
  153.     do
  154.       mount -nt squashfs -o loop,ro /mnt/cdrom/root.sqfs /mnt/roroot
  155.       mountpoint -q /mnt/roroot && break
  156.       sleep $i
  157.     done
  158.     mountpoint -q /mnt/roroot || (echo "no roroot";/bin/sh -i)

  159.     mount -nt tmpfs -o mode=755 tmpfs /mnt/rwroot
  160.     mountpoint -q /mnt/rwroot || (echo "no tmpfs";/bin/sh -i)

  161.     echo "mount realroot ......"
  162.     modprobe aufs
  163.     for i in 1 2 4 8
  164.     do
  165.       mount -nt aufs -o br:/mnt/rwroot=rw:/mnt/roroot=ro aufsroot /mnt/root
  166.       mountpoint -q /mnt/root && break
  167.       sleep $i
  168.     done
  169.     mountpoint -q /mnt/root || (echo "no root";/bin/sh -i)
  170.     mkdir /mnt/root/mnt/.rootdev
  171.     mount --bind /mnt/cdrom /mnt/root/mnt/.rootdev
  172.     touch /mnt/root/fastboot
  173.     touch /mnt/root/.livecd
  174.   else
  175.     mount -n -o move /mnt/cdrom /mnt/root
  176.   fi

  177.   #start up hook
  178.   [ -f /mnt/cdrom/onboot.sh ] && sh /mnt/cdrom/onboot.sh

  179.   killall udevd
  180.   umount /proc
  181.   umount /sys
  182. fi

  183. exec switch_root /mnt/root $INIT "$@"
  184. EOF
复制代码

[color="Magenta"]解释:
[color="Red"]
1、因为CD和USB的空间有限,因此需要对root文件系统进行压缩,我使用的是squashfs来进行压缩,因为squashfs是只读的,可是实际运行中需要对/文件系统进行写操作,因此使用aufs来挂载/文件系统,将所有的写操作在内存中进行(squashfs和aufs的获取可能通过官方网站的提示进行,我的aufs是通过cvs获取的)
2、initrd使用initramfs,这种initrd比较简单,而且可控性很强,因为启动后,这个initrd就被释放,因此,使用busybox来提供大部分工具,省得复制一些运行库,目的是尽可能减少initrd的空间,不过,因为把一部分内核模块复制到initrd中了,initrd的容量已经比较大了,有20M左右,因此,这部分的减小没有太大意义,不过,如果只是编译内核,使得内核只支持IDE的cdrom的话,和部分USB的光驱,以及部分SATA的光驱的话,内核模块的容量还是比较小的。
3、在复制内核模块的fs部分,实际上只需要复制部分用得着的,比如livecd只需要isofs,aufs,squashfs,liveUSB只需要aufs,squashfs和USB分区的分区类型的相应模块
4、initrd中使用的是udev,只是为了方便,如果有能力的话,可以自己去创建设备节点(那样做有一些麻烦,因为还需要手动去加载相应的内核模块,工作量确实不少),就可以不用udev了


[color="Magenta"]额外工具
[color="Red"]其中一部分是参考BLFS的开发版的手册,其它的都可以从internet上获取

  1. tar xf zhcon-0.2.5.tar.gz
  2. cd zhcon-0.2.5
  3. zcat ../zhcon-0.2.5-to-0.2.6.diff.gz | patch -Np1
  4. ./configure --prefix=/usr --sysconfdir=/etc
  5. make && make install
复制代码

[color="Magenta"]解释:
[color="Red"]因为暂时不想安装X,因此,在控制台下面对中文的支持是必要的


  1. tar xf openssl-0.9.8d.tar.gz
  2. cd openssl-0.9.8d
  3. patch -Np1 -i ../openssl-0.9.8d-fix_manpages-1.patch
  4. make MANDIR=/usr/share/man
  5. make MANDIR=/usr/share/man install
  6. cp -v -r certs /etc/ssl &&
  7. install -v -d -m755 /usr/share/doc/openssl-0.9.8d &&
  8. cp -v -r doc/{HOWTO,README,*.{txt,html,gif}} \
  9.     /usr/share/doc/openssl-0.9.8d
  10. cd /sources/blfs/ && rm -rf openssl-0.9.8d


  11. tar xf wget-1.10.2.tar.gz
  12. cd wget-1.10.2
  13. ./configure --prefix=/usr --sysconfdir=/etc && make && make install
  14. cd /sources/blfs/ && rm -rf wget-1.10.2

  15. tar xf pcre-7.2.tar.bz2
  16. cd pcre-7.2
  17. ./configure --prefix=/usr \
  18.             --docdir=/usr/share/doc/pcre-7.2 \
  19.             --enable-utf8 &&
  20. make &&
  21. make install
  22. mv -v /usr/lib/libpcre.so.* /lib/ &&
  23. ln -v -sf ../../lib/libpcre.so.0 /usr/lib/libpcre.so
  24. cd /sources/blfs/ && rm -rf pcre-7.2


  25. cat > /usr/bin/which << "EOF"
  26. #!/bin/bash
  27. type -pa "$@" | head -n 1 ; exit ${PIPESTATUS[0]}
  28. EOF
  29. chmod -v 755 /usr/bin/which
  30. chown -v root:root /usr/bin/which

  31. tar xf pkg-config-0.22.tar.gz
  32. cd pkg-config-0.22
  33. ./configure --prefix=/usr && make && make install
  34. cd /sources/blfs/ && rm -rf pkg-config-0.22

  35. tar xf cpio-2.9.tar.bz2
  36. cd cpio-2.9
  37. ./configure CPIO_MT_PROG=mt \
  38.             --prefix=/usr \
  39.             --bindir=/bin \
  40.             --libexecdir=/tmp \
  41.             --with-rmt=/usr/sbin/rmt &&
  42. make && make install
  43. cd /sources/blfs/ && rm -rf cpio-2.9

  44. tar xf pciutils-2.2.3.tar.bz2
  45. cd pciutils-2.2.3
  46. sed -i 's/null ;/null 2>\&1 ;/' update-pciids.sh &&
  47. make PREFIX=/usr &&
  48. make PREFIX=/usr install &&
  49. install -v -m 755 -d /usr/include/pci &&
  50. install -v -m 644 lib/libpci.a /usr/lib &&
  51. install -v -m 644 lib/*.h /usr/include/pci
  52. update-pciids
  53. cd /sources/blfs/ && rm -rf pciutils-2.2.3

  54. tar xf gc6.8.tar.gz
  55. cd gc6.8
  56. sed -i "s|\$(datadir)/@PACKAGE@|&-6.8|" doc/Makefile.in &&
  57. ./configure --prefix=/usr \
  58.     --datadir=/usr/share/doc --enable-cplusplus &&
  59. make && make install &&
  60. install -v -m644 doc/gc.man /usr/share/man/man3/gc_malloc.3 &&
  61. ln -v -s gc_malloc.3 /usr/share/man/man3/gc.3 &&
  62. cd /sources/blfs/ && rm -rf gc6.8

  63. tar xf w3m-0.5.2.tar.gz
  64. cd w3m-0.5.2
  65. ./configure --prefix=/usr \
  66.             --libexecdir=/usr/lib \
  67.             --sysconfdir=/etc &&
  68. make && make install &&
  69. install -v -m644 -D doc/keymap.default /etc/w3m/keymap &&
  70. install -v -m644    doc/menu.default /etc/w3m/menu &&
  71. install -v -m755 -d /usr/share/doc/w3m-0.5.2 &&
  72. install -v -m644    doc/{HISTORY,READ*,keymap.*,menu.*,*.html} \
  73.                     /usr/share/doc/w3m-0.5.2
  74. cd /sources/blfs/ && rm -rf w3m-0.5.2


  75. tar xf screen-4.0.3.tar.gz
  76. cd screen-4.0.3
  77. ./configure --prefix=/usr --with-socket-dir=/var/run/screen \
  78.     --with-sys-screenrc=/etc/screenrc &&
  79. sed -i -e "s%/usr/local/etc/screenrc%/etc/screenrc%" {etc,doc}/* &&
  80. make && make install &&
  81. install -m 644 etc/etcscreenrc /etc/screenrc
  82. cd /sources/blfs/ && rm -rf screen-4.0.3


  83. tar xf openssh-4.6p1.tar.gz
  84. cd openssh-4.6p1
  85. install -v -m700 -d /var/lib/sshd &&
  86. chown -v root:sys /var/lib/sshd &&
  87. groupadd -g 50 sshd &&
  88. useradd -c 'sshd PrivSep' -d /var/lib/sshd -g sshd \
  89.     -s /bin/false -u 50 sshd
  90. sed -i "s:-lcrypto:/usr/lib/libcrypto.a -ldl:g" configure
  91. sed -i "s/lkrb5 -ldes/lkrb5/" configure &&
  92. ./configure --prefix=/usr --sysconfdir=/etc/ssh \
  93.     --libexecdir=/usr/lib/openssh --with-md5-passwords \
  94.     --with-privsep-path=/var/lib/sshd &&
  95. make && make install &&
  96. install -v -m755 -d /usr/share/doc/openssh-4.6p1 &&
  97. install -v -m644 INSTALL LICENCE OVERVIEW README* WARNING.RNG \
  98.     /usr/share/doc/openssh-4.6p1
  99. cd /sources/blfs/ && rm -rf openssh-4.6p1


  100. tar xf dhcp-3.0.5.tar.gz
  101. cd dhcp-3.0.5
  102. patch -Np1 -i ../dhcp-3.0.5-client_dns-1.patch
  103. patch -Np1 -i ../dhcp-3.0.5-iproute2-1.patch
  104. ./configure &&
  105. make &&
  106. make LIBDIR=/usr/lib INCDIR=/usr/include install
  107. cat > /etc/dhclient.conf << "EOF"
  108. # dhclient.conf

  109. interface "eth0"{
  110. prepend domain-name-servers 127.0.0.1;
  111. request subnet-mask, broadcast-address, time-offset, routers,
  112.         domain-name, domain-name-servers, host-name;
  113. require subnet-mask, domain-name-servers;
  114. }
  115. # end dhclient.conf
  116. EOF
  117. cd /sources/blfs/ && rm -rf dhcp-3.0.5
  118. cat > /etc/sysconfig/network-devices/dhclient.example << "EOF"
  119. ONBOOT="yes"
  120. SERVICE="dhclient"
  121. DHCP_START="-q <add additional start parameters here>"
  122. DHCP_STOP="-q -r <add additional stop parameters here>"

  123. # Set PRINTIP="yes" to have the script print
  124. # the DHCP assigned IP address
  125. PRINTIP="no"

  126. # Set PRINTALL="yes" to print the DHCP assigned values for
  127. # IP, SM, DG, and 1st NS. This requires PRINTIP="yes".
  128. PRINTALL="no"
  129. EOF

  130. tar xf ppp-2.4.4.tar.gz &&
  131. cd ppp-2.4.4 &&
  132. ./configure --prefix=/usr &&
  133. make &&
  134. make install &&
  135. make install-etcppp &&
  136. cd /sources/blfs/ && rm -rf ppp-2.4.4


  137. tar xf rp-pppoe-3.8.tar.gz &&
  138. cd rp-pppoe-3.8 &&
  139. patch -Np1 -i ../rp-pppoe-3.8-iproute2-1.patch &&
  140. sed -i s%/usr/bin/logger%/bin/logger% scripts/pppoe-{connect,setup,stop}.in &&
  141. cd src &&
  142. ./configure &&
  143. make &&
  144. make install &&
  145. cat > /etc/sysconfig/network-devices/pppoe-example << "EOF"
  146. ONBOOT="yes"
  147. SERVICE="pppoe"
  148. EOF
  149. cd /sources/blfs/ && rm -rf rp-pppoe-3.8
  150. cd blfs-bootscripts-20070726 &&
  151. make install-service-pppoe &&
  152. cd /sources/blfs

  153. tar xf libpcap-0.9.6.tar.gz &&
  154. cd libpcap-0.9.6 &&
  155. ./configure --prefix=/usr &&
  156. make &&
  157. make install &&
  158. install -v -m755 -d /usr/share/doc/libpcap-0.9.6 &&
  159. install -v -m644 doc/* /usr/share/doc/libpcap-0.9.6 &&
  160. cd /sources/blfs/ && rm -rf libpcap-0.9.6


  161. tar xf wireless_tools.28.tar.gz &&
  162. cd wireless_tools.28 &&
  163. make &&
  164. make install &&
  165. cd /sources/blfs/ && rm -rf wireless_tools.28


  166. tar xf glib-2.12.12.tar.bz2 &&
  167. cd glib-2.12.12 &&
  168. ./configure --prefix=/usr &&
  169. make &&
  170. make install &&
  171. cat > /etc/profile.d/glib2-locale.sh << "EOF"
  172. # Use the current locale charset for filenames
  173. # in applications using GLib
  174. export G_FILENAME_ENCODING=@locale
  175. EOF
  176. cd /sources/blfs/ && rm -rf glib-2.12.12


  177. tar xf wireshark-0.99.6.tar.bz2 &&
  178. cd wireshark-0.99.6 &&
  179. ./configure --prefix=/usr \
  180.             --sysconfdir=/etc \
  181.             --enable-threads \
  182.             --disable-wireshark &&
  183. make &&
  184. make install &&
  185. install -v -m755 -d /usr/share/doc/wireshark-0.99.6 &&
  186. install -v -m644    FAQ README{,.linux} doc/README.* doc/*.{pod,txt} \
  187.                     /usr/share/doc/wireshark-0.99.6 &&
  188. pushd /usr/share/doc/wireshark-0.99.6 &&
  189. for FILENAME in ../../wireshark/*.html; do \
  190.     ln -s -v $FILENAME .
  191. done &&
  192. popd &&
  193. cd /sources/blfs/ && rm -rf wireshark-0.99.6

  194. tar xf nmap-4.20.tar.bz2 &&
  195. cd nmap-4.20 &&
  196. ./configure --prefix=/usr --without-nmapfe &&
  197. make &&
  198. make install &&
  199. cd /sources/blfs/ && rm -rf nmap-4.20


  200. tar xf traceroute-1.4a12.tar.gz &&
  201. cd traceroute-1.4a12 &&
  202. sed -i -e 's/-o bin/-o root/' Makefile.in &&
  203. ./configure --prefix=/usr &&
  204. make &&
  205. make install &&
  206. make install-man &&
  207. cd /sources/blfs/ && rm -rf traceroute-1.4a12

  208. tar xf whois_4.7.21.tar.gz &&
  209. cd whois-4.7.21 &&
  210. make &&
  211. make prefix=/usr install &&
  212. cd /sources/blfs/ && rm -rf whois-4.7.21

  213. tar xf bind-9.4.1-P1.tar.gz &&
  214. cd bind-9.4.1-P1 &&
  215. ./configure --prefix=/usr &&
  216. make -C lib/dns &&
  217. make -C lib/isc &&
  218. make -C lib/bind9 &&
  219. make -C lib/isccfg &&
  220. make -C lib/lwres &&
  221. make -C bin/dig &&
  222. make -C bin/dig install &&
  223. cd /sources/blfs/ && rm -rf bind-9.4.1-P1

  224. tar xf lftp-3.5.12.tar.bz2 &&
  225. cd lftp-3.5.12 &&
  226. ./configure --prefix=/usr &&
  227. make &&
  228. make install &&
  229. cd /sources/blfs/ && rm -rf lftp-3.5.12

  230. groupadd -g 46 proftpd &&
  231. useradd -c proftpd -d /srv/ftp -g proftpd \
  232.         -s /usr/bin/proftpdshell -u 46 proftpd &&
  233. install -v -d -m775 -o proftpd -g proftpd /srv/ftp &&
  234. ln -v -s /bin/false /usr/bin/proftpdshell &&
  235. echo /usr/bin/proftpdshell >> /etc/shells &&
  236. tar xf proftpd-1.3.0.tar.bz2 &&
  237. cd proftpd-1.3.0 &&
  238. ./configure --prefix=/usr --sysconfdir=/etc \
  239.     --localstatedir=/var/run &&
  240. make &&
  241. make install &&
  242. cat > /etc/proftpd.conf << "EOF"
  243. # This is a basic ProFTPD configuration file
  244. # It establishes a single server and a single anonymous login.

  245. ServerName                      "ProFTPD Default Installation"
  246. ServerType                      standalone
  247. DefaultServer                   on

  248. # Port 21 is the standard FTP port.
  249. Port                            21
  250. # Umask 022 is a good standard umask to prevent new dirs and files
  251. # from being group and world writable.
  252. Umask                           022

  253. # To prevent DoS attacks, set the maximum number of child processes
  254. # to 30.  If you need to allow more than 30 concurrent connections
  255. # at once, simply increase this value.  Note that this ONLY works
  256. # in standalone mode, in inetd mode you should use an inetd server
  257. # that allows you to limit maximum number of processes per service
  258. # (such as xinetd)
  259. MaxInstances                    30

  260. # Set the user and group that the server normally runs at.
  261. User                            proftpd
  262. Group                           proftpd

  263. # Normally, files should be overwritable.
  264. <Directory /*>
  265.   AllowOverwrite                on
  266. </Directory>

  267. # A basic anonymous configuration, no upload directories.
  268. <Anonymous ~proftpd>
  269.   User                          proftpd
  270.   Group                         proftpd
  271.   # Clients should be able to login with "anonymous" as well as "proftpd"
  272.   UserAlias                     anonymous proftpd

  273.   # Limit the maximum number of anonymous logins
  274.   MaxClients                    10

  275.   # 'welcome.msg' should be displayed at login, and '.message' displayed
  276.   # in each newly chdired directory.
  277.   DisplayLogin                  welcome.msg
  278.   DisplayFirstChdir             .message

  279.   # Limit WRITE everywhere in the anonymous chroot
  280.   <Limit WRITE>
  281.     DenyAll
  282.   </Limit>
  283. </Anonymous>
  284. EOF
  285. cd /sources/blfs/ && rm -rf proftpd-1.3.0
  286. cd /sources/blfs/blfs-bootscripts-20070726
  287. make install-proftpd
  288. cd /sources/blfs

  289. tar xf gpm-1.20.1.tar.bz2 &&
  290. cd gpm-1.20.1 &&
  291. patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
  292. patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
  293. ./configure --prefix=/usr --sysconfdir=/etc &&
  294. LDFLAGS="-lm" make &&
  295. make install &&
  296. cp -v conf/gpm-root.conf /etc &&
  297. ldconfig &&
  298. cat > /etc/sysconfig/mouse << "EOF"
  299. # Begin /etc/sysconfig/mouse

  300. MDEVICE="/dev/input/mouse0"
  301. PROTOCOL="imps2"
  302. GPMOPTS=""

  303. # End /etc/sysconfig/mouse
  304. EOF
  305. cd /sources/blfs/ && rm -rf gpm-1.20.1
  306. cd /sources/blfs/blfs-bootscripts-20070726
  307. make install-gpm
  308. cd /sources/blfs

  309. tar xf slang-2.1.1.tar.bz2 &&
  310. cd slang-2.1.1 &&
  311. ./configure --prefix=/usr --sysconfdir=/etc &&
  312. make &&
  313. make install_doc_dir=/usr/share/doc/slang-2.1.1 install-all &&
  314. chmod -v 755 /usr/lib/libslang.so.2.1.1 \
  315.              /usr/lib/slang/v2/modules/*.so &&
  316. cd /sources/blfs/ && rm -rf slang-2.1.1

  317. tar xf mc-4.6.1.tar.gz &&
  318. cd mc-4.6.1 &&
  319. patch -Np1 -i ../mc-4.6.1-bash32-1.patch &&
  320. patch -Np1 -i ../mc-4.6.1-debian_fixes-1.patch &&
  321. CPPFLAGS="-DUTF8" ./configure --prefix=/usr \
  322.             --enable-charset &&
  323. make &&
  324. convert-mans ISO-8859-1 UTF-8 lib/mc.hint{,.es,.it,.nl} &&
  325. convert-mans ISO-8859-2 UTF-8 lib/mc.hint{.cs,.hu,.pl} &&
  326. convert-mans ISO-8859-5 UTF-8 lib/mc.hint.sr &&
  327. convert-mans KOI8-R UTF-8 lib/mc.hint.ru &&
  328. convert-mans KOI8-U UTF-8 lib/mc.hint.uk &&
  329. convert-mans BIG5 UTF-8 lib/mc.hint.zh &&
  330. convert-mans ISO-8859-1 UTF-8 doc/{es,it}/mc.hlp.* &&
  331. convert-mans ISO-8859-2 UTF-8 doc/{hu,pl}/mc.hlp.* &&
  332. convert-mans ISO-8859-5 UTF-8 doc/sr/mc.hlp.sr &&
  333. convert-mans KOI8-R UTF-8 doc/ru/mc.hlp.ru &&
  334. make install &&
  335. chmod 1755 /usr/lib/mc/cons.saver &&
  336. cd /sources/blfs/ && rm -rf mc-4.6.1

  337. #comiple p7zip need nasm
  338. #wget "http://downloads.sourceforge.net/nasm/nasm-0.99.01.tar.bz2?modtime=1180529807&big_mirror=0"
  339. tar xf nasm-0.99.01.tar.bz2 &&
  340. cd nasm-0.99.01 &&
  341. ./configure && make &&
  342. cp nasm /usr/local/bin/ &&
  343. cd /sources/blfs/ && rm -rf nasm-0.99.01

  344. tar xf p7zip_4.51_src_all.tar.bz2 &&
  345. cd p7zip_4.51 &&
  346. cp makefile.linux_x86_asm_gcc_4.X makefile.machine &&
  347. make clean &&
  348. make all3 &&
  349. sed -i "s@DEST_HOME=/usr/local@DEST_HOME=/usr@" install.sh &&
  350. ./install.sh &&
  351. cd /sources/blfs/ && rm -rf p7zip_4.51

  352. tar xf fuse-2.7.0.tar.gz &&
  353. cd fuse-2.7.0 &&
  354. ./configure --disable-kernel-module --prefix=/usr &&
  355. make &&
  356. make install &&
  357. cd /sources/blfs/ && rm -rf fuse-2.7.0

  358. tar xf sshfs-fuse-1.8.tar.gz &&
  359. cd sshfs-fuse-1.8 &&
  360. ./configure --prefix=/usr &&
  361. make &&
  362. make install &&
  363. cd /sources/blfs/ && rm -rf sshfs-fuse-1.8

  364. tar xf curl-7.16.3.tar.bz2 &&
  365. cd curl-7.16.3 &&
  366. ./configure --prefix=/usr &&
  367. make &&
  368. make install &&
  369. find docs -name "Makefile*" -o -name "*.1" -o -name "*.3" | xargs rm &&
  370. install -v -d -m755 /usr/share/doc/curl-7.16.3 &&
  371. cp -v -R docs/* /usr/share/doc/curl-7.16.3 &&
  372. cd /sources/blfs/ && rm -rf curl-7.16.3

  373. #wget "http://downloads.sourceforge.net/curlftpfs/curlftpfs-0.9.1.tar.gz?modtime=1175788159&big_mirror=0"
  374. tar xf curlftpfs-0.9.1.tar.gz &&
  375. cd curlftpfs-0.9.1 &&
  376. ./configure --prefix=/usr &&
  377. make &&
  378. make install &&
  379. cd /sources/blfs/ && rm -rf curlftpfs-0.9.1

  380. tar xf ntfs-3g-1.710.tgz &&
  381. cd ntfs-3g-1.710 &&
  382. ./configure --prefix=/usr &&
  383. make &&
  384. make install &&
  385. cd /sources/blfs/ && rm -rf ntfs-3g-1.710
复制代码

[color="Magenta"]解释:
[color="Red"]
我只是安装一些我觉得有用的工具,具体应该安装哪些,视各人喜好而定
1、wget,lftp可以用来下载文件和访问ftp服务器
2、w3m可以浏览网页
3、screen是一个可爱的工具
4、openssh,proftpd分别提供ssh服务和ftp服务
5、dhcp可以动态获取IP,在很多场合下是必要的
6、rp-pppoe可以提供ADSL拨号功能
7、wireless-tool可以提供对无线网卡的控制(内核中已经把大部分无线网卡的驱动编译成模块了)
8、nmap,wireshark是网络工具
9、sshfs,curlftpfs,ntfs-3g是一些可爱的工具,sshfs可以通过ssh将远程主机上的文件系统挂载到本地;curlftpfs可以将远程FTP上的目录挂载到本地;ntfs-3g可以提供对ntfs的读写操作
10、cpio,p7zip是压缩解压工具,p7zip可以支持大部分的压缩格式
11、gpm支持控制台下面使用鼠标(启动后,我发现在/dev/input下面有鼠标的设备节点,分别是mouse0,mouse1....,所以就在配置文件中使用了/dev/input/mouse0作为鼠标的设备节点了)
12、mc是一个大部分人都说好的工具

[color="Blue"]期待您的参与,给提供一些好的工具,以便添加到livecd中




[color="Magenta"]修正启动脚本中的一点问题

  1. ln -sf /proc/mounts /etc/mtab

  2. cat > /etc/rc.d/init.d/mountfs <<"EOF"
  3. #!/bin/sh
  4. ########################################################################
  5. # Begin $rc_base/init.d/mountfs
  6. #
  7. # Description : File System Mount Script
  8. #
  9. # Authors     : Gerard Beekmans - gerard@linuxfromscratch.org
  10. #
  11. # Version     : 00.00
  12. #
  13. # Notes       :
  14. #
  15. ########################################################################

  16. . /etc/sysconfig/rc
  17. . ${rc_functions}

  18. case "${1}" in
  19.         start)
  20.                 boot_mesg "Remounting root file system in read-write mode..."
  21.                 [ -f /.livecd ] || mount -n -o remount,rw / >/dev/null 2>&1
  22.                 evaluate_retval

  23.                 # Remove fsck-related file system watermarks.
  24.                 rm -f /fastboot /forcefsck /.livecd

  25.                 # This will mount all filesystems that do not have _netdev in
  26.                 # their option list.  _netdev denotes a network filesystem.
  27.                 boot_mesg "Mounting remaining file systems..."
  28.                 mount -an -O no_netdev >/dev/null 2>&1
  29.                 evaluate_retval
  30.                 ;;

  31.         stop)
  32.                 boot_mesg "Unmounting all other currently mounted file systems..."
  33.                 umount -a -d -r >/dev/null 2>&1
  34.                 evaluate_retval
  35.                 ;;

  36.         *)
  37.                 echo "Usage: ${0} {start|stop}"
  38.                 exit 1
  39.                 ;;
  40. esac

  41. # End $rc_base/init.d/mountfs
  42. EOF
复制代码

[color="Magenta"]解释:
[color="Red"]
因为livecd使用的方式有些特别,因此,在mountfs中运行的一些脚本可能出现错误(不影响实际的使用)
在livecd的initrd中已经挂载了/文件系统,并且是可写的,因此,在mountfs中就不需要重新以rw方式挂载/了


[color="Magenta"]设置一些必要的配置文件(来自BLFS手册)

  1. cat > /etc/profile << "EOF"
  2. # Begin /etc/profile
  3. # Written for Beyond Linux From Scratch
  4. # by James Robertson <jameswrobertson@earthlink.net>
  5. # modifications by Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>

  6. # System wide environment variables and startup programs.

  7. # System wide aliases and functions should go in /etc/bashrc.  Personal
  8. # environment variables and startup programs should go into
  9. # ~/.bash_profile.  Personal aliases and functions should go into
  10. # ~/.bashrc.

  11. # Functions to help us manage paths.  Second argument is the name of the
  12. # path variable to be modified (default: PATH)
  13. pathremove () {
  14.         local IFS=':'
  15.         local NEWPATH
  16.         local DIR
  17.         local PATHVARIABLE=${2:-PATH}
  18.         for DIR in ${!PATHVARIABLE} ; do
  19.                 if [ "$DIR" != "$1" ] ; then
  20.                   NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
  21.                 fi
  22.         done
  23.         export $PATHVARIABLE="$NEWPATH"
  24. }

  25. pathprepend () {
  26.         pathremove $1 $2
  27.         local PATHVARIABLE=${2:-PATH}
  28.         export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
  29. }

  30. pathappend () {
  31.         pathremove $1 $2
  32.         local PATHVARIABLE=${2:-PATH}
  33.         export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
  34. }


  35. # Set the initial path
  36. export PATH=/bin:/usr/bin

  37. if [ $EUID -eq 0 ] ; then
  38.         pathappend /sbin:/usr/sbin
  39.         unset HISTFILE
  40. fi

  41. # Setup some environment variables.
  42. export HISTSIZE=1000
  43. export HISTIGNORE="&:[bf]g:exit"

  44. # Setup a red prompt for root and a green one for users.
  45. NORMAL="\[\e[0m\]"
  46. RED="\[\e[1;31m\]"
  47. GREEN="\[\e[1;32m\]"
  48. if [[ $EUID == 0 ]] ; then
  49.   PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
  50. else
  51.   PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
  52. fi

  53. for script in /etc/profile.d/*.sh ; do
  54.         if [ -r $script ] ; then
  55.                 . $script
  56.         fi
  57. done

  58. # Now to clean up
  59. unset pathremove pathprepend pathappend

  60. # End /etc/profile
  61. EOF
  62. install --directory --mode=0755 --owner=root --group=root /etc/profile.d
  63. cat > /etc/profile.d/dircolors.sh << "EOF"
  64. # Setup for /bin/ls to support color, the alias is in /etc/bashrc.
  65. if [ -f "/etc/dircolors" ] ; then
  66.         eval $(dircolors -b /etc/dircolors)

  67.         if [ -f "$HOME/.dircolors" ] ; then
  68.                 eval $(dircolors -b $HOME/.dircolors)
  69.         fi
  70. fi
  71. alias ls='ls --color=auto'
  72. EOF
  73. cat > /etc/profile.d/readline.sh << "EOF"
  74. # Setup the INPUTRC environment variable.
  75. if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
  76.         INPUTRC=/etc/inputrc
  77. fi
  78. export INPUTRC
  79. EOF
  80. cat > /etc/profile.d/umask.sh << "EOF"
  81. # By default we want the umask to get set.
  82. if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
  83.   umask 002
  84. else
  85.   umask 022
  86. fi
  87. EOF
  88. cat > /etc/profile.d/i18n.sh << "EOF"
  89. # Set up i18n variables
  90. export LANG=zh_CN.UTF-8
  91. EOF
  92. cat > /etc/bashrc << "EOF"
  93. # Begin /etc/bashrc
  94. # Written for Beyond Linux From Scratch
  95. # by James Robertson <jameswrobertson@earthlink.net>
  96. # updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>

  97. # System wide aliases and functions.

  98. # System wide environment variables and startup programs should go into
  99. # /etc/profile.  Personal environment variables and startup programs
  100. # should go into ~/.bash_profile.  Personal aliases and functions should
  101. # go into ~/.bashrc

  102. # Provides a colored /bin/ls command.  Used in conjunction with code in
  103. # /etc/profile.

  104. alias ls='ls --color=auto'

  105. # Provides prompt for non-login shells, specifically shells started
  106. # in the X environment. [Review the LFS archive thread titled
  107. # PS1 Environment Variable for a great case study behind this script
  108. # addendum.]

  109. NORMAL="\[\e[0m\]"
  110. RED="\[\e[1;31m\]"
  111. GREEN="\[\e[1;32m\]"
  112. if [[ $EUID == 0 ]] ; then
  113.   PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
  114. else
  115.   PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
  116. fi

  117. # End /etc/bashrc
  118. EOF
  119. cat > ~/.bash_profile << "EOF"
  120. # Begin ~/.bash_profile
  121. # Written for Beyond Linux From Scratch
  122. # by James Robertson <jameswrobertson@earthlink.net>
  123. # updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>

  124. # Personal environment variables and startup programs.

  125. # Personal aliases and functions should go in ~/.bashrc.  System wide
  126. # environment variables and startup programs are in /etc/profile.
  127. # System wide aliases and functions are in /etc/bashrc.

  128. append () {
  129.   # First remove the directory
  130.   local IFS=':'
  131.   local NEWPATH
  132.   for DIR in $PATH; do
  133.      if [ "$DIR" != "$1" ]; then
  134.        NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
  135.      fi
  136.   done

  137.   # Then append the directory
  138.   export PATH=$NEWPATH:$1
  139. }

  140. if [ -f "$HOME/.bashrc" ] ; then
  141.   source $HOME/.bashrc
  142. fi

  143. if [ -d "$HOME/bin" ] ; then
  144.   append $HOME/bin
  145. fi

  146. unset append

  147. # End ~/.bash_profile
  148. EOF
  149. cat > ~/.bashrc << "EOF"
  150. # Begin ~/.bashrc
  151. # Written for Beyond Linux From Scratch
  152. # by James Robertson <jameswrobertson@earthlink.net>

  153. # Personal aliases and functions.

  154. # Personal environment variables and startup programs should go in
  155. # ~/.bash_profile.  System wide environment variables and startup
  156. # programs are in /etc/profile.  System wide aliases and functions are
  157. # in /etc/bashrc.

  158. if [ -f "/etc/bashrc" ] ; then
  159.   source /etc/bashrc
  160. fi

  161. # End ~/.bashrc
  162. EOF

  163. dircolors -p > /etc/dircolors

  164. cat > /etc/shells << "EOF"
  165. # Begin /etc/shells

  166. /bin/sh
  167. /bin/bash
  168. /sbin/nologin
  169. /usr/bin/proftpdshell

  170. # End /etc/shells
  171. EOF
复制代码


[color="Magenta"]创建initrd和ISO

  1. cd /initrd
  2. find . | cpio -o -H newc | gzip -9 > /boot/initrd.img-2.6.22.1

  3. umount $LFS/{proc,sys,dev/shm,dev/pts,dev} [color="red"]#在宿主系统中执行[/color]

  4. /sources/squashfs3.2-r2/squashfs-tools/mksquashfs bin boot dev etc home lib media mnt opt proc root sbin srv sys tmp usr var /sources/root.sqfs
复制代码


[color="Magenta"]下面代码需要在宿主系统中操作

  1. cd $LFS
  2. mkdir -p isolinux/boot/grub
  3. cp ${LFS}/boot/{initrd.img-2.6.22.1,vmlinuz-2.6.22.1} isolinux/boot/
  4. cp ${LFS}/usr/lib/grub/i386-pc/{stage2_eltorito,stage1,stage2} isolinux/boot/grub/
  5. cp ${LFS}/sources/root.sqfs isolinux/
  6. cat > isolinux/boot/grub/menu.lst <<"EOF"
  7. default 0
  8. timeout 5

  9. title lfs(kernel 2.6.22.1)
  10.   kernel /boot/vmlinuz-2.6.22.1 vga=788
  11.   initrd /boot/initrd.img-2.6.22.1
  12. EOF
  13. mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o lfs.iso isolinux
复制代码


[color="Magenta"]至此,liveCD已经完成,$LFS目录下的lfs.iso就是最终的光盘映象文件,可以用虚拟机挂载上,看看效果了


[color="Blue"]因为写得仓促,如有错误之处,敬请指正
回复 支持 反对

使用道具 举报

发表于 2009-8-27 12:59:29 | 显示全部楼层

我用mksquashfs命令的时候怎么老死机啊???

我用mksquashfs命令的时候怎么老死机啊???
回复 支持 反对

使用道具 举报

发表于 2009-8-27 13:44:29 | 显示全部楼层
空间不足了!!
回复 支持 反对

使用道具 举报

发表于 2009-8-27 19:18:31 | 显示全部楼层
楼上发帖请注意用字!
回复 支持 反对

使用道具 举报

发表于 2009-8-28 13:24:49 | 显示全部楼层
想问一下你们initrd里面是不是自己的文件系统??
回复 支持 反对

使用道具 举报

发表于 2010-4-5 00:30:56 | 显示全部楼层

先做个记号,正需要

先做个记号,正需要
回复 支持 反对

使用道具 举报

发表于 2010-4-12 03:02:13 | 显示全部楼层
记号,哈哈。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表