QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 865|回复: 4

一起来研究

[复制链接]
发表于 2004-11-13 18:48:27 | 显示全部楼层 |阅读模式
这是slax中制作initrd的脚本,有问题请教大家:
==========================================================[code:1]
#!/bin/bash
#
# initrd_create:  make initrd rootdisk
#
# Author:   Tomas Matejicek <http://www.linux-live.org>
# Chinese Patch Author: atfa <http://doc.linuxfans.org>
#

. ../config || exit 1
. ./liblinuxlive || exit 1

KERNEL=`/bin/uname -r`

echo "creating empty image file initrd.img..."
dd if=/dev/zero of=$INITRDIMG bs=1024 count=$RAM0SIZE >/dev/null 2>/dev/null

echo "making filesystem..."
mkfs -t ext2 -F -m 0 -i 1024 $INITRDIMG >/dev/null 2>/dev/null

echo "creating empty directory $MOUNTDIR..."
rm -Rf $MOUNTDIR
mkdir $MOUNTDIR

echo "mounting initrd.img to it..."
mount -o loop $INITRDIMG $MOUNTDIR

echo "creating directories..."
rmdir $MOUNTDIR/lost+found
mkdir -p $MOUNTDIR/{etc,dev,bin,mnt,proc,sbin,lib,tmp,usr/bin,usr/sbin}

echo "copying files to the rootdisk (this may take some time)..."
touch $MOUNTDIR/etc/{m,fs}tab
cp {linuxrc,liblinuxlive} $MOUNTDIR # symlink will be copied as original file
chmod a+x $MOUNTDIR/linuxrc

