EDN首页   博客首页

最新日志

发表于:2008-10-30 13:39:52
标签:无标签

0

Linux shell中强大的正则grep

Linux Shell中强大的正则grep


Linux grep命令

用‘grep’搜索文本文件
如果您要在几个文本文件中查找一字符串,可以使用‘grep’命令。‘grep’在文本中搜索指定的字符串。
假设您正在‘/usr/src/
/ :find 命令从目录/开始搜索并搜索所有源于它的子目录
-name :指明搜索的名字或名字模式,查找所有以.txt结尾的文件
-print :表明find命令应输出其搜索到的和标准相匹配的文件名
# find -name "*.txt" -print -exec grep test {} \;

grep test {} \; :-exec参数的一部分.每次找到和-name参数中指定的条件相匹配的文件时,用来搜索单词test的grep命令将被执行。
{} :参数告诉find命令每次执行-exec部分的命令时插入匹配文件的完整路径和文件名。
\; :表示find每次找到一个匹配文件时其所执行的-exec部分的命令结束。
也可以将-print去掉。

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(84)
发表于:2008-10-30 13:34:20
标签:无标签

1

BusyBox——嵌入式Linux中的瑞士军刀

BusyBox (http://www.busybox.net)将数以百计的常用Unix/Linux命令集成到一个可执行文件中(名为busybox).它体积小巧, 功能却不失强大. 常用Linux命令实现的功能它都能提供. 它甚至还提供了tftp, http服务程序. 尽管少数的Linux命令的某些选项BusyBox没能提供, 但这并不影响它在嵌入式Linux系统中的流行.

使用BusyBox, 在为目标系统所构建的根文件系统中添加应用程序就易如反掌了. 想象一下: 单独得交叉编译每个UNIX/Linux应用程序的工作量是多么恐怖.


BusyBox可以与glibc或uClibc库进行链接编译, 可以采用动态链接或静态链接(配置选项中可选). 即便采用与glibc的静态链接, 最终生成的busybox文件大小也能轻易控制在1MB之内(在配置BusyBox时不要选择不需要的功能).  而采用uClibc动态链接的可执行文件就更小了. 这非常适于存储空间紧张的嵌入式Linux系统. 由此, 有人将BusyBox称为嵌入式系统中的瑞士军刀. 更为形象的比喻是: Linux系统中的单个命令是电路中的分立式元件, 而BusyBox是将它们集成在一起的IC: 功能不变, 体积却大为减小.

本文讨论BusyBox的编译, 安装. 包括安装到本地主机和安装到ARM目标系统中.


配置BusyBox
配置BusyBox和配置Linux内核的方法很类似, 思想也大同小异: 也是基于源码树目录中的.config文件来进行的. 还是推荐使用menuconfig配置工具.

下面的工作都是在解压后的BusyBox源码树根目录中进行的.

复制内容到剪贴板
代码:
$ make defconfig       : 针对大多数用户的默认配置
$ make allnoconfig    : 全不选
$ make allyesconfig   : 全选

一般先make deconfig, 然后再使用menuconfig进行配置.

$ make help 查看BusyBox的make选项帮助.

如同配置Linux内核, 你也可以使用既有的.config(可更改其命名)文件. 可以在menuconfig中加载, 输出配置文件.

下面列出一些值得注意的配置选项:

BusyBox Settings
Build Options:   
Build BusyBox as a static binary (no shared libs) : 将BusyBox动态链接或静态连接.
- Do you want to build BusyBox with a Cross Compiler? : 选择交叉编译器.

Installation Options:
默认地, 运行 make install之后, BusyBox将被安装到./_install目录.

配置根据具体需要来: 不需要的不选.

  • NFS是肯定要选的, 使用NFS将宿主机的文件系统mount到目标板上, 这是嵌入式Linux程序开发的一个重要方面.
  • 由于可使用NFS, 能在宿主机上实现的功能就都不需要在目标板上实现了.
  • Debian Utilities 全不选, Editors全不选, System Logging Utilities全不选.
  • 解压缩工具只安装解压工具. 而且只选择一种: bzip2相关的, 以及tar工具(只要求目标板能解压缩tar.bz2文件).
  • shell使用ash.


编译BusyBox
完成对BusyBox的配置工作后, 就可以编译, 安装它了. BusyBox可用于多种体系结构的CPU. 这里分别介绍用于本机系统的BusyBox和用于ARM目标系统的BusyBox. 另外, BusyBox可与glibc或uClibc动态或静态连接. 下面分情况介绍:

用于本机的BusyBox

用于本机的BusyBox编译过程很简单, 只需运行make就可以了.

交叉编译BusyBox

交叉编译BusyBox与编译用于本地系统的BusyBox大同小异, 唯一的区别是它需要使用交叉编译工具. 另外要注意库的链接方式: 如果目标系统中没有某库, 那么BusyBox应该与该库静态链接. 编译步骤如下:

复制内容到剪贴板
代码:
1, 修改PATH变量:
$ export PATH=<交叉编译工具所在目录>:$PATH

2, 在调用make命令时候要指定TARGET_ARCH和CROSS变量.
$ make TARGET_ARCH=arm CROSS="arm-"linux-

新版的BusyBox可以在配置过程中设定交叉编译工具.  这样, 为目标系统编译BusyBox的make命令和为本地主机编译BusyBox没有任何区别!

我这里使用Scratchbox来针对ARM目标系统编译BusyBox. (可参考本blog的:[size=+0]使用Scratchbox来开发嵌入式Linux). 安装scratchbox之后, 可以在对scratchbox进行配置时安装各种交叉编译工具: arm-linux-gcc(与glibc链接), arm-linux-uclibc-gcc(与uclibc链接),  它还可以为本地系统(x86)安装与uclibc链接的gcc. 这样你直接指定相应的编译器既可. 不需要另外安装uClibc库.

为了加快编译速度, 可以修改Makefile, 将CC="$(HOSTCC)"改为CC="ccache $(HOSTCC)". 同时也可使用 $ make -j2 用2个任务来进行编译过程.
实例

下面以几个例子来介绍BusyBox的编译方法:

1, 针对本地主机编译与glib链接的BusyBox
由于GNU/Linux系统中都装有glibc, 所以可以不使用Scratchbox提供的编译器. 而且, 可以将BusyBox配置为与glibc库动态链接. 其他选项均设为默认.

复制内容到剪贴板
代码:
$ make defconfig             ; 默认配置
$ make menuconfig         ; 选择与glibc动态链接
$ make -j2        
$ make install

可以使用ls -l, file命令查看生成的busybox可执行文件相关信息. 注意, 在源码树根目录同时还生成了busybox_unstripped文件, 将它strip之后即得到busybox.

默认配置, 与glibc动态连接后的busybox大小为: 858K

2, 针对本地主机编译与uClibc链接的BusyBox
我没有另外地在本地主机上安装uClibc, 而是使用Scratchbox提供的编译工具: i386-gcc-3.3.2-uclibc-snapshot-20040229. 由于本地主机上没有uClibc库, 所以将busybox与uClibc库静态链接. 其他选项设为默认

复制内容到剪贴板
代码:
$ export PATH= /home/jack/project/sb/scratchbox/compilers/i386-gcc-3.3.2-uclibc-snapshot-20040229/bin PATH
$ make menuconfig                              
$ make CROSS="i386-linux-uclibc-" -j2   
$ make install         

默认配置, 与uClibc静态链接后的busybox大小为: 1.1M

3, 针对ARM目标系统编译与glibc动态连接的BusyBox
使用Scratchbox中提供的arm-linux-gcc交叉编译工具. 这里没有使用默认配置, 而是只选择我认为需要的功能.

复制内容到剪贴板
代码:
$ export PATH="/home/jack/project/sb/scratchbox/compilers/arm-linux-gcc3".4.cs-glibc2.3/binPATH
$ make menuconfig                        
$ make CROSS="arm-linux-" -j2   
$ make install      

剔除了不需要的内容, 与glibc动态链接后的busybox大小为: 382K

4, 针对ARM目标系统编译与uClibc静态连接的BusyBox
使用Scratchbox中提供的arm-linux-uclibc-gcc交叉编译工具. 这里没有使用默认配置, 而是只选择我认为需要的功能.

复制内容到剪贴板
代码:
$ export PATH=":/home/jack/project/sb/scratchbox/compilers/arm-linux-gcc3".4.cs-uclibc0.9.27/bin$PATH
$ make menuconfig                        
$ make CROSS="arm-linux-uclibc" -j2   
$ make install      

剔除了不需要的内容, 与uClibc静态链接后的busybox大小为: 509K


注意: 针对ARM目标系统编译BusyBox时, 可在menuconfig中选择特定的交叉编译器. 这样就make命令就和为本地主机编译BusyBox一样了, 不需要更改PATH和CROSS变量.


安装, 运行BusyBox


编译完成后, 输入 $ make install 进行BusyBox的安装.

默认地, BusyBox将在当前目录(也就是BusyBox源码树根目录)新建一个名为"_install"的目录. BusyBox将被安装到其中.  可以在配置BusyBox时设定安装目录.

完成安装之后, 在./_install目录中有下列文件和目录:
bin  linuxrc  sbin  usr

其中linuxrc, bin, sbin, usr目录中的包含一些我们熟悉的位于PC机/bin, /sbin, /usr/bin, /usr/sbin目录中的程序. 而BusyBox安装的这些程序都是指向busybox文件(位于./_install/bin目录)自身的符号连接.


运行BusyBox"安装"的这些程序时候, 实际上都是在调用busybox这个单独的程序. 比如: $ ./ls -l , 实际向busybox传递了2个参数: ls 和-l. 前面的命令等价于$ ./busybox ls -l.

针对前面编译实例中安装的BusyBox, 我们分别讨论针对本地主机编译的BusyBox和针对ARM目标系统编译的BusyBox.

本地主机
很简单, 可以直接调用busybox, 也可以调用连接到它的符号连接. 当然, 可以修改PATH变量来直接调用它们.

复制内容到剪贴板
代码:
$ ./busybox ls -l
$ ./ ls -l

ARM目标系统
可以使用仿真工具来运行. 这里使用qemu. 在Debian/Ubuntu中安装qemu:

复制内容到剪贴板
代码:
$ sudo apt-get install qemu

$ qemu-arm ./busybox ls -l

这里有个问题, 如果busybox是与C库动态链接的(哪怕是和glibc库动态链接), 那么运行它是将会产生段错误:
Unable to load interpreter
Segmentation fault (core dumped)

如果采用静态链接, 则没有问题.

BusyBox还提供与init类似的功能, 也非常适用与嵌入式系统.


参考资料
1, http://www-128.ibm.com/developerworks/cn/linux/l-busybox/index.html

2, 《构建嵌入式Linux系统》第6章.

3,  http://free-electrons.com/training/devtools

4, busybox命令: http://www.busybox.net/downloads/BusyBox.html

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(138)
发表于:2008-10-30 13:33:23
标签:无标签

0

Linux攻略 如何制作和使用Jffs2文件系统

本文主要介绍如何在AT91SAM9261EK板子上制作和使用jffs2文件系统,使用的是linux-2.6.21内核。

首先:配置MTD

复制内容到剪贴板
代码:
      <*> Memory Technology Device (MTD) support
      
Debugging
      
MTD partitioning support
      
  Command line partition table parsing
      
Direct char device access to MTD devices
      
Caching block device access to MTD devices
       RAM/ROM/Flash chip drivers ----->
          <*> Detect non-CFI AMD/JEDEC-compatible flash chips
          <*> Support for AMD/Fujitsu flash chips
       Mapping drivers for chip access --->
           
Support non-linear mappings of flash chips
       Self-contained MTD device drivers --->
           
Support for AT45... DataFlash
       NAND Flash Device Drivers ---->
           
NAND Device Support
           
Support for NAND Flash /SmartMedia on AT91
                     
      File systems ---->
         <*> Second extended fs support
         
Inotify file change notification support
         
Inotify support for user space
         <*> Filesystem in Userspace support
         Miscellaneous filesystems
          <*> Journalling Flash File System v2 (JFFS2) support
         
JFFS2 write-buffering support
          <*> Compressed ROM file system support (cramfs)
以上配置中没有列出的都没选;其它配置仅做参考,可根据自己的需要自行配置。
复制内容到剪贴板
代码:
$ make all
其次:制作mtd-util工具

从网上下载zlib-1.2.3.tar.gz

解压缩
复制内容到剪贴板
代码:
$ cd zlib-1.2.3
$ ./configure --prefix=/usr/local/arm/3.4.1/arm-linux --shared
修改Makefile如下:
复制内容到剪贴板
代码:
CC=arm-linux-gcc
LDSHARED=arm-linux-ld -shared
$ make all
$ make install
注意:这里是安装在/usr/local/arm/3.4.1/arm-linux目录下

由于交叉编译mtd工具时需要zlib.h文件,所以在编译之前先安装zlib库文件。

从网上下载mtd-snapshot-20050519.tar.bz2

解压缩
复制内容到剪贴板
代码:
$ cd mtd/util
修改该目录下的Makefile:
复制内容到剪贴板
代码:
CROSS=arm-linux-
复制内容到剪贴板
代码:
$ make all
然后将该目录下生成的flash_erase,flash_eraseall,mkfs.jffs2工具放在ramdisk 文件系统中(这里放在/bin目录下),另外在ramdisk文件系统的dev目录下要保证有mtd0~mtd9,mtdblock0~mtdblock9这些设备,如果没有可参考 ramdisk文件系统的制作,也可从pc机相同目录下拷贝,要加上文件属性。

另外,需要将/arm-linux/lib目录下的libz.so,libz.so.1,libz.so.1.2.3文件拷贝到ramdisk文件系统的/lib目录下,否则mkfs.jffs2工具不能使用。

最后将新生成的uImage和ramdisk文件下载到板子上,启动系统,使用命令
复制内容到剪贴板
代码:
cat /proc/mtd
可以看到
复制内容到剪贴板
代码:
dev: size erasesize name
mtd0: 00040000 00020000 "Partition 1"
mtd1: 0ffc0000 00020000 "Partition 2"
mtd2: 00420000 00000210 "spi0.0-AT45DB321x"
这里mtd0,mtd1是nandflash上的分区;
mtd2是dataflsh上的分区,该分区上放有u-boot,uImage.img,ramdisk.img

所以我们这里可以使用空的nandflash上的两个分区。使用之前要先用工具flash_erase或者flash_eraseall擦除nandflash,具体使用的步骤如下:
复制内容到剪贴板
代码:
# flash_erase /dev/mtd1
制作jffs2映像
复制内容到剪贴板
代码:
# cd /var/tmp

# mkdir jffs2 (jffs2下的目录可以任意建)

# mkfs.jffs2 –d jffs2/ -o jffs2.img

# cp /var/tmp/jffs2/jffs2.img /dev/mtdblock1
最后
复制内容到剪贴板
代码:
# mount -t jffs2 /dev/mtdblock1 /mnt/mtd
即可

使用结束可使用
复制内容到剪贴板
代码:
$ umount /mnt/mtd
卸载

如果只是当作普通的jffs2来使用dataflash或者nandflash,可不必制作jffs2映像,只需要最后一步
复制内容到剪贴板
代码:
# mount -t jffs2 /dev/mtdblock1 /mnt/mtd

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(113)
发表于:2008-10-30 13:32:42
标签:无标签

0

Linux 制作 ramdisk

创建一个简单的基于ext2fs的ramdisk
复制内容到剪贴板
代码:
mke2fs -vm0 /dev/ram 4096

mount -t ext2 /dev/ram /mnt

cd /mnt

cp /bin, /sbin, /etc, /dev ... files in mnt

cd ../

umount /mnt

dd if="/dev/ram" bs="1k" count="4096" of="ext2ramdisk"
mke2fs是用于在任何设备上创建ext2文件系统的实用程序

它创建超级块、索引节点以及索引节点表等等。

在上面的用法中,/dev/ram 是上面构建有4096 个块的ext2 文件系统的设备。然后,将这个设备(/dev/ram)挂装在名为/mnt的临时目录上并且复制所有必需的文件。一旦复制完这些文件,就卸装这个文件系统并且设备(/dev/ram)的内容被转储到一个文件(ext2ramdisk)中,它就是所需的ramdisk(ext2 文件系统)

上面的顺序创建了一个4 MB的ramdisk,并用必需的文件实用程序来填充它。

一些要包含在ramdisk 中的重要目录是:

* /bin — 保存大多数象 init、busybox、shell、文件管理实用程序等二进制文件
* /dev — 包含用在设备中的所有设备节点
* /etc — 包含系统的所有配置文件
* /lib — 包含所有必需的库,如 libc、libdl 等

如果此方法行不通,请试用下面的方法:

制作ramdisk的方法

(1)建立loop设备的临时挂接点和一个大小为6兆(大小可以调节)的临时文件,并将其清零:
复制内容到剪贴板
代码:
   #mkdir /mnt/loop 2>/dev/null
   #dd if="/dev/zero" of="/tmp/loop"_tmp bs="1k" count="6144" >/dev/null
(2)将loop设备与临时文件联系起来
复制内容到剪贴板
代码:
   #losetup /dev/loop0 /tmp/loop_tmp
(3)Linux內核识别两种可以直接拷贝到ramdisk的文件系统,它们是minix 和ext2,ext2性能更好:
复制内容到剪贴板
代码:
   #mke2fs -m 0 /dev/loop0 2>/dev/null
   mke2fs将会自动判断设备容量的大小并相应地配置自身,-m 0参数防止它给root保留空
   这样会腾出更多地有用空间。
(4)接着把虚拟盘挂在节点/mnt上:
复制内容到剪贴板
代码:
   #mount /dev/loop0 /mnt/loop -t ext2
(5)将制作好的root文件系统拷贝到所挂的节点上,卸下挂接点,刪除建立的挂接点
复制内容到剪贴板
代码:
   #cp -a /ramdisk/* /mnt/loop
   #umount /mnt/loop
现在制作的/tmp/loop_tmp就是一个6M的ramdisk文件

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(90)
发表于:2008-10-30 13:31:25
标签:无标签

0

ftp命令大全

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。


FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip

2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。

4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。

10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。

12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。

14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。

16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。

20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。

22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。

26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。

28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。
29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。

32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。
35.modtime file-name:显示远程主机文件的最后修改时间。

36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。
39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。

42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。

44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。

48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.
49.recv remote-file[local-file]:同get。

50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。

52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。

54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。

58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。

60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。

62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。

64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。

66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。

68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。

70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(67)
发表于:2008-10-30 13:30:53
标签:无标签

0

Linux 自动ftp脚本

概要:

本文简单总结一下Linux 下自动ftp脚本的写法

自动登陆ftp服务器,并下载一个文件

1:ftp.sh

复制内容到剪贴板
代码:
#!/bin/sh
F="192.168.0.100.ftp"
echo "open 192.168.0.100 21"     > $F
echo "user username passwd"     >> $F
echo "bin"                                     >> $F  
echo "get $1"                                >> $F
echo "bye"                                    >> $F
ftp -i -in < $F
rm -rf $F
2:ftp2.sh
复制内容到剪贴板
代码:
#!/bin/sh
FILE=$1
ftp -i -in <<!
open 192.168.0.100 21
user username password
cd /            
mput $FILE
bye
有兴趣的朋友可以实践一下

将username 和 password改成你自己

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(42)
发表于:2008-10-30 13:30:13
标签:无标签

0

RE.ER-嵌入式系统的开发流程概括介绍

不同于平常开发的软件,在开发嵌入式系统时,常常把所有的软件模块最终都生成一个单一的文件,我们把这个单一的文件称为image,它一般包括以下布局:
bootloader
  embedded linux kernel
  device driver
  root filesystem
  application
因此开发流程如下:
1、开发target硬件系统。
2、需要一套交叉编译工具,能够产生target目标代码
3、开发一个bootloadertarget上去,用来引导内核
4、开发linux内核到target上去
5、开发一个rootfs
6、开发特定硬件的驱动程序
7、或许还需要一个实时的linux
8、开发上层的应用程序。

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(43)
发表于:2008-10-30 13:29:34
标签:无标签

0

RedHat下显示彩色目录列表

打开/etc/bashrc, 加入如下一行:

  alias ls="ls --color"

下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:

  蓝色-->目录
  绿色-->可执行文件
  红色-->压缩文件
  浅蓝色-->链接文件
  灰色-->其他文件

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(38)
发表于:2008-10-30 13:28:59
标签:无标签

0

re.er-部署Linux必须了解的六大问题

部署Linux必须了解的六大问题

无论你喜欢、厌恶,或是尚未对它形成某种印象,这里我们还要要谈一下Linux。由于其免费性和处理关键性任务的能力,Linux已经日益走进人们的视野。但由于其安装的复杂性,同时也让一部分新手望而却步。
尽管如此,Linux的机会还是来了!今年,Linux有望百尺竿头更进一步。但是,在安装Linux系统之前,用户首先要了解以下六个问题:
1. 目前Linux操作系统有多少个版本?
据DistroWatch.com网站报道,当前至少有350个Linux版本。由于得到了Sun CEO乔森纳-施瓦茨的支持,Ubuntu最近在Linux市场比较火爆。
其次就是SUSE,由Novell公司提供,分为免费版和商业版两种。商业版需要付费,但可以得到Novell的技术支持。此外,主要的Linux发行商还有红帽、Mandriva、Debian、Fedora、Slackware、Knoppix、Gentoo和Mepis等等。
2.Linux系统有哪些配套应用?
在办公软件领域,最知名的就是Sun公司的StarOffice。它与微软公司的Office办公组件一样,具有文字处理、电子表格和演示稿等多种办公应用。通常,OpenOffice与红帽和Novell等多家Linux系统相捆绑。
除了OpenOffice,支持Linux的办公组件还包括GNOME Office和KOffice。在浏览器市场,支持Linux系统的有Firefox和 Konqueror浏览器。

3. 如果在Linux系统上聆听音乐?
对于家庭用户而言,除了文字处理等办公应用,用户在Linux系统上最常用的应用就能就是音乐播放器了。目前,支持Linux的音乐播放器有RealPlayer和KDE公司的amaroK播放器。
对于Linux用户而言,当前购买音乐曲目是比较困难的事情。苹果的iTunes、雅虎音乐和Urge均不支持Linux系统。至于Rhapsody,用户只能在线收听,但不能购买。相比之下,MP3tunes.com可以在一定程度上满足Linux用户购买音乐曲目的需求。每首歌曲的费用为88美分。

4. Linux有哪些桌面环境可供选择?
这是所说的“桌面”是指“用户界面”。目前,Linux主要有两种桌面环境,Gnome和KDE。这两种环境,不同之处更多在于形式上,而不是技术上。
相比之下,KDE更加接近于Windows,而Gnome的特点就是运行速度比较快。目前,红帽和Novell等很多厂商的Linux系统都支持Gnome和KDE桌面环境。

5. Linux更适用于服务器还是终端用户?
坦率地讲,Linux更适合作为服务器系统。目前,Linux在桌面市场还未得到足够的认可。分析师Rob Enderle认为,也许Linux在桌面市场永远都不会崛起。
据权威数据显示,目前Linux在桌面市场的使用比例还不足3%。但是,这丝毫不影响Linux厂商进军桌面市场的决心和信心。许多Linux都认为,Linux在桌面市场的腾飞已经为时不远。

6. 如何部署Linux系统?
首先要下载要Linux操作系统的ISO镜像,然后可以直接刻录成启动光盘。需要指出的是,不要把Linux系统与Windows安装在同一个硬盘上。
用户最好要安装两块硬盘,当使用Linux系统时,最好拔下安装Windows系统硬盘的数据线。而使用Windows系统时,要拔下Linux系统硬盘。详细的信息用户可以查看一些相关书籍。
了解上述六点内容,相信用户就可以轻松安装和使用Linux系统了。

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(42)
发表于:2008-10-30 13:28:19
标签:无标签

0

busybox ctrl+c不能终止进程(引用)

最近的一段时间中,发现在busybox下调试时,shell终端用ctrl+c不能终止掉正在运行的进程。参考了网上的一些网友的blog的解决方法以及自己的理解,这边把解决方法告诉大家。

Ctrl+C终止进程的流程是这样的:

Ctrl + C首先通过 /dev/ttyS0 (/dev/console)的driver,这个serial driver直接把这个控制字符送到n_tty的driver,n_tty负责search所有的控制字符。

当 ctrl+C 按下,

n_tty.c:
n_tty_receive_break()
> isig(SIGINT,tty) > kill_pg(SIGINT, tty->pgrp)

signal.c: kill_pg() calls signal(SIGINT,task) 来中断每个具有group number 为 tty->pgrp的task.值得一提的是,只要process具有相同的group id,不管是backgroud还是foreground,都会被kill掉

从上面的流程我们可以看到,ctrl+C是传送到/dev/ttyS0中的驱动中的。在我原来的文件系统中,建立了节点console作为系统控制台。但是没有ttyS0节点。这样系统运行起来后,shell的交互是通过console这个控制台的。但是在busybox的手册中有这样的一段话:

Why do I keep getting "sh: can't access tty; job control turned off" errors? Why doesn't Control-C work within my shell?

This isn't really a uClibc question, but I'll answer it here anyways. Job control will be turned off since your shell can not obtain a controlling terminal. This typically happens when you run your shell on /dev/console. The kernel will not provide a controlling terminal on the /dev/console device. Your should run your shell on a normal tty such as tty1 or ttyS0 and everything will work perfectly. If you REALLY want your shell to run on /dev/console, then you can hack your kernel (if you are into that sortof thing) by changing drivers/char/tty_io.c to change the lines where it sets "noctty = 1;" to instead set it to "0". I recommend you instead run your shell on a real console...

显然,busybox建议我们shell最好运行在实际的控制台上,例如tty或是ttyS0中。



所以我们解决方法如下:

1.
在dev目录下建立ttyS0的节点:

#mknod m 666 ttyS0 c 4 64

2.
然后我们将系统控制台console链接到ttyS0中

# ln s ttyS0 console

3.
修改启动文件/etc/inittab


console::sysinit:-/etc/rcS
ttyS0::respawn:-/bin/sh

这边我们要关注一下busybox的inittab文件的格式:

Id:runlevel: action :process

其中的Id是用来指定启动的控制台的。

到此为止,重新制作文件系统,下载到目标板,测试:

# ping 192.168.2.245

PING 192.168.2.245 (192.168.2.245): 56 data bytes

64 bytes from 192.168.2.245: icmp_seq=0 ttl="64" time="2".1 ms

64 bytes from 192.168.2.245: icmp_seq=1 ttl="64" time="0".6 ms

64 bytes from 192.168.2.245: icmp_seq=2 ttl="64" time="0".4 ms

64 bytes from 192.168.2.245: icmp_seq=3 ttl="64" time="0".4 ms

--- 192.168.2.245 ping statistics ---

4 packets transmitted, 4 packets received, 0% packet loss

round-trip min/avg/max = 0.4/0.8/2.1 ms

#

测试通过!!

网上还有介绍其他的方法如下:


修改内核源码
在内核源码drivers/char/tty_io.c中将
noctty = 1改为noctty = 0
然后/etc/inittab可以使用默认的,也可以写成:
console::sysinit:-/etc/rcS
console::respawn:-/bin/sh

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(44)
234567下一页总共 , 当前 /