本节书摘来自异步社区《嵌入式Linux开发实用教程》一书中的第1章,第1.1节,作者 朱兆祺,李强,袁晋蓉,更多章节内容可以访问云栖社区“异步社区”公众号查看。
第1章 嵌入式Linux基础
1.1 Linux基本命令
在学习嵌入式Linux开发的过程中,将经常使用到Linux的操作命令。实际上,Linux系统中的命令也是为实现特定的功能而编写的,而且绝大数的命令是用C语言编写的。有些实用性强的程序被广泛使用和传播,逐渐地演变成Linux的标准命令。但是Linux的操作命令繁多,本节将在U-Boot、Linux移植过程中常用到的Linux操作命令罗列出来进行讲解,为后续的学习做良好的铺垫。读者不要认为这是Linux简单命令则不屑一顾,嵌入式Linux学习是一个漫长的过程,循序渐进方能有所成就,这个过程是由每一小步累加而成的。天下难事,必作于易;天下大事,必作于细。所以读者务必要对待学习的每一个细节。
1.1.1 文件属性查询与修改
1.文件属性查询
“ls”命令在Linux目录中占据着重要地位,主要用于查看文件属性、查看目录下所包含的文件等。
zhuzhaoqi@zhuzhaoqi-desktop:~/Linux/busybox-1.20.2/_install$ ls
bin dev home linuxrc proc sbin tmp var
creat_yaffs2.sh etc lib mnt root sys usr
通过“ls”命令可查看_install目录下有哪些东西。如果要进一步查看文件属性,则使用“ll”命令或者“ls -al”命令,这两个命令是等效的。
zhuzhaoqi@zhuzhaoqi-desktop:~/Linux/busybox-1.20.2/_install$ ll
总用量 64
drwxr-xr-x 15 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 .
drwxr-xr-x 35 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 15:34 ..
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 15:34 bin
-rw-r--r-- 1 zhuzhaoqi zhuzhaoqi 393 2013-03-17 16:32 creat_yaffs2.sh
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 dev
drwxr-xr-x 3 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 21:01 etc
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 home
drwxr-xr-x 3 zhuzhaoqi zhuzhaoqi 4096 2013-03-18 09:57 lib
lrwxrwxrwx 1 zhuzhaoqi zhuzhaoqi 11 2013-03-17 15:34 linuxrc -> bin/busybox
drwxr-xr-x 5 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 mnt
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 proc
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 root
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 15:34 sbin
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 sys
drwxrwxrwx 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 tmp
drwxr-xr-x 7 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 usr
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-17 16:33 var
这样每一个文件的属性将一目了然,而属性中的每一个数据都有特定的含义,如表11所示。
其中文件权限的10个字符的含义如表1.2所示。
因此/bin目录的文件权限是:文件所有者对/bin目录可读可写可执行,文件所属用户组对/bin目录可读不可写可执行,其他人对/bin目录可读不可写可执行。
当对某个文件进行操作,要特别注意这个文件是否具有将要进行操作的权限。如果我们所在的用户组没有操作权限而又得进行操作,此时就得修改文件的权限。
2.文件权限修改
“chmod”命令的作用是变更一个文件的权限。
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/include$ ll
总用量 8
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-18 22:02 ./
drwxr-xr-x 3 zhuzhaoqi zhuzhaoqi 4096 2013-03-18 22:07 ../
-rw-r--r-- 1 zhuzhaoqi zhuzhaoqi 0 2013-03-18 22:02 s3c6410.h
从上一小节可知,“drwxr-xr-x”除了“d”是文件类型,剩下9个字符划分成3组,表示3个用户组的使用权限。而在Linux系统中,每一个用户组的3个字母分别可用数字进行描述其权限,r:4、w:2、x:1、-:0,将每一组的数字进行相加,即得到这组用户的权限。例如上面s3c6410.h的权限是:rw-r--r--,那么每一用户组权限分别是:6、4、4,那么组合起来即为644。每个文件的最高权限为777。
给予s3c6410.h最高权限,如下:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/include$ chmod 777 s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/kernel/include$ ll
总用量 8
drwxr-xr-x 2 zhuzhaoqi zhuzhaoqi 4096 2013-03-18 22:02 ./
drwxr-xr-x 3 zhuzhaoqi zhuzhaoqi 4096 2013-03-18 22:07 ../
-rwxrwxrwx 1 zhuzhaoqi zhuzhaoqi 0 2013-03-18 22:02 s3c6410.h*
通过“chmod”更改权限命令可以看到s3c6410.h的权限是最高权限。
1.1.2 目录与路径处理命令
1.切换目录
“cd”命令的作用是从当前目录切换到另一个目录下。如从用户根目录进入/linux目录下,如下操作:
zhuzhaoqi@zhuzhaoqi-desktop:~$ cd linux/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$
2.创建新目录
“mkdir”命令的作用是创建一个新的目录,如在/linux目录下再创建一个/linux-3.8.3子目录,如下操作:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ mkdir linux-3.8.3
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
linux-3.8.3
mkdir的用法很多,可以通过输入mkdir –help查看,如下:
zhuzhaoqi@zhuzhaoqi-desktop:~$ mkdir --help
用法:mkdir [选项]... 目录...
若指定目录不存在则创建目录
长选项必须使用的参数对于短选项时也是必需使用的
-m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask
-p, --parents 需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理
-v, --verbose 每次创建新目录都显示信息
-Z, --context=CTX 将每个创建的目录的SELinux 安全环境设置为CTX
--help 显示此帮助信息并退出
--version 显示版本并退出
mkdir –p这个指令在U-Boot和Linux内核源码中的Makefile中的使用是相当频繁的。
3.删除目录
如果是删除一个空目录,则使用“rmdir”命令即可;如果该目录下有东西,则不能使用“rmdir”命令删除。
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/linux-3.6.7$ ls
arch
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/linux-3.6.7$ cd ..
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
linux-3.6.7 linux-3.8.3
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ cd linux-3.8.3/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/linux-3.8.3$ ls
zhuzhaoqi@zhuzhaoqi-desktop:~/linux/linux-3.8.3$ cd ..
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
linux-3.6.7 linux-3.8.3
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ rmdir linux-3.8.3/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
linux-3.6.7
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ rmdir linux-3.6.7/
rmdir: 删除 "linux-3.6.7/" 失败:目录非空
从上面操作可知,由于/linux-3.8.3目录为空,则可使用“rmdir”删除;但是/ linux-3.6.7目录下有一个子目录/arch,则不能使用“rmdir”删除。此时则应该使用“rm -r”命令删除。
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
linux-3.6.7
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls linux-3.6.7/
arch
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ rm -r linux-3.6.7/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$
通过“ls”命令可知,linux目录下的linux-3.6.7/目录以及被删除。
1.1.3 文件操作
1.新建文件
新建一个文件可以使用“vim”命令,但是使用“vim”命令退出打开的文件时需要保存退出,否则会视为没有创建文件。
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ vim s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
s3c6410.h
2.复制文件
复制文件命令为“cp”。如下:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ cp s3c6410.h include/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls include/
s3c6410.h
如果要复制并且重命名,如下操作:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include kernel s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ cp s3c6410.c include/s3c6400.c
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls include/
s3c6400.c s3c6410.h
当复制目录时,使用“cp -r”命令。如下:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include kernel s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls kernel/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ cp -r include/ kernel/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include kernel s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls kernel/
include
3.移动文件
移动一个文件则使用“mv”命令,如下:
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include kernel s3c6410.c s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ mv s3c6410.c kernel/
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls
include kernel s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ ls kernel/
include s3c6410.c
编辑一个文件,建议使用“gedit”命令或者“vim”命令。
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ gedit s3c6410.h
zhuzhaoqi@zhuzhaoqi-desktop:~/linux$ vim s3c6410.c
1.1.4 打包与解包、压缩与解压缩
熟悉打包与解包、压缩与解压缩的操作命令是操作Linux文件的必备技能。Linux下的打包与解包、压缩与解压缩的操作命令种类繁多,本节截取常用的8个格式进行讲解。本节中,FileName是指打包、压缩之后的文件名,DirName是指待打包、压缩的文件名。
(1).tar格式
单纯的tar功能其实仅仅是打包而已,也就是说将很多文件集结成一个文件,并没有进行压缩。
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(2).gz格式
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。在Linux中经常会碰到后缀名为.gz的文件,它们的原型即是GZIP格式。
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
(3).tar.gz格式和.tgz格式
以.tar.gz和.tgz为后缀名的压缩文件在在Linux和OSX下是非常常见的,Linux和OSX都可以直接解压使用这种压缩文件。
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
(4).bz2格式
压缩生成后缀名为.bz2的压缩算法使用的是“Burrows-Wheeler block sorting text”,这类算法压缩比率比较高。
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z DirName
这里需要注意的是,当执行压缩指令之后,将会生成FileName.bz2压缩文件,同时DirName文件将会自动删除。
(5).tar.bz2格式
bzip2是一个压缩能力非常强的压缩程序,以.bz2和.tar.bz2为后缀名的压缩文件都是bzip2压缩的结果。
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
(6).Z格式
compress 是一个相当古老的UNIX压缩指令,压缩后的文件是以.Z 作为后缀名。
解压:uncompress FileName.Z
压缩:compress DirName
(7).tar.Z格式
这个压缩格式可以认为是.tar打包加上.Z压缩。
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
(8).zip格式
因为格式开放而且免费,越来越多的软件支持打开Zip文件。
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
以上8种打包压缩算法都有所区别,最终导致的结果是压缩时间和压缩大小不一样。每一种压缩格式都有其优势和不足,在何种场合应该使用何种压缩格式就得视实际情况而定了。
在程序设计当中,空间换取时间、时间换取空间的现象是非常常见的一种方法。比如在单片机的LED跑马灯中,经常使用在数组中取出想要的花样,这就是空间换取时间。