您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页Linux基础命令

Linux基础命令

来源:尚车旅游网
www.linuxidc.com

“黑色经典”系列之《嵌入式Linux应用程序开发详解》

本章目标

Linux是个高可靠、高性能的系统,而所有这些优越性只有在直接使用Linux命令行(Shell环境)才能充分地体现出来。在本章将帮助读者学会如下内容。

掌握Shell基本概念 熟练使用Linux中系统相关命令 熟练使用Linux中打包压缩相关命令 熟练使用Linux中网络相关命令

深入了解INIT进程及其配置文件

学会添加环境变量

第2章 Linux基础命令

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

2.1 Linux常用操作命令

在安装完Linux再次启动之后,就可以进入到与Windows类似的图形化界面了。这个界面就是Linux图形化界面X窗口系统(简称X)的一部分。要注意的是,X窗口系统仅仅是Linux上面的一个软件(或者也可称为服务),它不是Linux自身的一部分。虽然现在的X窗口系统已经与Linux整合地相当好了,但毕竟还不能保证绝对的可靠性。另外,X窗口系统是一个相当耗费系统资源的软件,它会大大地降低Linux的系统性能。因此,若是希望更好地享受Linux所带来的高效及高稳定性,建议读者尽可能地使用Linux的命令行界面,也就是Shell环境。

当用户在命令行下工作时,不是直接同操作系统内核交互信息的,而是由命令解释器接受命令,分析后再传给相关的程序。Shell是一种Linux中的命令行解释程序,就如同Command.com是DOS下的命令解释程序一样,为用户提供使用操作系统的接口。它们之间的关系如图2.1所示。用户在提示符下输入的命令都由Shell先解释然后传给Linux内核。

• Shell是命令语言、命令解释程序及程序设计语言的统称。它不仅拥有自己内建的Shell命令集,同时也能被系统中其他应用程序所调用。 • Shell的另一个重要特性是它自身就是一个解释型的程序设计语言,Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的Shell程序中。关于Shell编程的详细讲解,感兴趣的读者可以参见其他相关书籍。 小知识

Linux中运行Shell的环境是“系统工具”下的“终端”,读者可以单击“终端”以启动Shell环境。这时屏幕上显示类似“[sunq@www home]$”的信息,其中,sunq是指系统用户,而home是指当前所在的目录。

由于Linux中的命令非常多,要全部介绍几乎不可能。因此,在本书中按照命令的用途进行分类讲解,并且对每一类中最常用的命令详细讲解,同时列出同一类中的其他命令。由于同一类的命令都有很大的相似性,因此,读者通过学习本书图2.1 内核、Shell和用户的关系 中所列命令,可以很快地掌握其他命令。 命令格式说明。

• 格式中带[]的表明为可选项,其他为必选项。 • 选项可以多个连带写入。

• 本章后面选项参数列表中加粗的含义是:该选项是非常常用的选项。

2.1.1 用户系统相关命令

Linux是一个多用户的操作系统,每个用户又可以属于不同的用户组,下面,首先来熟悉一下Linux中的用户切换和用户管理的相关命令。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

1.用户切换(su)

(1)作用

变更为其它使用者的身份,主要用于将普通用户身份转变为超级用户,而且需输入相应用户密码。

(2)格式

su [选项] [使用者]

其中的使用者为要变更的对应使用者。 (3)常见参数

主要选项参数见表2.1所示。 表2.1 su命令常见参数列表

选 项 -,-l,--login -m,-p -c,--command 参 数 含 义 为该使用者重新登录,大部分环境变量(如HOME、SHELL和USER等)和工作目录都是以该使用者(USER)为主。若没有指定USER,缺省情况是root 执行su时不改变环境变量 变更账号为USER的使用者,并执行指令(command)后再变回原来使用者 (4)使用示例 [sunq@www sunq]$ su - root Password: [root@www root]# 示例通过su命令将普通用户变更为root用户,并使用选项“-”携带root环境变量。 (5)使用说明 • 在将普通用户变更为root用户时建议使用”-”选项,这样可以将root的环境变量和工作目录同时带入,否则在以后的使用中可能会由于环境变量的原因而出错。 • 在转变为root权限后,提示符变为#。

环境变量实际上就是用户运行环境的参数集合。Linux是一个多用户的操作系统。而且在每个用户登录系统后,都会有一个专有的运行环境。通常每个用户默认的环境都是相同的,而这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。 常见的环境变量如下。 ☆PATH是系统路径。 ☆HOME是系统根目录。

☆HISTSIZE是指保存历史命令记录的条数。 ☆LOGNAME是指当前用户的登录名。

☆HOSTNAME是指主机的名称,若应用程序要用到主机名的话,通常是从这个环境变量中来取得的。

☆SHELL是指当前用户用的是哪种Shell。

小知识

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

☆LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。 ☆MAIL是指当前用户的邮件存放目录。 设置环境变量方法如下。

ü 通过etho显示字符串(指定环境变量)。 ü 通过export设置新的环境变量。 ü 通过env显示所有环境变量。

ü 通过set命令显示所有本地定义的Shell变量。 ü 通过unset命令来清除环境变量。

读者可以试着用“env”命令查看“su - root”和“su root”的区别。

2.用户管理(useradd和passwd)

Linux中常见用户管理命令如表2.2所示,本书仅以useradd和passwd为例进行详细讲解,其他命令类似,请读者自行学习使用。

表2.2 命 令 useradd usermod userdel groupadd groupmod groupdel passwd id groups who 添加用户账号 设置用户账号属性 删除对应用户账号 添加组账号 设置组账号属性 删除对应组账号 设置账号密码 显示用户ID、组ID和用户所属的组列表 显示用户所属的组 显示登录到系统的所有用户 Linux常见用户管理命令 命 令 含 义 格 式 useradd [选项] 用户名 usermod [选项] 属性值 userdel [选项] 用户名 groupadd [选项] 组账号 groupmod [选项] 属性值 groupdel [选项] 组账号 passwd [对应账号] id [用户名] groups [组账号] who (1)作用

① useradd:添加用户账号。

② passwd:更改对应用户账号密码。 (2)格式

① useradd:useradd [选项] 用户名。 ② passwd:passwd [选项] [用户名]。 其中的用户名为修改账号密码的用户,若不带用户名,缺省为更改当前使用者账号密码。 (3)常用参数

① useradd主要选项参数见表2.3所示。

表2.3

useradd命令常见参数列表

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。

LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。并被收录到Google 网页目录-计算机 > 软件 > 操作系统 > Linux 目录下。Linux公社(LinuxIDC.com)设置了有一定影响力的Linux专题栏目。包括:Ubuntu专题Fedora专题RedHat专题SUSE专题红旗Linux专题Android专题

Linux公社简介 - 广告服务 - 网站地图 - 帮助信息 - 联系我们

本站(LinuxIDC)所刊载文章不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。

本站带宽由[6688.CC]友情提供

Copyright © 2006-2011 Linux公社 All rights reserved

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令 选 项 -g -m -n

指定用户所属的群组 自动建立用户的登入目录 取消建立以用户名称为名的群组

参 数 含 义

② passwd:一般很少使用选项参数。 (4)使用实例 [root@www root]# useradd yul [root@www root]# passwd yul New password: Retype new password: passwd: all authentication tokens updated successfully [root@www root]# su - yul [yul@www yul]$ [yul@www yul]$ pwd(查看当前目录) /home/yul 实例中先添加了用户名为yul的用户,接着又为该用户设置了账号密码。并从su的命令可以看出,该用户添加成功,其工作目录为”/home/yul”。 (5)使用说明 • 在使用添加用户时,这两个命令是一起使用的,其中,useradd必须用root的权限。而且useradd指令所建立的账号,实际上是保存在“/etc/passwd”文本文件中,文件中每一行包含一个账号信息。 • 在缺省情况下,useradd所做的初始化操作包括在“/home”目录下为对应账号建立一个名为同名的主目录,并且还为该用户单独建立一个与用户名同名的组。 • adduser只是useradd的符号链接(关于符号链接的概念在本节后面会有介绍),两者是相同的。

• passwd还可用于普通用户修改账号密码,Linux并不采用类似windows的密码回显(显示为*号),所以输入的这些字符用户是看不见的。密码最好包括字母、数字和特殊符号,并且设成6位以上。

3.系统管理命令(ps和kill)

Linux中常见的系统管理命令如表2.4所示,本书以ps和kill为例进行讲解。

表2.4 命 令 ps top kill

Linux常见系统管理命令 命 令 含 义

显示当前系统中由该用户运行的进程列表 动态显示系统中运行的程序(一般为每隔5s) 输出特定的信号给指定PID(进程号)的进程

ps [选项] top

kill [选项] 进程号(PID)

格 式

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

uname setup crontab shutdown uptime clear

显示系统的信息(可加选项-a) 系统图形化界面配置 循环执行例行性命令 关闭或重启Linux系统 显示系统已经运行了多长时间 清除屏幕上的信息

uname [选项] setup crontab [选项] shutdown [选项] [时间] uptime clear

(1)作用

① ps:显示当前系统中由该用户运行的进程列表。

② kill:输出特定的信号给指定PID(进程号)的进程,并根据该信号而完成指定的行为。其中可能的信号有进程挂起、进程等待、进程终止等。

(2)格式

① ps:ps [选项]。

② kill:kill [选项] 进程号(PID)。