# find all lib dependences
for BINARY in cp chmod touch tar gzip gunzip rm bash sh mount umount mv cut \
              mkdir rmdir ls ln echo cat grep egrep fdisk blockdev sed\
       pivot_root insmod lsmod modprobe depmod swapon eject tail tr \
       chroot readlink basename dirname test sleep [ ;
do
   for LOCATION in /bin /sbin /usr/bin /usr/sbin ;
   do
      if [ -r "$LOCATION/$BINARY" ]; then
         rcopy "$LOCATION/$BINARY" "$MOUNTDIR"

         list_libs "$LOCATION/$BINARY" | sort | uniq | while read LIB; do
            if [ ! -a "$MOUNTDIR/$LIB" ]; then
               rcopy "$LIB" "$MOUNTDIR"
     fi
  done
      fi
   done
done

# this line can be safely removed when using 2.6 kernel
cp -R /sbin/*.old $MOUNTDIR/sbin 2>/dev/null

#filesize script by using ls + cut
echo -ne "#!/bin/bash\necho \`ls -ol \"\$1\"\` | cut -d \" \" -f 4" >$MOUNTDIR/bin/filesize
chmod 0755 $MOUNTDIR/bin/filesize

LMK="lib/modules/$KERNEL"

#necessary modules and dependency files
rcopy /$LMK/kernel/fs/ovlfs $MOUNTDIR

#copy filesystem modules, if not directly copied into kernel
rcopy /$LMK/kernel/fs/ntfs $MOUNTDIR 2>/dev/null
rcopy /$LMK/kernel/fs/ext3 $MOUNTDIR 2>/dev/null
rcopy /$LMK/kernel/fs/reiserfs $MOUNTDIR 2>/dev/null

#usb modules
rcopy /$LMK/kernel/drivers/usb/usbcore.* $MOUNTDIR 2>/dev/null
rcopy /$LMK/kernel/drivers/usb/host $MOUNTDIR 2>/dev/null
rcopy /$LMK/kernel/drivers/usb/storage $MOUNTDIR 2>/dev/null

#disk (ide, raid, pcmcia, pnp, ide-scsi) modules
rcopy /$LMK/kernel/drivers/ide $MOUNTDIR
rcopy /$LMK/kernel/drivers/pcmcia $MOUNTDIR
rcopy /$LMK/kernel/drivers/pnp $MOUNTDIR
rcopy /$LMK/kernel/drivers/scsi/ide-scsi.* $MOUNTDIR

chroot $MOUNTDIR depmod -a 2>/dev/null # some dependences may be missing

echo "unmounting $MOUNTDIR and gzipping initrd.img..."
umount $MOUNTDIR
gzip --best $INITRDIMG

echo "deleting directory $MOUNTDIR..."
rm -Rf $MOUNTDIR[/code:1]
 楼主| 发表于 2004-11-13 18:53:06 | 显示全部楼层
问题是将所有的文件复制完后,怎样制作的initrd.img?
[code:1]
echo "creating empty image file initrd.img..."
dd if=/dev/zero of=$INITRDIMG bs=1024 count=$RAM0SIZE >/dev/null 2>/dev/null

echo "making filesystem..."
mkfs -t ext2 -F -m 0 -i 1024 $INITRDIMG >/dev/null 2>/dev/null
[/code:1]
这两段中bs=1024是什么意思,1024创建的磁盘是6.6M,怎么算的?
回复

使用道具 举报

发表于 2004-11-13 19:36:38 | 显示全部楼层
关于 bs=1024,count=$RAM0SIZE ,可以看看CMAN:
DD

Section: User Commands (1)
Updated: November 1998
Index Return to Main Contents
   

NAME

dd - 转换和拷贝文件   

摘要

dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks] [seek=blocks] [count=blocks] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]   

描述

当进行非强制的转换的时候,使用指定的输入和输出块大小拷贝文件 (默认是从标准输入到标准输出。)

它每次从输入读取指定大小的一个块(默认是512字节)。 如果使用 bs=bytes 选项,并且没有转换,除了指定 sync, noerror, 或 notrunc 之外, 那么dd将把全部读到的数据(可以比请求读的少) 写到独立的输出块去。 这个输出块的长度和读到的数据 完全一样,除非指定使用 sync(同步) 转换,那样的话,数据结尾处将追加NUL字符(或空格,见下)。


其他情况下,输入的时候每次读一个块,然后处理,并将 输出结果收集起来,最后写到指定大小的数据块中去。最 终的输出块可能会比指定的大小短一些。


数字值选项(以字节或块为单位)后面可以跟一个乘数: k=1024,b=512,w=2,c=1(w和c是GNU扩展语法。最好别 使用w,因为在system V中,它表示2,在4.2 BSD中,它 表示4)。两个或更多的数值表达式可以通过“x”乘起来。 GEU fileutils 4.0并且允许在数据块大小的叙述中使用 下列乘法后缀(用bs=,cbs=,obs=):M=1048576,G=1073741824, 同理可得T,P,E,Z,Y。D后缀表示数值是以 十进制表示的:kD=1000 MD=1000000 GD=1000000000等等。 (注意,在ls、df、du命令中,M等标记的大小是由环境 变量确定的,而在DD中,它的值是固定的。)   


选项


if=file
从 file 中读而不是标准输入。
of=file
写到 file 里去而不是标准输出。除非指定 conv=notrunc ,否则, dd 将把 file 截为O字节(或由 seek= 选项指定的大小)
ibs=bytes
一次读 bytes 字节。默认是512。
obs=bytes
一次写 bytes 字节。默认是512。
bs=bytes
一次读和写 bytes 字节。这将覆盖 ibs 和 obs 设定的值(并且,设定 bs 不等于同时将 ibs 和 obs 设为同一个值,至少在 只使用 sync, noerror 或 notrunc 转换时是这样的。因为bs规定,每个输入块都应作为单独 的数据块拷贝到输出,而不把较短的块组合到一起)。

cbs=bytes
为 block 转换和 unblock 转换指定转换块的大小。
skip=blocks
在拷贝之前,跳过输入文件的前 blocks 块,每块大小为 ibs-byte 字节。
seek=blocks
在拷贝之前,跳过输出文件的前 blocks 块,每块大小为 obs-byte 字节。
count=blocks
只拷贝输入文件的前 blocks 块(每块的大小为 ibs-byte 字节),而不是全部内容,直到文件末尾。

conv=转换[,转换]...
将文件按 转换 参数指定的方式转换(在“,”两边没有空格)。

转换方式包括:


ascii
将EBCDIC转换成ascii。
ebcdic
将ascii转换成ebcdic。
ibm
将ascii转换成alternative ebcdic。
block
每一行输入,无论长短,输出都是 cbs 字节,并且其中的“换行”(NEWLINE,即c中的')用 空格替换。如有必要,行尾会填充空格。
unblock
用“换行”替换每个输入块( cbs 字节大小)末尾的空格。
lcase
将大写字母转换成小写。
ucase
将小写字母转换成大写。
swab
交换每对输入字节。如果读入的字节数是奇数,最后 一个字节只是简单的复制到输出(因为没有能跟它交换的 字节了)(POSIX 1003.26,PASC翻译1003.2 3号和4号)。
noerror
发生读错误时,继续进行。
notrunc
不截断输出文件。
sync
用0填充到每个输入块的末尾,使其大小为 ibs 字节。
  

GNU标准选项


--help
将用法信息打印到标准输出,并成功退出。
--version
将版本信息打印到标准输出,并成功退出。
--
结束选项列表。
  

环境变量

LANG, LC_ALL, LC_CTYPE和LC_MESSAGES具有其通常含义。   

遵循标准

POSIX 1003.2   

举例

磁带机通常不能接受任意大小的数据块,当最后一个数据片 段不能充满整个块时, dd 将出现I/O错误。用'dd if=myfile of=/dev/mytape conv=sync' 就可以使全部内容存到磁带上。当然,这样做,把文件从磁 带上读回时回产生一个稍大些的文件,因为其尾部填充了一 些NUL(空字符)。   



本手册页描述了fileutils-4.0软件包中的 dd 命令。其他版 本的dd会与此稍有不同。有关更正和补充可以发帖到中国linux 论坛-man手册版。报告程序中的错误,请给 fileutils-bugs2gnu.ai.wit.edu 发邮件。

  


[中文版维护人]

astonia <email>   

[中文版最新更新]

2000/10/19   

[中国Linux论坛man手册页翻译计划]

http://cmpp.linuxforum.net
回复

使用道具 举报

 楼主| 发表于 2004-11-13 22:03:21 | 显示全部楼层
其实我现在对脚本得研究还很少,我试着改动了其中得1024为1300,空间久变为8.6M了,这足够我用了.
只是我把里边得东西都弄出来后,怎么就能再搞成img文件??
我是这样弄的,先把initrd.gz解压,得到initrd(还不知道是不是一个img文件),然后用 -o loop 参数mount,将文件全部复制出来后,添加些东西,现在想再做回initrd.gz,怎么做?
回复

使用道具 举报

发表于 2004-11-14 10:13:25 | 显示全部楼层
把修改放到 mount 的目录里面去, umount,再压缩这时的 initrd 。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-5 18:28 , Processed in 0.089421 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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