kill命令中的进程号为信号输出的指定进程的进程号,当选项是缺省时为输出终止信号给该进程。 (3)常见参数 ① ps主要选项参数见表2.5所示。 表2.5 选 项 -ef -aux -w ps命令常见参数列表 参 数 含 义 查看所有进程及其PID(进程号)、系统时间、命令详细目录、执行者等 除可显示-ef所有内容外,还可显示CPU及内存占用率、进程状态 显示加宽并且可以显示较多的信息 ② kill主要选项参数见表2.6所示。

表2.6 选 项 -s -p -l

根据指定信号发送给进程

打印出进程号(PID),但并不送出信号 列出所有可用的信号名称

kill命令常见参数列表

参 数 含 义

(4)使用实例

[root@www root]# ps –ef

UID PID PPID C STIME TTY TIME CMD root 1 0 0 2005 ? 00:00:05 init root 2 1 0 2005 ? 00:00:00 [keventd]

root 3 0 0 2005 ? 00:00:00 [ksoftirqd_CPU0]

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令 root 4 0 0 2005 ? 00:00:00 [ksoftirqd_CPU1]

root 7421 1 0 2005 ? 00:00:00 /usr/local/bin/ntpd -c /etc/ntp. root 21787 21739 0 17:16 pts/1 00:00:00 grep ntp [root@www root]# kill 7421 [root@www root]# ps -ef|grep ntp

root 217 21739 0 17:16 pts/1 00:00:00 grep ntp

该实例中首先查看所有进程,并终止进程号为7421的ntp进程,之后再次查看时已经没有该进程号的进程。

(5)使用说明

• ps在使用中通常可以与其他一些命令结合起来使用,主要作用是提高效率。

• ps选项中的参数w可以写多次,通常最多写3次,它的含义表示加宽3次,这足以显示很长的命令行了。例如:ps –auxwww。

管道是Linux中信息通信的重要方式。它是把一个程序的输出直接连接到另一个程序的输入,而不经过任何中间文件。管道线是指连接二个或更多程序管道的通路。在shell中字符”|”表

小知识 示管道线。如前例子中的ps –ef|grep ntp所示,ps –ef的结果直接输入到grep ntp的程序中(关于grep命令在后面会有详细的介绍)。grep、pr、sort和wc都可以在上述管道线上工作。读者可以灵活地运用管道机制提高工作效率。 4.磁盘相关命令(fdisk) Linux中与磁盘相关的命令如表2.7所示,本书仅以fdisk为例进行讲解。 表2.7 选 项 free df du fdisk Linux常见系统管理命令 参 数 含 义 查看当前系统内存的使用情况 查看文件系统的磁盘空间占用情况 统计目录(或文件)所占磁盘空间的大小 查看硬盘分区情况及对硬盘进行分区管理 df [选项] du [选项] fdisk [-l] 格 式 free [选项] (1)作用

fdisk可以查看硬盘分区情况,并可对硬盘进行分区管理,这里主要向读者介绍查看硬盘分区情况,另外,fdisk也是一个非常好的硬盘分区工具,感兴趣的读者可以另外查找资料学习使用fdisk进行硬盘分区。

(2)格式 fdisk [-l]

(3)使用实例

[root@sunq ~]# fdisk -l

Disk /dev/hda: 40.0 GB, 40007761920 bytes 240 heads, 63 sectors/track, 5168 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

Device Boot Start End Blocks Id System

/dev/hda1 * 1 1084 8195008+ c W95 FAT32 (LBA) /dev/hda2 1085 5167 30867480 f W95 Ext'd (LBA) /dev/hda5 1085 2439 10243768+ b W95 FAT32 /dev/hda6 2440 40 12284968+ b W95 FAT32 /dev/hda7 4065 5096 7799526 83 Linux /dev/hda8 5096 5165 522081 82 Linux swap

可以看出,使用”fdisk –l”列出了文件系统的分区情况。 (4)使用说明

• 使用fdisk必须拥有root权限。

• IDE硬盘对应的设备名称分别为hda、hdb、hdc和hdd,SCSI硬盘对应的设备名称则为sda、sdb、…此外,hda1代表hda的第一个硬盘分区,hda2代表hda的第二个分区,依此类推。

• 通过查看/var/log/messages文件,可以找到Linux系统已辨认出来的设备代号。

5.磁盘挂载命令(mount)

(1)作用

挂载文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。正如1.2.1节中所述,挂载是指把分区和目录对应的过程,而挂载点是指挂载在文件树中的位置。mount命令就可以把文件系统挂载到相应的目录下,并且由于Linux中把设备都当作文件一样使用,因此,mount命令也可以挂载不同的设备。

通常,在Linux下“/mnt”目录是专门用于挂载不同的文件系统的,它可以在该目录下新建不同的子目录来挂载不同的设备文件系统。

(2)格式

mount [选项] [类型] 设备文件名 挂载点目录 其中的类型是指设备文件的类型。 (3)常见参数

mount常见参数如表2.8所示。

表2.8 选 项 -a -l -t 类型 -f

mount命令选项常见参数列表

参 数 含 义

依照/etc/fstab的内容装载所有相关的硬盘 列出当前已挂载的设备、文件系统名称和挂载点

将后面的设备以指定类型的文件格式装载到挂载点上。常见的类型有前面介绍过的几种:vfat、ext3、ext2、iso9660、nfs等

通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用

(4)使用实例

使用mount命令主要通过以下几个步骤。

① 确认是否为Linux可以识别的文件系统,Linux可识别的文件系统只要是以下几种。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

• Windows95/98常用的FAT32文件系统:vfat。 • WinNT/2000的文件系统:ntfs。 • OS/2用的文件系统:hpfs。

• Linux用的文件系统:ext2、ext3、nfs。 • CD-ROM光盘用的文件系统:iso9660。

② 确定设备的名称,确定设备名称可通过使用命令“fdisk -l”查看。 ③ 查找挂接点。

必须确定挂载点已经存在,也就是在“/mnt”下的相应子目录已经存在,一般建议在“/mnt”下新建几个如“/mnt/windows”,“/mnt/usb”的子目录,现在有些新版本的Linux(如红旗Linux、中软Linux、MandrakeLinux)都可自动挂载文件系统,Red Hat仅可自动挂载光驱。

④ 挂载文件系统如下所示。 [root@sunq mnt]# mount -t vfat /dev/hda1 /mnt/c [root@sunq mnt]# cd /mnt/c 24.s03e01.pdtv.xvid-sfm.rmvb Documents and Settings Program Files 24.s03e02.pdtv.xvid-sfm.rmvb Downloads Recycled C盘是原先笔者Windows系统的启动盘。可见,在挂载了C盘之后,可直接访问Windows下的C盘的内容。 ⑤ 在使用完该设备文件后可使用命令umount将其卸载。 [root@sunq mnt]# umount /mnt/c [root@sunq mnt]# cd /mnt/c [root@sunq c]# ls … 可见,此时目录“/mnt/c”下为空。Windows下的C盘成功卸载。 • 在Linux下如何使用U盘呢? 一般U盘为SCSI格式的硬盘,其格式为vfat格式,其设备号可通过“fdisk –l”进行查看,假

,则可用如下命令就可将其挂载: 小知识 若设备名为“/dev/sda1”

mount -t vfat /dev/sda1 /mnt/u

• 若想设置在开机时自动挂载,可在文件“/etc/fstab”中加入相应的设置行即可。

2.1.2 文件目录相关命令

由于Linux中有关文件目录的操作非常重要,也非常常用,因此在本节中,作者将基本

所有的文件操作命令都进行了讲解。

1.cd

(1)作用

改变工作目录。 (2)格式

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

cd [路径]

其中的路径为要改变的工作目录,可为相对路径或绝对路径。 (3)使用实例

[root@www uclinux]# cd /home/sunq/ [root@www sunq]# pwd

[root@www sunq]# /home/sunq/

该实例中变更工作目录为“/home/sunq/”,在后面的pwd(显示当前目录)的结果中可以看出。 (4)使用说明

• 该命令将当前目录改变至指定路径的目录。若没有指定路径,则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读权限。

• 该命令可以使用通配符。

• 可使用“cd –”可以回到前次工作目录。 • “./”代表当前目录,“../”代表上级目录。

2.ls (1)作用 列出目录的内容。 (2)格式:ls [选项] [文件] 其中文件选项为指定查看指定文件的相关内容,若未指定文件,默认查看当前目录下的所有文件。 (3)常见参数 ls主要选项参数见表2.9所示 表2.9 选 项 -1,--format=single-column -a,-all -d -l,--format=long, --format=verbose -f ls命令常见参数列表 参 数 含 义 一行输出一个文件(单列输出) 列出目录中所有文件,包括以“.”开头的文件 将目录名和其他文件一样列出,而不是列出目录的内容 除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小(Byte)及时间信息(如未指明是其他时间即指修改时间) 不排序目录内容,按它们在磁盘上存储的顺序列出 (4)使用实例

total 220

[yuling@www /]$ ls -l

drwxr-xr-x 2 root root 4096 Mar 31 2005 bin drwxr-xr-x 3 root root 4096 Apr 3 2005 boot -rw-r--r-- 1 root root 0 Apr 24 2002 test.run …

该实例查看当前目录下的所有文件,并通过选项“-l”显示出详细信息。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

显示格式说明如下。

文件类型与权限 链接数 文件属主 文件属组 文件大小 修改的时间 名字 (5)使用说明

• 在ls的常见参数中,-l(长文件名显示格式)的选项是最为常见的。可以详细显示出各种信息。

• 若想显示出所有“.”开头的文件,可以使用-a,这在嵌入式的开发中很常用。 注意

Linux中的可执行文件不是与Windows一样通过文件扩展名来标识的,而是通过设置文件相应的可执行属性来实现的。

3.mkdir

(1)作用

创建一个目录。 (2)格式

mkdir [选项] 路径 (3)常见参数

mkdir主要选项参数如表2.10所示 表2.10 选 项 -m -p mkdir命令常见参数列表 参 数 含 义 对新建目录设置存取权限,也可以用chmod命令(在本节后会有详细说明)设置 可以是一个路径名称。此时若此路径中的某些目录尚不存在,在加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录 (4)使用实例 [root@www sunq]# mkdir -p ./hello/my [root@www my]# pwd(查看当前目录命令) /home/sunq/hello/my 该实例使用选项“-p”一次创建了./hello/my多级目录。

[root@www my]# mkdir -m 777 ./why [root@www my]# ls -l total 4

drwxrwxrwx 2 root root 4096 Jan 14 09:24 why

该实例使用改选项“-m”创建了相应权限的目录。对于“777”的权限在本节后面会有详细的说明。

(5)使用说明

该命令要求创建目录的用户在创建路径的上级目录中具有写权限,并且路径名不能是当前目录中已有的目录或文件名称。

4.cat (1)作用

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

连接并显示指定的一个和多个文件的有关信息。 (2)格式

cat[选项]文件1文件2…

其中的文件1、文件2为要显示的多个文件。 (3)常见参数

cat命令的常见参数如表2.11所示。

表2.11

选 项

-n -b

cat命令常见参数列表

参 数 含 义

由第一行开始对所有输出的行数编号 和-n相似,只不过对于空白行不编号

(4)使用实例 [yul@www yul]$ cat -n hello1.c hello2.c 1 #include 2 void main() 3 { 4 printf(\"Hello!This is my home!\\n\"); 5 } 6 #include 7 void main() 8 { 9 printf(\"Hello!This is your home!\\n\"); 10 } 在该实例中,指定对hello1.c和hello2.c进行输出,并指定行号。 5.cp、mv和rm (1)作用

① cp:将给出的文件或目录复制到另一文件或目录中。

② mv:为文件或目录改名或将文件由一个目录移入另一个目录中。 ③ rm:删除一个目录中的一个或多个文件或目录。 (2)格式

① cp:cp [选项] 源文件或目录 目标文件或目录。 ② mv:mv [选项] 源文件或目录 目标文件或目录。 ③ rm:rm [选项] 文件或目录。 (3)常见参数

① cp主要选项参数见表2.12所示。

表2.12 选 项 -a

cp命令常见参数列表

参 数 含 义

保留链接、文件属性,并复制其子目录,其作用等于dpr选项的组合

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

-d -f -i -p -r

拷贝时保留链接

删除已经存在的目标文件而不提示

在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,而且是交互式拷贝 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名

② mv主要选项参数如表2.13所示。

表2.13 选 项 -i -f

mv命令常见参数列表

参 数 含 义

若mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,并要求用户回答y或n,这样可以避免误覆盖文件

禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,在指定此选项后,i选项将不再起作用

③ rm主要选项参数如表2.14所示。

表2.14 选 项 -i -f -r 进行交互式删除 忽略不存在的文件,但从不给出提示 指示rm将参数中列出的全部目录和子目录均递归地删除 rm命令常见参数列表 参 数 含 义 (4)使用实例 ① cp [root@www hello]# cp -a ./my/why/ ./ [root@www hello]# ls my why 该实例使用-a选项将“/my/why”目录下的所有文件复制到当前目录下。而此时在原先目录下还有原有的文件。

② mv

[root@www hello]# mv -i ./my/why/ ./ [root@www hello]# ls my why

该实例中把“/my/why”目录下的所有文件移至当前目录,则原目录下文件被自动删除。 ③ rm

[root@www hello]# rm –r -i ./why rm: descend into directory './why'? y rm: remove './why/my.c'? y

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

该实例使用“-r”选项删除“./why”目录下所有内容,系统会进行确认是否删除。 (5)使用说明

① cp:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。 ② mv:

• 该命令根据命令中第二个参数类型的不同(是目标文件还是目标目录)来判断是重命名还是移动文件,当第二个参数类型是文件时,mv命令完成文件重命名,此时,它将所给的源文件或目录重命名为给定的目标文件名;

• 当第二个参数是已存在的目录名称时,mv命令将各参数指定的源文件均移至目标目录中; • 在跨文件系统移动文件时,mv先复制,再将原有文件删除,而链至该文件的链接也将丢失。

③ rm:

• 如果没有使用- r选项,则rm不会删除目录;

• 使用该命令时一旦文件被删除,它是不能被恢复的,所以最好使用-i参数。

6.chown和chgrp

(1)作用

① chown:修改文件所有者和组别。 ② chgrp:改变文件的组所有权。 (2)格式

① chown:chown [选项]...文件所有者[所有者组名] 文件 其中的文件所有者为修改后的文件所有者。 ② chgrp:chgrp [选项]... 文件所有组 文件 其中的文件所有组为改变后的文件组拥有者。 (3)常见参数

chown和chgrp的常见参数意义相同,其主要选项参数如表2.15所示。

表2.15

选 项

-c,-changes -f,--silent,--quiet

chown和chgrp命令常见参数列表

参 数 含 义

详尽地描述每个file实际改变了哪些所有权 不打印文件所有权就不能修改的报错信息

rm: remove directory './why'? y

(4)使用实例

在笔者的系统中一个文件的所有者原先是这样的。

[root@www sunq]# ls -l

可以看出,这是一个文件,它的文件拥有者是apectel,具有可读写和执行的权限,它所属的用户组是sunq,具有可读和执行的权限,但没有可写的全权,同样,系统其他用户对其也只有可读和执行的权限。

-rwxr-xr-x 15 apectel sunq 4096 6月 4 2005 uClinux-dist.tar

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

首先使用chown将文件所有者改为root。

[root@www sunq]# chown root uClinux-dist.tar [root@www sunq]# ls –l

可以看出,此时,该文件拥有者变为了root,它所属文件用户组不变。 接着使用chgrp将文件用户组变为root。

[root@www sunq]# chgrp root uClinux-dist.tar [root@www sunq]# ls –l

-rwxr-xr-x 15 root sunq 4096 6月 4 2005 uClinux-dist.tar

(5)使用说明

• 使用chown和chgrp必须拥有root权限。 小技巧

-rwxr-xr-x 15 root root 4096 6月 4 2005 uClinux-dist.tar

在进行有关文件的操作时,若想避免输入冗长的文件,在文件名没有重复的情况下可以使用输入文件前几个字母+键的方式,即:cd:/uC=cd:/uClinux-list

7.chmod

(1)作用

改变文件的访问权限。 (2)格式

chmod可使用符号标记进行更改和八进制数指定更改两种方式,因此它的格式也有两种不同的形式。

① 符号标记:chmod [选项]…符号权限[符号权限]…文件

其中的符号权限可以指定为多个,也就是说,可以指定多个用户级别的权限,但它们中间要用逗号分开表示,若没有显示指出则表示不作更改。

② 八进制数:chmod [选项] …八进制权限 文件… 其中的八进制权限是指要更改后的文件权限。 (3)选项参数

chmod主要选项参数如表2.16所示。

表2.16

选 项

-c -f -v

chmod命令常见参数列表

参 数 含 义

若该文件权限确实已经更改,才显示其更改动作 若该文件权限无法被更改也不要显示错误信息 显示权限变更的详细资料

(4)使用实例

chmod涉及文件的访问权限,在此对相关的概念进行简单的回顾。

在1.3.1节中已经提到,文件的访问权限可表示成:- rwx rwx rwx。在此设有三种不同的访问权限:读(r)、写(w)和运行(x)。三个不同的用户级别:文件拥有者(u)、所属

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

的用户组(g)和系统里的其他用户(o)。在此,可增加一个用户级别a(all)来表示所有这三个不同的用户级别。

① 对于第一种符号连接方式的chmod命令中,用加号“+”代表增加权限,用减号“−”删除权限,等于号“=”设置权限。

例如原先笔者系统中有文件uClinux20031103.tgz,其权限如下所示。

[root@www sunq]# ls –l

-rw-r--r-- 1 root root 79708616 Mar 24 2005 uClinux20031103.tgz [root@www sunq]# chmod a+rx,u+w uClinux20031103.tgz [root@www sunq]# ls –l

-rwxr-xr-x 1 root root 79708616 Mar 24 2005 uClinux20031103.tgz

可见,在执行了chmod之后,文件拥有者除拥有所有用户都有的可读和执行的权限外,还有可写的权限。

② 对于第二种八进制数指定的方式,将文件权限字符代表的有效位设为“1”,即“rw-”、“rw-”和“r--”的八进制表示为“110”、“110”、“100”,把这个2进制串转换成对应的8进制数就是6、6、4,也就是说该文件的权限为6(三位八进制数)。这样对于转化后8进制数、2进制及对应权限的关系如表2.17所示。 表2.17 转换后8进制数 0 2 4 6 2 进 制 000 010 100 110 转化后8进制数、2进制及对应权限的关系 对 应 权 限 没有任何权限 只写 只读 读和写 转换后8进制数 1 3 5 7 2 进 制 001 011 101 111 对 应 权 限 只能执行 只写和执行 只读和执行 读,写和执行 同上例,原先笔者系统中有文件genromfs-0.5.1.tar.gz,其权限如下所示。 [root@www sunq]# ls –l

-rw-rw-r-- 1 sunq sunq 203 Dec 29 2004 genromfs-0.5.1.tar.gz [root@www sunq]# chmod 765 genromfs-0.5.1.tar.gz [root@www sunq]# ls –l

-rwxrw-r-x 1 sunq sunq 203 Dec 29 2004 genromfs-0.5.1.tar.gz

可见,在执行了chmod 765之后,该文件的拥有者权限、文件组权限和其他用户权限都恰当地对应了。

(5)使用说明

• 使用chmod必须具有root权限。 想一想

chmod o+x uClinux20031103.tgz是什么意思?它所对应的8进制数指定更改应如何表示?

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

8.grep

(1)作用

在指定文件中搜索特定的内容,并将含有这些内容的行标准输出。 (2)格式

grep [选项] 格式 [文件及路径]

其中的格式是指要搜索的内容格式,若缺省“文件及路径”则默认表示在当前目录下搜索。 (3)常见参数

grep主要选项参数如表2.18所示。

表2.18

选 项 -c -I -h -l -n -s -v 只输出匹配行的计数 不区分大小写(只适用于单字符) 查询多文件时不显示文件名 查询多文件时只输出包含匹配字符的文件名 显示匹配行及行号 不显示不存在或无匹配文本的错误信息 显示不包含匹配文本的所有行 grep命令常见参数列表

参 数 含 义 (4)使用实例 [root@www sunq]# grep \"hello\" / -r Binary file ./iscit2005/备份/iscit2004.sql matches ./ARM_TOOLS/uClinux-Samsung/linux-2.4.x/Documentation/s390/Debugging390.txt:hello world$2 = 0 该本例中,“hello”是要搜索的内容,“/ -r”是指定文件,表示搜索根目录下的所有文件。 (5)使用说明

• 在缺省情况下,“grep”只搜索当前目录。如果此目录下有许多子目录,“grep”会以如下形式列出:“grep:sound:Is a directory”这会使“grep”的输出难于阅读。但有两种解决的方法:

① 明确要求搜索子目录:grep –r(正如上例中所示); ② 忽略子目录:grep -d skip。

• 当预料到有许多输出,可以通过管道将其转到“less”(分页器)上阅读:如grep \"h\" ./ -r |less分页阅读。

• grep特殊用法:

grep pattern1|pattern2 files:显示匹配pattern1或pattern2的行;

grep pattern1 files|grep pattern2:显示既匹配pattern1又匹配pattern2的行; 小知识

在文件命令中经常会使用pattern正则表达式,它是可以描述一类字符串的模式(Pattern),如果一个字符串可以用某个正则表达式来描述,就称这个字符和该正则表达式匹配。这和DOS

… Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

中用户可以使用通配符“*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作等。 正则表达式的主要参数有:

• \\:忽略正则表达式中特殊字符的原有含义; • ^:匹配正则表达式的开始行; • $:匹配正则表达式的结束行; • <:从匹配正则表达式的行开始; • >:到匹配正则表达式的行结束; • [ ]:单个字符,如[A]即A符合要求;

• [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求; :所有的单个字符; • 。

• *:所有字符,长度可以为0。

9.find

(1)作用

在指定目录中搜索文件,它的使用权限是所有用户。 (2)格式 find [路径][选项][描述] 其中的路径为文件搜索路径,系统开始沿着此目录树向下查找文件。它是一个路径列表,相互用空格分离。若缺省路径,那么默认为当前目录。 其中的描述是匹配表达式,是find命令接受的表达式。 (3)常见参数 [选项]主要参数如表2.19所示。 表2.19 选 项 -depth -mount find选项常见参数列表 参 数 含 义 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容 不在其他文件系统(如Msdos、Vfat等)的目录和文件中查找 [描述]主要参数如表2.20所示。

表2.20

选 项

find描述常见参数列表

参 数 含 义

支持通配符*和?

用户名:搜索文件属主为用户名(ID或名称)的文件 输出搜索结果,并且打印

-name -user -print

(4)使用实例

./qiong1.c

[root@www sunq]# find ./ -name qiong*.c ./iscit2005/qiong.c

在该实例中使用了-name的选项支持通配符。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

(5)使用说明

• 若使用目录路径为“/”,通常需要查找较多的时间,可以指定更为确切的路径以减少查找时间。

• find命令可以使用混合查找的方法,例如,想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and(与)把两个查找参数链接起来组合成一个混合的查找方式,如“find /etc -size +500000c -and -mtime +1”。

10.locate

(1)作用

用于查找文件。其方法是先建立一个包括系统内所有文件名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。因此其速度比find快很多。

(2)格式 locate [选项]

(3)locate主要选项参数如表2.21所示。

表2.21 选 项 -u -U -f -r -o 从根目录开始建立数据库 指定开始的位置建立数据库 将特定的文件系统排除在数据库外,例如proc文件系统中的文件 使用正则运算式做寻找的条件 指定数据库存的名称 locate命令常见参数列表

参 数 含 义 (4)使用实例 [root@www sunq]# locate issue -U ./ [root@www sunq]# updatedb [root@www sunq]# locate -r issue* ./ARM_TOOLS/uClinux-Samsung/lib/libpam/doc/modules/pam_issue.sgml ./ARM_TOOLS/uClinux-Samsung/lib/libpam/modules/pam_issue ./ARM_TOOLS/uClinux-Samsung/lib/libpam/modules/pam_issue/Makefile ./ARM_TOOLS/uClinux-Samsung/lib/libpam/modules/pam_issue/pam_issue.c … 示例中首先在当前目录下建立了一个数据库,并且在更新了数据库之后进行正则匹配查找。通过运行可以发现locate的运行速度非常快。

(5)使用说明

locate命令所查询的数据库由updatedb程序来更新的,而updatedb是由cron daemon周期性建立的,但若所找到的档案是最近才建立或刚更名的,可能会找不到,因为updatedb默认每天运行一次,用户可以由修改crontab(etc/crontab)来更新周期值。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

11.ln

(1)作用

为某一个文件在另外一个位置建立一个符号链接。当需要在不同的目录用到相同的文件时,Linux允许用户不用在每一个需要的目录下都存放一个相同的文件,而只需将其他目录下文件用ln命令链接即可,这样就不必重复地占用磁盘空间。

(2)格式

ln[选项] 目标 目录 (3)常见参数

Ø −s建立符号链接(这也是通常惟一使用的参数)。 (4)使用实例 [root@www uclinux]# ln -s ../genromfs-0.5.1.tar.gz ./hello [root@www uclinux]# ls -l total 77948 lrwxrwxrwx 1 root root 24 Jan 14 00:25 hello -> ../genromfs-0.5.1.tar.gz 该实例建立了当前目录的hello文件与上级目录之间的符号连接,可以看见,在hello的ls –l中的第一位为“l”,表示符号链接,同时还显示了链接的源文件。 (5)使用说明 • ln命令会保持每一处链接文件的同步性,也就是说,不论改动了哪一处,其他的文件都会发生相同的变化。 • ln的链接又软链接和硬链接两种: 软链接就是上面所说的ln -s ** **,它只会在用户选定的位置上生成一个文件的镜像,不会重复占用磁盘空间,平时使用较多的都是软链接; 硬链接是不带参数的ln ** **,它会在用户选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

2.1.3 压缩打包相关命令

Linux中打包压缩的如表2.22所示,本书以gzip和tar为例进行讲解。

表2.22 命 令 bzip2 bunzip2 bzip2recover gzip gunzip unzip compress tar

Linux常见系统管理命令 命 令 含 义

.bz2文件的压缩(或解压)程序 .bz2文件的解压缩程序 用来修复损坏的.bz2文件 .gz文件的压缩程序 解压被gzip压缩过的文件 解压winzip压缩的.zip文件 对文件目录进行打包或解包

格 式

bzip2[选项] 压缩(解压缩)的文件名 bunzip2[选项] .bz2压缩文件 bzip2recover .bz2压缩文件

gzip [选项] 压缩(解压缩)的文件名 gunzip [选项] .gz文件名 unzip [选项] .zip压缩文件

tar [选项] [打包后文件名]文件目录列表

早期的压缩或解压程序(压缩后文件名为.Z) compress [选项] 文件

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

1.gzip

(1)作用

对文件进行压缩和解压缩,而且gzip根据文件类型可自动识别压缩或解压。 (2)格式

gzip [选项] 压缩(解压缩)的文件名。 (3)常见参数

gzip主要选项参数如表2.23所示。

表2.23 选 项 -c -d -l -r -t -v 将压缩文件解压 对每个压缩文件,显示下列字段:压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字 查找指定目录并压缩或解压缩其中的所有文件 测试,检查压缩文件是否完整 对每一个压缩和解压的文件,显示文件名和压缩比 gzip命令常见参数列表

参 数 含 义 将输出信息写到标准输出上,并保留原有文件 (4)使用实例 [root@www my]# gzip hello.c [root@www my]# ls hello.c.gz [root@www my]# gzip -l hello.c compressed uncompressed ratio uncompressed_name 61 39.3% hello.c 该实例将目录下的“hello.c”文件进行压缩,选项“-l”列出了压缩比。 (5)使用说明

• 使用gzip压缩只能压缩单个文件,而不能压缩目录,其选项“-d”是将该目录下的所有文件逐个进行压缩,而不是压缩成一个文件。

2.tar

(1)作用

对文件目录进行打包或解包。

在此需要对打包和压缩这两个概念进行区分。打包是指将一些文件或目录变成一个总的文件,而压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?这是由于在Linux中的很多压缩程序(如前面介绍的gzip)只能针对一个文件进行压缩,这样当想要压缩较多文件时,就要借助它的工具将这些堆文件先打成一个包,然后再用原来的压缩程序进行压缩。

(2)格式

tar [选项] [打包后文件名]文件目录列表。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

tar可自动根据文件名识别打包或解包动作,其中打包后文件名为用户自定义的打包后文件名称,文件目录列表可以是要进行打包备份的文件目录列表,也可以是进行解包的文件目录列表。

(3)主要参数

tar主要选项参数如表2.24所示。

表2.24 选 项 -c -r -x -o -v -f -z -j -Z 建立新的打包文件 向打包文件末尾追加文件 从打包文件中解出文件 将文件解开到标准输出 处理过程中输出相关信息 对普通文件操作 调用gzip来压缩打包文件,与-x联用时调用gzip完成解压缩 调用bzip2来压缩打包文件,与-x联用时调用bzip2完成解压缩 调用compress来压缩打包文件,与-x联用时调用compress完成解压缩 tar命令常见参数列表

参 数 含 义 (4)使用实例 [root@www home]# tar -cvf yul.tar ./yul ./yul/ ./yul/.bash_logout ./yul/.bash_profile ./yul/.bashrc ./yul/.bash_history ./yul/my/ ./yul/my/1.c.gz ./yul/my/my.c.gz ./yul/my/hello.c.gz ./yul/my/why.c.gz [root@www home]# ls -l yul.tar -rw-r--r-- 1 root root 10240 Jan 14 15:01 yul.tar 该实例将“./yul”目录下的文件加以打包,其中选项“-v”在屏幕上输出了打包的具体过程。

[root@www sunq]# tar -zxvf linux-2.6.11.tar.gz linux-2.6.11/

linux-2.6.11/drivers/ linux-2.6.11/drivers/video/ linux-2.6.11/drivers/video/aty/

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

该实例用选项“-z”调用gzip,并-x联用时完成解压缩。 (5)使用说明

tar命令除了用于常规的打包之外,使用更为频繁的是用选项“-z”或“-j”调用gzip或bzip2(Linux中另一种解压工具)完成对各种不同文件的解压。

表2.25对Linux中常见类型的文件解压命令做一总结。

表2.25 文 件 后 缀 .a .z .gz .tar.Z .tar.gz/.tgz tar.bz2 .rpm .deb(Debain中的文件格式) .zip Linux常见类型的文件解压命令一览表

解 压 命 令 tar xv Uncompress Gunzip tar xvZf tar xvzf tar jxvf 安装:rpm –i 解压:rpm2cpio 安装:dpkg –i 解压:dpkg-deb --fsys-tarfile Unzip 示 例 tar xv hello.a uncompress hello.Z gunzip hello.gz tar xvZf hello.tar.Z tar xvzf hello.tar.gz tar jxvf hello.tar.bz2 安装:rpm -i hello.rpm 解压:rpm2cpio hello.rpm 安装:dpkg -i hello.deb 解压:dpkg-deb --fsys-tarhello hello.deb unzip hello.zip …

2.1.4 比较合并文件相关命令 1.diff (1)作用 比较两个不同的文件或不同目录下的两个同名文件功能,并生成补丁文件。 (2)格式 diff[选项] 文件1 文件2

diff比较文件1和文件2的不同之处,并按照选项所指定的格式加以输出。diff的格式分为命令格式和上下文格式,其中上下文格式又包括了旧版上下文格式和新版上下文格式,命令格式分为标准命令格式、简单命令格式及混合命令格式,它们之间的区别会在使用实例中进行详细地讲解。当选项缺省时,diff默认使用混合命令格式。

(3)主要参数

diff主要选项参数如表2.26所示。

表2.26 选 项 -r -q -e,-ed -f

对目录进行递归处理

只报告文件是否有不同,不输出结果 命令格式

RCS(修订控制系统)命令简单格式

diff命令常见参数列表

参 数 含 义

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

-c,--context -u,--unified -Z

旧版上下文格式 新版上下文格式

调用compress来压缩归档文件,与-x联用时调用compress完成解压缩

(4)使用实例

以下有两个文件hello1.c和hello2.c。 //hello1.c #include void main() { printf(\"Hello!This is my home!\\n\"); } //hello2.c #include void main() { printf(\"Hello!This is your home!\\n\"); } 以下实例主要讲解了各种不同格式的比较和补丁文件的创建方法。 ① 主要格式比较 首先使用旧版上下文格式进行比较。 [root@www yul]# diff -c hello1.c hello2.c *** hello1.c Sat Jan 14 16:24:51 2006 --- hello2.c Sat Jan 14 16::41 2006 *************** *** 1,5 **** #include void main() { ! printf(\"Hello!This is my home!\\n\"); } --- 1,5 ---- #include void main() { ! printf(\"Hello!This is your home!\\n\"); }

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

可以看出,用旧版上下文格式进行输出时,在显示每个有差别行的同时还显示该行的上下三行,区别的地方用“!”加以标出,由于示例程序较短,上下三行已经包含了全部代码。

接着使用新版的上下文格式进行比较。

[root@www yul]# diff -u hello1.c hello2.c --- hello1.c Sat Jan 14 16:24:51 2006 +++ hello2.c Sat Jan 14 16::41 2006 @@ -1,5 +1,5 @@ #include void main() {

- printf(\"Hello!This is my home!\\n\"); + printf(\"Hello!This is your home!\\n\"); }

可以看出,在新版上下文格式输出时,仅把两个文件的不同之处分别列出,而相同之处没有重复列出,这样大大方便了用户的阅读。 接下来使用命令格式进行比较。 [root@www yul]# diff -e hello1.c hello2.c 4c printf(\"Hello!This is your home!\\n\"); 可以看出,命令符格式输出时仅输出了不同的行,其中命令符“4c”中的数字表示行数,字母的含义为a——添加,b——删除,c——更改。因此,-e选项的命令符表示:若要把hello1.c变为hello2.c,就需要把hello1.c的第四行改为显示出的“printf(“Hello!This is your home!\\n”);”即可。 选项“-f”和选项“-e”显示的内容基本相同,就是数字和字母的顺序相交换了,从以下的输出结果可以看出。

[root@www yul]# diff -f hello1.c hello2.c c4

printf(\"Hello!This is your home!\\n\");

在diff选项缺省的情况下,输出结果如下所示。

4c4

[root@www yul]# diff hello1.c hello2.c < printf(\"Hello!This is my home!\\n\"); ---

> printf(\"Hello!This is your home!\\n\");

可以看出,diff缺省情况下的输出格式充分显示了如何将hello1.c转化为hello2.c的方法,即通过“4c4”实现。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

② 创建补丁文件(也就是差异文件)是diff的功能之一,不同的选项格式可以生成与之相对应的补丁文件。见下例。

[root@www yul]# diff hello1.c hello2.c >hello.patch [root@www yul]# vi hello.patch 4c4

< printf(\"Hello!This is my home!\\n\"); ---

> printf(\"Hello!This is your home!\\n\");

可以看出,使用缺省选项创建补丁文件的内容和前面使用缺省选项的输出内容是一样的。

上例中所使用的”>“是输出重定向。通常在Linux上执行一个shell命令行时,会自动打开三个标准文件:标准输入文件(stdin),即通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),前两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,并且将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。这就是通常使用的标准输入/输出方式。

直接使用标准输入/输出文件存在以下问题:首先,用户输入的数据只能使用一次。当下次希望再次使用这些数据时就不得不重新输入。同样,用户对输出信息不能做更多的处理,只能

小知识 等待程序的结束。

为了解决上述问题,Linux系统为输入、输出的信息传送引入了两种方式:输入/输出重定向机制和管道(在1.3.1的小知识中已有介绍)。其中,输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。同样,输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就可以不显示在屏幕上,而是写入到指定文件中。就如上述例子中所用到的把“diff hello1.c hello2.c”的结果重定向到hello.patch文件中。这就大大增加了输入/输出的灵活性。

2.patch

(1)作用

命令跟diff配合使用,把生成的补丁文件应用到现有代码上。 (2)格式

patch [选项] [待patch的文件[patch文件]]。 常用的格式为:patch -pnum [patch文件],其中的-pnum是选项参数,在后面会详细介绍。 (3)常见参数

patch主要选项参数如表2.27所示。

表2.27

选 项

-b -d

生成备份文件

把dir设置为解释补丁文件名的当前目录

patch命令常见参数列表

参 数 含 义

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

-e -pnum -t -v

把输入的补丁文件看作是ed脚本 剥离文件名中的前NUM个目录成分 在执行过程中不要求任何输入 显示patch的版本号

以下对-punm选项进行说明。

首先查看以下示例(对分别位于xc.orig/config/cf/Makefile和xc.bsd/config/cf/Makefile的文件使用patch命令)。

以下是patch文件的头标记。

diff -ruNa xc.orig/config/cf/Makefile xc.bsd/config/cf/Makefile

--- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999

这个patch如果直接应用,那么它会去找“xc.orig/config/cf”目录下的Makefile文件,假如用户源码树的根目录是缺省的xc而不是xc.orig,则除了可以把xc.orig移到xc处之外,还有什么简单的方法应用此patch吗?NUM就是为此而设的:patch会把目标路径名剥去NUM个“/”,也就是说,在此例中,-p1的结果是config/cf/Makefile,-p2的结果是cf/Makefile。因此,在此例中就可以用命令cd xc;patch _p1 < /pathname/xxx.patch完成操作。 (4)使用实例 [root@www yul]# diff hello1.c hello2.c >hello1.patch [root@www yul]# patch ./hello1.c < hello1.patch patching file ./hello1.c [root@www yul] ]# vi hello1.c #include void main() { printf(\"Hello!This is your home!\\n\"); } +++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000

在该实例中,由于patch文件和源文件在同一目录下,因此直接给出了目标文件的目录,在应用了patch之后,hello1.c的内容变为了hello2.c的内容。

(5)使用说明

• 如果patch失败,patch命令会把成功的patch行补上其差异,同时(无条件)生成备份文件和一个.rej文件。.rej文件里是没有成功提交的patch行,需要手工打上补丁。这种情况在原码升级的时候有可能会发生。

• 在多数情况下,patch程序可以确定补丁文件的格式,当它不能识别时,可以使用-c、-e、-n或者-u选项来指定输入的补丁文件的格式。由于只有GNU patch可以创建和读取新版上下文格式的patch文件,因此,除非能够确定补丁所面向的只是那些使用GNU工具的用户,否则应该使用旧版上下文格式来生成补丁文件。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

• 为了使patch程序能够正常工作,需要上下文的行数至少是2行(即至少是有一处差别的文件)。

2.1.5 网络相关命令

Linux下网络相关的常见命令如下表2.28所示,本书仅以ifconfig和ftp为例进行说明。

表2.28 选 项 netstat nslookup finger ping ifconfig ftp telnet ssh

Linux下网络相关命令 参 数 含 义

显示网络连接、路由表和网络接口信息 查询一台机器的IP地址和其对应的域名 查询用户的信息

用于查看网络上的主机是否在工作 查看和配置网络接口的参数 利用ftp协议上传和下载文件 利用telnet协议浏览信息 利用ssh登录对方主机

netstat [-an]

Nslookup [IP地址/域名]

finger [选项] [使用者] [用户@主机] ping [选项] 主机名/IP地址 ifconfig [选项] [网络接口] 在本节中会详细讲述 telent [选项] [IP地址/域名] ssh [选项] [IP地址]

常见选项格式

1.ifconfig

(1)作用

用于查看和配置网络接口的地址和参数,包括IP地址、网络掩码、广播地址,它的使用权限是超级用户。

(2)格式

ifconfig有两种使用格式,分别用于查看和更改网络接口。

① ifconfig [选项] [网络接口]:用来查看当前系统的网络配置情况。

② ifconfig 网络接口 [选项] 地址:用来配置指定接口(如eth0,eth1)的IP地址、网络掩码、广播地址等。

(3)常见参数

ifconfig第二种格式常见选项参数如表2.29所示。

表2.29 ftp命令选项常见参数列表

选 项

-interface up down

broadcast address poin to point address netmask address

参 数 含 义

指定的网络接口名,如eth0和eth1 激活指定的网络接口卡 关闭指定的网络接口 设置接口的广播地址 启用点对点方式

设置指定接口设备的IP地址 设置接口的子网掩码

(4)使用实例

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

首先,在本例中使用ifconfig的第一种格式来查看网口配置情况。 [root@sunq workplace]# ifconfig eth0 Link encap:Ethernet HWaddr 00:08:02:E0:C1:8A inet addr:59..205.70 Bcast:59..207.255 Mask:255.255.252.0 inet6 addr: fe80::208:2ff:fee0:c18a/ Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:26931 errors:0 dropped:0 overruns:0 frame:0 TX packets:3209 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6669382 (6.3 MiB) TX bytes:321302 (313.7 KiB) Interrupt:11 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:136 Metric:1 RX packets:2537 errors:0 dropped:0 overruns:0 frame:0 TX packets:2537 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2093403 (1.9 MiB) TX bytes:2093403 (1.9 MiB) 可以看出,使用ifconfig的显示结果中详细列出了所有活跃接口的IP地址、硬件地址、广播地址、子网掩码、回环地址等。 [root@sunq workplace]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:08:02:E0:C1:8A inet addr:59..205.70 Bcast:59..207.255 Mask:255.255.252.0 inet6 addr: fe80::208:2ff:fee0:c18a/ Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:27269 errors:0 dropped:0 overruns:0 frame:0 TX packets:3212 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6698832 (6.3 MiB) TX bytes:322488 (314.9 KiB) Interrupt:11 在此例中,通过指定接口显示出对应接口的详细信息。另外,用户还可以通过指定参数“-a”来查看所有接口(包括非活跃接口)的信息。

接下来的示例指出了如何使用ifconfig的第二种格式来改变指定接口的网络参数配置。

[root@sunq ~]# ifconfig eth0 down [root@sunq ~]# ifconfig

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:136 Metric:1

RX packets:1931 errors:0 dropped:0 overruns:0 frame:0 TX packets:1931 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0

RX bytes:2517080 (2.4 MiB) TX bytes:2517080 (2.4 MiB)

在此例中,通过将指定接口的状态设置为DOWN,暂时暂停该接口的工作。 [root@sunq workplace]# ifconfig eth0 210.25.132.142 netmask 255.255.255.0 [root@sunq workplace]# ifconfig eth0 Link encap:Ethernet HWaddr 00:08:02:E0:C1:8A inet addr:210.25.132.142 Bcast:210.25.132.255 Mask:255.255.255.0 inet6 addr: fe80::208:2ff:fee0:c18a/ Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1722 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:147382 (143.9 KiB) TX bytes:398 (398.0 b) Interrupt:11 从上例可以看出,ifconfig改变了接口eth0的IP地址、子网掩码等,在之后的ifconfig查看中可以看出确实发生了变化。 (5)使用说明

用ifconfig命令配置的网络设备参数不需重启就可生效,但在机器重新启动以后将会失效。

2.ftp

(1)作用

该命令允许用户利用ftp协议上传和下载文件。 (2)格式

ftp [选项] [主机名/IP]。

ftp相关命令包括使用命令和内部命令,其中使用命令的格式如上所列,主要用于登录到ftp服务器的过程中使用的。内部命令是指成功登录后进行的一系列操作,下面会详细列出。若用户缺省“主机名/IP”,则可在转入到ftp内部命令后继续选择登录。

(3)常见参数

ftp常见选项参数如表2.30所示。

表2.30

ftp命令选项常见参数列表

… Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令 选 项

-v -n -d -g

参 数 含 义

显示远程服务器的所有响应信息 ftp的自动登录 使用调试方式

ftp常见内部命令如表2.31所示。

表2.31

命 令 取消全局文件名

ftp命令常见内部命令

命 令 含 义 提供登录远程系统成功后访问系统资源所需的补充口令 使用ascii类型传输方式,为缺省传输模式 使用二进制文件传输方式(嵌入式开发中常见方式) 退出ftp会话过程 进入远程主机目录 进入远程主机目录的父目录 将远程主机文件file-name的存取方式设置为mode 中断与远程服务器的ftp会话(与open对应) 删除远程主机文件 设置调试方式, 显示发送至远程主机的每条命令 显示远程主机目录,并将结果存入本地文件local-file 同Close 将远程主机的文件remote-file传至本地硬盘的local-file 将本地工作目录切换至dir 删除远程主机文件 传输多个远程文件 续表

account[password] Ascii bin/ type binary Bye cd remote-dir Cdup chmod mode file-name Close delete remote-file debug[debug-value] dir/ls[remote-dir][local-file] Disconnection get remote-file[local-file] lcd[dir] mdelete[remote-file] mget remote-files 命 令

mkdir dir-name mput local-file open host[port] Passive

put local-file[remote-file] reget remote-file[local-file] size file-name System

在远程主机中建一目录 将多个文件传输至远程主机

命 令 含 义

建立指定ftp服务器连接,可指定连接端口

进入被动传输方式(在这种模式下,数据连接是由客户程序发起的) 将本地文件local-file传送至远程主机

类似于get,但若local-file存在,则从上次传输中断处续传 显示远程主机文件大小 显示远程主机的操作系统类型

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

(4)使用实例

首先,在本例中使用ftp命令访问“ftp://study.byr.edu.cn”站点。

[root@sunq ~]# ftp study.byr.edu.cn Connected to study.byr.edu.cn. 220 Microsoft FTP Service

500 'AUTH GSSAPI': command not understood 500 'AUTH KERBEROS_V4': command not understood KERBEROS_V4 rejected as an authentication type Name (study.byr.edu.cn:root): anonymous

331 Anonymous access allowed, send identity (e-mail name) as password. Password:

230 Anonymous user logged in. Remote system type is Windows_NT.

注意 由于该站点可以匿名访问,因此,在用户名处输入anonymous,在Password处输入任意一个e-mail地址即可登录成功。 ftp> dir 227 Entering Passive Mode (211,68,71,83,11,94). 125 Data connection already open; Transfer starting. 11-20-05 05:00PM

Audio 12-04-05 09:41PM BUPT_NET_Material 01-07-06 01:38PM Document 11-22-05 03:47PM Incoming 01-04-06 11:09AM Material 226 Transfer complete. 以上使用ftp内部命令dir列出了在改目录下文件及目录的信息。

ftp> cd /Document/Wrox/Wrox.Beginning.SQL.Feb.2005.eBook-DDU 250 CWD command successful. ftp> pwd

257 \"/Document/Wrox/Wrox.Beginning.SQL.Feb.2005.eBook-DDU\" is current directory.

以上实例通过cd命令进入相应的目录,可通过pwd命令进行验证。

ftp> lcd /root/workplace

Local directory now /root/workplace ftp> get d-wbsq01.zip

local: d-wbsq01.zip remote: d-wbsq01.zip 200 PORT command successful.

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令 150 Opening ASCII mode data connection for d-wbsq01.zip(1466768 bytes). WARNING! 5350 bare linefeeds received in ASCII mode File may not have transferred correctly. 226 Transfer complete.

1466768 bytes received in 1.7 seconds (8.6e+02 Kbytes/s)

接下来通过lcd命令首先改变用户的本地工作目录,也就是希望下载或上传的工作目录,就着通过get命令进行下载文件。由于ftp默认使用ASCII模式,因此,若希望改为其他模式如“bin”,直接输入bin即可,如下所示:

ftp> bin

200 Type set to I. ftp> bye 221

最后用bye命令退出ftp程序。 (5)使用说明

• 若是需要匿名登录,则在“Name (**.**.**.**):”处键入anonymous,在“Password:”处键入自己的E-mail地址即可。

• 若要传送二进制文件,务必要把模式改为bin。

2.2 Linux启动过程详解

在了解了Linux的常见命令之后,下面来详细了解一下Linux的启动过程。Linux的启动过程包含了Linux工作原理的精髓,而且在嵌入式的开发过程也非常需要这方面知识的积累。为了降低阅读的难度,在这部分作者尽量避免直接对大段的汇编代码进行分析,而主要阐述其原理及INIT进程。希望读者能认真耐心阅读,相信在真正掌握这一节的内容之后对Linux的认识会有一个质的飞跃。

本书假定读者对微机原理、操作系统、汇编和C语言已有了一定的基础,因此对以上知识的基础概念不再做详细的说明。

2.2.1 概述

用户开机启动Linux过程总体上是这样的:

首先当用户打开PC的电源时,CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。这时BIOS进行开机自检,并按BIOS中设置的启动设备(通常是硬盘)进行启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux(也就是启动设备的第一个扇区),这时,Linux才获得了启动权。

接下来的第二阶段,Linux首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

第三阶段执行init程序(也就是系统初始化工作),init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务的任务后,返回init。

之后的第四阶段,init启动mingetty,打开终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

Linux启动总体流程图如图2.2所示,其中的4个阶段分别由同步棒隔开。由于第一阶段不涉及Linux自身的启动过程,因此,下面分别对第二和第三阶段进行详细讲解。

图2.2 Linux启动总体流程图

2.2.2 内核引导阶段

在grub或lilo等引导程序成功完成引导Linux系统的任务后,Linux就从它们手中接管了CPU的控制权。用户可以从www.kernel.org上下载最新版本的源码进行阅读,其目录为:linux-2.6.*.*\\arch\\i386\\boot。在这过程中主要用到该目录下的这几个文件:bootsect.S、setup.S以及compressed目录下的head.S等。

首先要介绍一下,Linux的内核通常是压缩过后的,包括如上述提到的那几个重要的汇编程序,它们都是在压缩内核vmlinuz中的。因为Linux中提供的内核包含了众多驱动和功能,因而比较大,所以在采用压缩内核可以节省大量的空间。

(1)bootsect阶段

当grub读入vmlinuz后,会根据bootsect(正好512bytes)把它自身和setup程序段读到不大于0x90000开始的的内存里(注意:在以往的引导协议里是放在0x90000,但现在有所变化),然后grub会跳过bootsect那512bytes的程序段,直接运行setup里的第一跳指令。就是说bzImage里bootsect的程序没有再被执行了,而bootsect.S在完成了指令搬移以后就退出了。之后执行权就转到了setup.S的程序中。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

(2)setup阶段

setup.S的主要功能就是利用ROM BIOS中断读取机器系统数据,并将系统参数(包括内存、磁盘等)保存到0x90000~0x901FF开始的内存中位置。

此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。 最后,它还会设置CPU的控制寄存器CR0(也称机器状态字),从而进入32位保护模式运行,并跳转到绝对地址为0x100000(虚拟地址0xC0000000+0x100000)处。当CPU跳到0x100000时,将执行“arch/i386/kernel/head.S”中的startup_32。

(3)head.S阶段

当运行到head.S时,系统已经运行在保护模式,而head.S完成的一个重要任务就是将内核解压。就如本节前面提到的,内核是通过压缩的方式放在内存中的,head.S通过调用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。

接下来head.S程序完成完成寄存器、分页表的初始化工作,但要注意的是,这个head.S程序与完成解压缩工作的head.S程序是不同的,它在源代码中的位置是arch/i386/kernel/head.S。

在完成了初始化之后,head.S就跳转到start_kernel()函数中去了。 (4)main.c阶段

start_kernel()是“init/main.c”中的定义的函数,start kernel()调用了一系列初始化函数,进行内核的初始化工作。要注意的是,在初始化之前系统中断仍然是被屏蔽的,另外内核也处于被锁定状态,以保证只有一个CPU用于Linux系统的启动。

在start_kernel()的最后,调用了init()函数,也就是下面要讲述的INIT阶段。

2.2.3 init阶段

在加载了内核之后,由内核执行引导的第一个进程就是INIT进程,该进程号始终是“1”。INIT进程根据其配置文件“/etc/inittab”主要完成系统的一系列初始化的任务。由于该配置文件是INIT进程执行的惟一依据,因此先对它的格式进行统一讲解。

inittab文件中除了注释行外,每一行都有如下格式:

(1)id

id是配置记录标识符,由1~4个字符组成,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。

(2)runlevels

runlevels是运行级别记录符,一般使用0~6以及S和s。其中,0、1、6运行级别为系统保留:0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现。7~9级别也是可以使用的,传统的UNIX系统没有定义这几个级别。

runlevel可以是并列的多个值,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。

(3)action

action字段用于描述系统执行的特定操作,它的常见设置有:initdefault、sysinit、boot、

id:runlevels:action:process

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

bootwait、respawn等。

initdefault用于标识系统缺省的启动级别。当init由内核激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入runlevel。

sysinit、boot、bootwait等action将在系统启动时无条件运行,忽略其中的runlevel。 respawn字段表示该类进程在结束后会重新启动运行。 (4)process

process字段设置启动进程所执行的命令。

以下结合笔者系统中的inittab配置文件详细讲解该配置文件完成的功能:

1.确定用户登录模式

在“/etc/inittab”中列出了如下所示的登录模式,主要有单人维护模式、多用户无网络模式、文字界面多用户模式、X-Windows多用户模式等。其中的单人维护模式(run level为1)是类似于Windows中的“安全模式”,在这种情况下,系统不加载复杂的模式从而使系统能够正常启动。在这些模式中最为常见的是3或5,其中本系统中默认的为5,也就是X-Windows多用户模式。 # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: 2.执行内容/etc/rc.d/rc.sysinit

在确定了登录模式之后,就要开始将Linux的主机信息读入Linux系统,其内容就是文件“/etc/rc.d/rc.sysinit”中的。查看此文件可以看出,在这里确定了默认路径、主机名称、“/etc/sysconfig/network”中所记录的网络信息等。

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

3.启动内核的外挂模块及各运行级的脚本

在此,主要是选择模块的型态以进行驱动程序的加载。接下来会根据不同的运行级(run level)加载不同的模块,启动系统服务。

l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 \"Power Failure; System Shutting Down\" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c \"Power Restored; Shutdown Cancelled\" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon 2.3 Linux系统服务

INIT进程的一个重要作用就是启动Linux系统服务(也就是运行在后台的守护进程)。Linux的系统服务包括两种,第一种是运行的系统服务,它们常驻内存中,自开机后一直启动着(如httpd),具有很快的响应速度;第二种是由xinet设定的服务。xinet能够同时监听多个指定的端口,在接受用户请求时,它能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。因此,可以把xinetd看作一个启动服务的管理服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。以下来分别介绍这两种系统服务。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

2.3.1 运行的服务

运行的系统服务的启动脚本都放在目录“/etc/rc.d/init.d/”中。如笔者系统中的系统服务的启动脚本有(关于Linux中服务的具体含义见附录):

[root@sunq init.d]# ls /etc/rc.d/init.d

acpid dc_client iptables named pand rpcsvcgssd tux

anacron dc_server irda netdump pcmcia saslauthd vncserver apmd diskdump irqbalance netfs portmap sendmail vsftpd arptables_jf dovecot isdn netplugd psacct single watchquagga atd dund killall network rawdevices smartd winbind autofs firstboot kudzu NetworkManager readahead smb xfs

为了指定特定运行级别服务的开启或关闭,系统的各个不同运行级别都有不同的脚本文件,其目录为“/etc/rc.d/rcN.d”,其中的N分别对应不用的运行级别。读者可以进入到各个不同的运行级别目录里查看相应服务的开启或关闭状态,如进入“/rc3.d”目录中的文件如下所示: [root@sunq rc3.d]# ls /etc/rc.d/rc3.d K02NetworkManager K35winbind Knetplugd S10networ S28autofs S95anacron K05saslauthd K36lisa K90bluetooth S12syslog S40smartd S95atd K10dc_server K45named K94diskdump S13irqbalance S44acpid S97messagebus K10psacct K50netdump K99microcode_ctl S13portmap S55cups S97rhnsd …

可以看到,每个对应的服务都以“K”或“S”开头,其中的K代表关闭(kill),其中的S代表启动(start),用户可以使用命令“+start|stop|status|restart”来对相应的服务进行操作。

在执行完相应的rcN.d目录下的脚本文件后,INIT最后会执行rc.local来启动本地服务,因此,用户若想把某些非系统服务设置为自启动,可以编辑rc.local脚本文件,加上相应的执行语句即可。

另外,读者还可以使用命令“service+系统服务+操作”来方便地实现相应服务的操作,如下所示:

[root@sunq xinetd.d]# service xinetd restart

停止 xinetd: [ 确定 ] 开启 xinetd: [ 确定 ]

… 2.3.2 xinetd设定的服务

xinetd管理系统中不经常使用的服务,这些服务程序只有在有请求时才由xinetd服务负责启动,一旦运行完毕服务自动结束。xinetd的配置文件为“/etc/xinetd.conf”,它对xinet的

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

默认参数进行了配置:

#

# Simple configuration file for xinetd #

# Some defaults, and include /etc/xinetd.d/ defaults {

instances = 60

log_type = SYSLOG authpriv log_on_success log_on_failure cps }

includedir /etc/xinetd.d

= HOST PID = HOST

= 25 30

从该配置文件的最后一行可以看出,xinetd启动“/etc/xinetd.d”为其配置文件目录。再在对应的配置文件目录中可以看到每一个服务的基本配置,如tftp服务的配置脚本文件为: service tftp { socket_type = dgram//数据包格式 protocol wait user server = udp//使用UDP传输 = yes = root = /usr/sbin/in.tftpd server_args = -s /tftpboot disable per_source cps } flags = yes//不启动 = 11 = 100 2 = IPv4 2.3.3 设定服务命令常用方法

设定系统服务除了在本节中提到的使用service之外,chkconfig也是一个很好的工具,它能够为不同的系统级别设置不同的服务。

常用格式

(1)chkconfig –list(注意在list前有两个小连线):查看系统服务设定。 示例:

[root@sunq xinetd.d]# chkconfig --list

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

sendmail 0:关闭 1:关闭 2:打开 3:打开 4:打开 5:打开 6:关闭 snmptrapd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 gpm 0:关闭 1:关闭 2:打开 3:打开 4:打开 5:打开 6:关闭 syslog 0:关闭 1:关闭 2:打开 3:打开 4:打开 5:打开 6:关闭 …

(2)chkconfig--level N [服务名称] 指定状态:对指定级别指定系统服务。

[root@sunq xinetd.d]# chkconfig --list|grep ntpd

ntpd 0:关闭 1:关闭 2关闭 3:关闭 4:关闭 5:关闭 6:关闭 [root@sunq ~]# chkconfig --level 3 ntpd on [root@sunq ~]# chkconfig --list|grep ntpd

ntpd 0:关闭 1:关闭 2:关闭 3:打开 4:关闭 5:关闭 6:关闭

另外,在2.1.1节系统命令列表中指出的setup程序中也就可以设定,而且是图形界面,操作较为方便,读者可以自行尝试。

2.4 实验内容

2.4.1 在Linux下解压常见软件

1.实验目的

通过在Linux下安装一个完整的软件(嵌入式Linux的必备工具——交叉编译工具),掌握Linux常见命令,学会设置环境变量,并同时搭建起了嵌入式Linux的交叉编译环境(关于交叉编译的具体概念在本书后面会详细讲解),为今后的实验打下良好的基础。

2.实验内容

在Linux中解压cross-3.3.2.tar.bz2,并添加到系统环境变量中去。 3.实验步骤

(1)在光盘中的cross-3.3.2.tar.bz2拷贝到Windows下的任意盘中。

(2)重启机器转到Linux下,并用普通用户身份登录。 (3)打开“终端”,并切换到超级用户模式下。 命令为:su - root

(4)查看cross-3.3.2.tar.bz2所在的Windows下对应分区的格式,并记下其文件设备名称,如“/dev/hda1”等。

命令为:fdisk -l

(5)使用mkdir命令在“/mnt”新建子目录作为挂载点。 命令为:mkdir /mnt/windows (6)挂载Windows相应分区。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

若是vfat格式,则命令为:mount –t vfat /dev/had* /mnt/windows 注意

由于ntfs格式在Linux下是不安全的,只能读,不能写,因此最好把文件放到fat32格式的文件系统中。

(7)进入挂载目录下,查看是否确实挂载上。 命令为:cd /mnt/windows;ls

(8)在/usr/local下建一名为arm的目录。 命令为:mkdir /usr/local/arm

(9)将cross-3.3.2.tar.bz2复制到刚刚新建的目录中。 命令为:cp /mnt/windows/cross-3.3.2.tar.bz2 /usr/local/arm 注意

若cross-3.3.2.tar.bz2在当前目录中,则可将命令简写为:cp ./cross-3.3.2.tar.bz2 /usr/local/arm

(10)将当前工作目录转到“/usr/local/arm”下。 命令为:cd /usr/local/arm 想一想

为什么要将此目录创建在“/usr/local”下?

(11)解压缩该软件包。

命令为:tar –jxvf cross-3.3.2.tar.bz2

(12)将此目录下的/bin目录添加到环境变量中去。 命令为:export PATH=/usr/local/arm/3.3.2/bin :$PATH 注意

用此方法添加的环境变量在掉电后会丢失,因此,可以使用在“/etc/bashrc”的最后一行添加以上命令。

(13)查看该路径是否已添加到环境变量中。 命令为:echo $PATH 4.实验结果

成功搭建了嵌入式Linux的交叉编译环境,熟悉Linux下常用命令,如“su”、“mkdir”、“mount”、“cp”、“tar”等,并学会添加环境变量,同时也对Linux的目录结构有了更深一步的理解。

2.4.2 定制Linux系统服务

1.实验目的

通过定制Linux系统服务,进一步理解Linux的守护进程,能够更加熟练运用Linux操作基本命令,同时也加深对INIT进程的了解和掌握。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

2.实验内容

查看Linux系统服务,并定制其系统服务。 3.实验步骤

(1)查看系统的默认运行级别。

命令为:cat /etc/inittab(设其结果为N)

(2)进入到相应级别的服务脚本目录,查看哪些服务是系统启动的运行的服务,并做下记录。

命令为:cd /etc/rc.d/rcN.d

(3)利用命令查看系统开机自启动服务,并与上次查看结果进行比较,找出其中的区别,并思考其中的原因。

命令为:chkconfig –list

(4)记录chkconfig –list命令中由xinet管理的服务,并将其中启动的服务做下记录。 (5)进入xinet配置管理的相应目录,查看是否于chkconfig –list所得结果相吻合并查看相应脚本文件。

命令为:cd /etc/xinetd.d (6)将sshd服务停止。 命令为:service sshd stop

(7)将sshd服务设置为开机不启动。 命令为:chkconfig –level N sshd stop (8)查看该设置是否生效。 命令为:chkconfig –list

(9)查看系统中所有服务及其端口号列表。 命令为:cat /etc/services

(10)将sshd服务端口改为4022。

命令为:vi /etc/services;转到插入模式并修改其端口号 (11)重启sshd服务,验证所改的端口号是否生效。 命令为:service sshd start

(12)重启Linux系统,验证所改的服务开机启动是否生效。

4.实验结果分析

首先,该实验通过验证Linux系统服务的启动状态,进一步明确了Linux系统服务启动的流程,更深一步地理解了Linux系统操作。

另外,实验还通过定制Linux系统服务sshd的开机启动状态和端口号,熟悉了Linux的系统定制步骤。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

www.linuxidc.com

《嵌入式Linux应用程序开发详解》——第2章、Linux基础命令

本 章 小 结

本章首先讲解了Linux操作的基本命令,这些命令是使用Linux的基础。Linux基础命令包括用户系统相关命令、文件目录相关命令、压缩打包相关命令、比较合并相关命令以及网络相关命令。在本书中,笔者着重介绍了每一类命令中有代表性的重要命令,并给出了具体实例加以讲解,对其他命令列出了其使用方法。希望读者能举一反三,灵活应用。

接下来,本章讲解了Linux启动过程,这部分的内容比较难,但对深入理解Linux是非常有帮助的,希望读者能反复阅读。

最后,本章还讲解了Linux系统服务,包括运行的服务和xinetd设定的服务,并且讲解了Linux中设定服务的常用方法。

本章安排了两个实验,实验一通过一个完整的操作使读者能够熟练使用Linux,实验二讲解了如何定制Linux系统服务,希望读者能够认真动手实践。

思考与练习

1.更改目录的名称,如把/home/sunq变为/home/kang。 2.若有一文件属性为-rwxr-xrw-,指出其代表什么意思? 3.如何将文件属性变为-rwxrw-r--?

4.下载最新Linux源码,并解开至/usr/src目录下。 5.修改TELNET、FTP服务的端口号。

Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务