Ubuntu系统入门
在上一章我们已经安装好虚拟机,并且在虚拟机中安装好了Ubuntu操作系统了,本章我们就来学习Ubuntu系统的基本使用,通过本章的学习为我们以后的开发做准备。Ubuntu系统是和Windows一样的大型桌面操作系统,因此功能非常强大,不是一章就能介绍完的,因此本章叫做《Ubuntu系统入门》。本章的主要目的是教会读者掌握后续嵌入式开发所需的Ubuntu基本技能,比如系统的基本设置、常用的shell命令、vim编辑器的基本操作等等,如果想详细的学习Ubuntu操作系统请参考其它更为详细的书籍,本章参考了《Ubuntu Linux从入门到精通》,这本书不厚,很适合用来作Ubuntu入门。
Ubuntu系统初体验
hello Ubuntu
上一章我们已经安装好了Ubuntu操作系统,我们再来回顾一下如何开机:
1、打开VMware虚拟机软件,打开以后如图2.1.1所示:
图2.1.1 WMware主界面
2、打开VMware上的开机按钮,打开方式如图2.1.2所示:
图2.1.2 VMware开机按钮
3、点击上图中两个开机按钮中的任意一个就会打开Ubuntu操作系统,首先进入图2.1.3所示的登陆界面,点击使用的用户名,输入密码即可进入系统。
图2.1.3 Ubuntu登陆界面
在登陆界面输入密码,进入系统主界面,如图2.1.4所示:
图2.1.4 Ubuntu主界面
进入主界面以后大家就可以看到和Windows基本一样,左侧有一列APP,第一个是火狐浏览器,可以用来上网,比如我们登陆百度网站,如图2.1.5所示:
图2.1.5浏览器
第二个是邮箱。第三个是文件浏览器,打开以后可以浏览Ubuut系统中的文件,打开以后如图2.1.6所示:
图2.1.6文件浏览
这里还有其它一些APP,大家可以自行打开看一下这些APP都是干啥的,这里就不一一详细的介绍了。
系统设置
我们以设置取消锁屏为例来讲解如何使用设置。打开系统设置界面,打开方式为点击桌面最右上角的图标,然后在弹出的界面中选择工具按钮,如图2.1.7所示:
图2.1.7打开系统设置
打开以后的系统设置界面如下图所示:
图2.1.8系统设置界面
系统设置界面可以完成系统的大部分设置。我们找到“电源”设置并点击,点击以后如下图所示:
图2.1.9电源设置界面
从上图中可以看到,空白屏幕的时间是5分钟,也就是5分钟不动Ubuntu系统,就会进入锁屏界面,而每次从锁屏进入桌面都要输入密码,比较麻烦,所以笔者将其设置为“从不”,如下图所示:
图2.1.10调整空白屏幕时间
也就是无论多长时间不动Ubuntu系统,都不会进入锁屏界面。通过设置取消锁屏这个例子,我们就知道了如何设置Ubuntu系统,如果有需要设置其它东西的话都可以到系统设置里面去进行,这里就不一一详细的介绍了。
系统重启与关机
当我们不使用Ubuntu系统以后就需要将其关机,就和我们使用Windows系统一样,千万不要通过直接退出VMware软件来关机!!关机很简单,在主界面,点击右上角的图标,如下图所示:
图2.1.11关机
弹出下图所示界面:
图2.1.12关机确认界面
注意,该界面显示系统将在60秒后自动关机,也就是此时什么都不做,60秒后系统将会自动关机。
在图2.1.12中可以看到有三个选项:取消、重启和关机,这个和Windows下是一样的,你如果想要取消就点击“取消”按钮,想要关机就点击“关机”按钮。以关机为例,点击“关机”以后会直接关闭Ubuntu系统。
中文输入测试
我们是中国人,平时用的最多的肯定是中文,那么Ubuntu下中文输入是否和Windows一样呢?如何在Ubuntu下使用中文输入法?
我们在安装Ubuntu系统的时候就已经使用过中文输入法了,就是选择我们所在地的时候。本节我们就以创建一个文本为例,介绍如何在Ubuntu中使用中文输入法。
在Ubuntu虚拟机中,点击左下角的“显示应用程序”图标,如下图所示:
图2.1.13点击左下角的“显示应用程序”
进入活动界面,输入“text”,找到文本编辑器工具,如下图所示:
图2.1.14文本编辑器工具
单击打开文本编辑器工具,打开以后如下图所示:
图2.1.15打开文档
打开文本编辑器工具后,我们可以尝试在里面输入一些英文和数字,输入英文和数字是没有任何问题的,输入中文的话需要切换到Ubuntu自带的拼音输入法,有两种方式切换,一种是使用快捷键:Windows+空格键,一种是使用鼠标点击设置输入法,如下图所示:
图2.1.16切换拼音输入法
这两种方法都可以切换输入法,切换到拼音输入法以后就可以输入中文了,如下图所示:
图2.1.17输入中文文本
大家会发现Ubuntu下的拼音输入法使用起来跟Windows下的输入法相差不大。
通过上面几个小节中对Ubuntu的基本操作来看,基本和Windows下的操作差不多,我们真正要使用Ubuntu的不是通过图形界面操作,而是通过命令行操作的。这也是我们接下来着重要讲的:Ubuntu(Linux)终端操作,会涉及到很多命令,但是常用的命令就那几十个,不需要刻意的去背,使用习惯了就自然记住了。不要看到要记命令就觉得可怕。根据2080原则,80%情况下只使用那20%的命令,实际情况会更少,常用的可能就那5%~10%的命令。
Ubuntu终端操作
本节就是我们学习Ubuntu操作系统的重点了,终端操作,也就是俗称的“敲命令”,不管是哪个版本的Linux发行版系统,它都会提供终端操作,Linux下的终端操作类似与Windows下的DOS操作。要使用终端首先肯定是要打开终端,在主界面上点击鼠标右键,然后选择打开终端,如图2.2.1所示:
图2.2.1 打开终端
打开终端以后如图2.2.2所示:
图2.2.2 终端界面
我们就是在图2.2.2所示界面上输入命令的,终端默认会有类似下面一行所示的一串提示符:
zuozhongkai@zuozhongkai-virtual-machine: ~$
上述字符串中,@前面的“zuozhongkai”是当前的用户名字,@后面的zuozhongkai-virtual-machine是我的机器名字。最后面的符号“$”表示当前用户是普通用户,我们可以在提示符后面输入命令,比如输入命令“ls”,命令“ls”是打印出当前所在目录中所有文件和文件夹,如图2.2.3所示:
图2.2.3 ls命令
在图2.2.3中我们输入了“ls”这个命令,然后打印出了当前目录下的所有文件和文件夹,后面我们学习命令的时候就是在终端中输入相应命令的。
Shell操作
Shell简介
学习linux的时候会频繁的看到Shell这个词语?那么什么是Shell呢?网上搜索一下,各种专业的解释一堆,但是对于第一次接触Linux的人来说这些专业的词语只会让人更晕。简单的说Shell就是敲命令。国内把Linux下通过命令行输入命令叫做“敲命令”,国外人玩的比较洋气,人家叫做“Shell”。因此以后看到Shell这个词语第一反应就是在终端中敲命令,将多个Shell命令按照一定的格式放到一个文本中,那么这个文本就叫做Shell脚本。
严格意义上来讲,Shell是一个应用程序,它负责接收用户输入的命令,然后根据命令做出相应的动作,Shell负责将应用层或者用户输入的命令传递给系统内核,由操作系统内核来完成相应的工作,然后将结果反馈给应用层或者用户。
Shell基本操作
前面我们说Shell就是“敲命令”,那么既然是命令,那肯定是有格式的,Shell命令的格式如下:
command -options [argument]
command: Shell命令名称。
options:选项,同一种命令可能有不同的选项,不同的选项其实现的功能不同。
argument:Shell命令是可以带参数的,也可以不带参数运行。
同样以命令“ls”为例,下面“ls”命令的三种不同格式其结果也不同:
wwsls
ls –l
ls /usr
这三种命令的运行结果如图2.3.1所示:
图2.3.1命令
在图2.3.1中“ls”命令用来打印出当前目录下的所有文件和文件夹,而“ls -l”同样是打印出当前目录下的所有文件和文件夹,但是此命令会列出所有文件和文件夹的详细信息,比如文件大小、拥有者、创建日期等等。最有一个“ls /usr”是用来打印出目录“/usr”下的所有文件和文件夹。
Shell命令是支持自动补全功能的,因为Shell命令非常多,如果不作自动补全的话就需要用户去记忆这些命令的全部字母。使用自动补全功能以后我们只需要输入命令的前面一部分字母,然后按下TAB键,如果只有一个命令匹配的话就会自动补全这个命令剩下的字母。如果有多个命令匹配的话系统就会发出报警声音,此时在按下一次TAB键就会列出所有匹配的命令,比如我们输入字母“if”,然后按下TAB键,结果如图2.3.2所示:
图2.3.2“if”开始的命令
从上图可以看出,以“if”开头的命令有5个,我们以“ifconfig”为例,此命令是用来查看网卡信息的,我们重新输入“ifc”然后在按一下TAB键,就会自动补全出“ifconfig”命令,因为以“ifc”开头的命令只有一个,结果如下图所示:
图2.3.3命令结果
常用Shell命令
我们做嵌入式开发用的最多就是Shell命令,Shell命令是所有的Linux系统发行版所通用的,并不是说我在Ubuntu下学会了Shell命令,换另外一个Linux发行版操作系统以后就没用了(不同的发行版Linux系统可能会自定义一些命令)。本节我们先来介绍一些Shell下常用的命令:
1、目录信息查看命令ls
文件浏览是最基本的操作了,Shell下文件浏览命令为ls,格式如下:
ls [选项] [路径]
ls命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录,它的主要参数有:
-a 显示所有的文件以及子目录,包括以“.”开头的隐藏文件。
-l 显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。
-t 将文件按照创建时间排序列出。
-A 和-a一样,但是不列出“.”(当前目录)和“..”(父目录)。
-R 递归列出所有文件,包括子目录中的文件。
Shell命令里面的参数是可以组合在一起用的,比如组合“-al”就是显示所有文件的详细信息,包括以“.”开头的隐藏文件,ls命令使用如图2.3.4所示:
图2.3.4命令演示
注意上图中tmp文件夹是我为了演示方便,自己创建的,里面的文件a,b和c也是我创建的,关于文件夹和文件的创建后面会详细的讲解。
2、目录切换命令cd
要想在Shell中切换到其它的目录,使用的命令是cd,命令格式如下:
cd [路径]
路径就是我们要进入的目录路径,比如下面所示操作:
cd / //进入到根目录“/”下,Linux系统的根目录为“/”,
cd /usr //进入到目录“/usr”里面。
cd .. //进入到上一级目录。
cd ~ //切换到当前用户主目录
比如我们要进入到目录“/usr”下去,并且查看“/usr”下有什么文件,操作如下图所示:
图2.3.5命令演示
在上图中,我们先使用命令“cd /usr”进入到“/usr”目录下,然后使用“ls”命令显示“/usr”目录下的所有文件。仔细观察上图可以看到,当我们切换到其它目录以后在符号“$”前面就会以蓝色的字体显示出当前目录名字,如下图所示:
图2.3.6目录路径显示
3、当前路径显示命令pwd
pwd命令用来显示当前工作目录的绝对路径,不需要任何的参数,使用如下图所示:
图2.3.7命令
4、系统信息查看命令uname
要查看当前系统信息,可以使用命令uname,命令格式如下:
uname [选项]
可选的选项参数如下:
-r 列出当前系统的具体内核版本号。
-s 列出系统内核名称。
-o 列出系统信息。
使用如下图所示:
图2.3.8命令操作
5、清屏命令clear
clear命令用于清除终端上的所有内容,只留下一行提示符。
6、切换用户执行身份命令sudo
Ubuntu(Linux)是一个允许多用户的操作系统,其中权限最大的就是超级用户root,有时候我们执行一些操作的时候是需要用root用户身份才能执行,比如安装软件。通过sudo命令可以使我们暂时将身份切换到root用户。当使用sudo命令的时候是需要输入密码的,这里要注意输入密码的时候是没有任何提示的!命令格式如下:
sudo [选项] [命令]
选项主要参数如下:
-h 显示帮助信息。
-l 列出当前用户可执行与不可执行的命令
-p 改变询问密码的提示符。
假如我们现在要创建一个新的用户test,创建新用户的命令为“adduser”,创建新用户的权限只有root用户才有,我们在装系统的时候创建的那个用户是没有这个权限的,比如我的“zuozhongkai”用户。所以创建新用户的话需要使用“sudo”命令以root用户执行“adduser”这个命令,如下图所示:
图2.3.9命令演示
在图2.3.9中,我们一开始直接使用“adduser test”命令添加用户的时候提示我们“adduser:只有 root 才能将用户或组添加到系统。”所以我们要在前面加上“sudo”命令,表示以root用户执行adduser操作。
7、添加用户命令adduser
在讲解sudo命令的时候我们已经用过命令“adduser”,此命令需要root身份去运行。命令格式如下:
adduser [参数] [用户名]
常用的参数如下:
-system 添加一个系统用户
-home DIR DIR表示用户的主目录路径
-uid ID ID表示用户的uid。
-ingroup GRP 表示用户所属的组名。
adduser的使用我们前面已经演示过了,大家可以试着再添加一个用户。
8、删除用户命令deluser
前面讲了添加用户的命令,那肯定也有删除用户的命令,删除用户使用命令“deluser”,命令参数如下:
deluser [参数] [用户名]
主要参数有:
-system 当用户是一个系统用户的时候才能删除。
-remove-home 删除用户的主目录
-remove-all-files 删除与用户有关的所有文件。
-backup 备份用户信息
同样的,命令“deluser”也要使用“sudo”来以root用户运行,以删除我们前面创建的用户test为例,deluser使用如下图所示:
图2.3.10命令deluser演示
9、切换用户命令su
前面在讲解命令“sudo”的时候说过,“sudo”是以root用户身份执行一个命令,并没有更改当前的用户身份,所有需要root身份执行的命令都必须在前面加上“sudo”。命令“su”可以直接将当前用户切换为root用户,切换到root用户以后就可以尽情地尽情任何操作了!因为你已经获得了系统最高权限,在root用户下,所有的命令都可以无障碍执行,不需要在前面加上“sudo”,“su”命令格式如下:
su [选项] [用户名]
常用选项参数如下:
-c –command 执行指定的命令,执行完毕以后回复原用户身份。
-login 改变用户身份,同时改变工作目录和PATH环境变量。
-m 改变用户身份的时候不改变环境变量
-h 显示帮助信息
以切换到root用户为例,使用如下图所示:
图2.3.11命令演示
在图2.3.11中,先使用命令“sudo su”切换到root用户,su命令不写明用户名的话默认切换到root用户。然后输入密码,密码正确的话就会切换到root用户,可以看到切换到root用户以后提示符的“@”符号前面的用户名变成了“root”,表示当前的用户是root用户。并且以“#”结束。
注意!!由于root用户权限太大,稍微不注意就可能删除掉系统文件,导致系统奔溃,因此强烈建议大家,不要以root用户运行Ubuntu。当要用到root身份执行某些命令的时候使用“sudo”命令即可。
要切换回原来的用户,使用命令“sudo su 用户名”即可,比如我要从root切换回zuozhongkai这个用户,操作如下图所示:
图2.3.12切换回原来用户
10、显示文件内容命令cat
查看文件内容是最常见的操作了,在windows下可以直接使用记事本查看一个文本文件内容,linux下也有类似记事本的软件,叫做gedit,找到一个文本文件,双击打开,默认使用的就是gedit,如下图所示:
图2.3.13打开文档
我们现在讲解的是Shell命令,那么Shell下有没有办法读取文件的内容呢?肯定有的,那就是命令“cat”,命令格式如下:
cat [选项] [文件]
选项主要参数如下:
-n 由1开始对所有输出的行进行编号。
-b 和-n类似,但是不对空白行编号。
-s 当遇到连续两个行以上空白行的话就合并为一个行空白行。
比如我们以查看文件“/etc/environment”的内容为例,结果如下图所示:
图2.3.14命令cat演示
11、显示和配置网络属性命令ifconfig
ifconfig是一个跟网络属性配置和显示密切相关的命令,通过此命令我们可以查看当前网络属性,也可以通过此命令配置网络属性,比如设置网络IP地址等等,此命令格式如下:
ifconfig interface options | address
主要参数如下:
interface 网络接口名称,比如eth0等。
up 开启网络设备。
down 关闭网络设备。
add IP地址,设置网络IP地址。
netmask add 子网掩码。
命令ifconfig的使用如下图所示:
图2.3.15命令演示
在图2.3.15中有两个网卡:ens33和lo,ens33是我的电脑实际使用的网卡,lo是回测网卡。可以看出网卡ens33的IP地址为192.168.31.235,我们使用命令“ifconfig”将网卡ens33的IP地址改为192.168.31.20,操作如下图所示:
图2.3.16修改网卡IP地址
从上图可以看出,我们在使用命令“ifconfig”修改网卡ens33的IP地址的时候使用了“sudo”,说明在Ubuntu下修改网卡IP地址是需要root用户权限的。当修改完以后使用命令“ifconfig ens33”再次查看网卡ens33的命令,发现网卡ens33的IP地址变成了192.168.31.20。
12、系统帮助命令man
Ubuntu系统中有很多命令,这些命令都有不同的格式,不同的格式对应不同的功能,要完全记住这些命令和格式几乎是不可能的,必须有一个帮助手册,当我们需要了解一个命令的详细信息的时候查阅这个帮助手册就行了。Ubuntu提供了一个命令来帮助用户完成这个功能,那就是“man”命令,通过“man”命令可以查看其它命令的语法格式、主要功能、主要参数说明等, “man”命令格式如下:
man [命令名]
比如我们要查看命令“ifconfig”的说明,输入“man ifconfig”即可,如下图所示:
图2.3.17命令演示
在终端中输入上图所示的命令,然后点击回车键就会打开“ifconfig”这个命令的详细说明,如下图所示:
图2.3.18命令“ifconfig”详细介绍信息
上图就是命令“ifconfig”的详细介绍信息,按“q”键退出到终端。
13、 系统重启命令reboot
通过点击Ubuntu主界面右上角的齿轮按钮来选择关机或者重启系统,同样的我们也可以使用Shell命令“reboot”来重启系统,直接输入命令“reboot”然后点击回车键接口,如下图所示:
图2.3.19命令演示
14、系统关闭命令poweroff
使用命令“reboot”可以重启系统,使用命令“poweroff”就可以关闭系统,在终端中输入命令“poweroff”然后按下回车键即可关闭Ubuntu系统,如下图所示:
图2.3.20命令演示
15、软件安装命令install
截至目前,我们都没有讲过Ubuntu下如何安装软件,因为Ubuntu安装软件不像Windows下那样,直接双击.exe文件就开始安装了。Ubuntu下很多软件是需要先自行下载源码,下载源码以后自行编译,编译完成以后使用命令“intsall”来安装。当然Ubuntu下也有其它的软件安装方法,但是用的最多的就是自行编译源码然后安装,尤其是嵌入式Linux开发。命令“install”格式如下:
install [选项]... [-T] 源文件 目标文件
或:install [选项]... 源文件... 目录
或:install [选项]... -t 目录 源文件...
或:install [选项]... -d 目录...
“install”命令是将文件(通常是编译后的文件)复制到目的位置,在前三种形式中,将源文件复制到目标文件或将多个源文件复制到一个已存在的目录中同时设置其所有权和权限模式。在第四种形式会创建指定的目录。命令“install”通常和命令“apt-get”组合在一起使用的,关于“apt-get”命令我们稍后会讲解。
以上就是Shell最基本一些命令,还有一些其它的命令我们在后面在讲解,循序渐进嘛。
APT下载工具
对于长时间使用Windows的我们,下载安装软件非常容易,Windows下有很多的下载软件,Ubuntu同样有不少的下载软件,本节我们讲解Ubuntu下我们用的最多的下载工具:APT下载工具,APT下载工具可以实现软件自动下载、配置、安装二进制或者源码的功能。APT下载工具和我们前面讲解的“install”命令结合在一起构成了Ubuntu下最常用的下载和安装软件方法。它解决了Linux平台下一安装软件的一个缺陷,即软件之间相互依赖。
APT采用的C/S模式,也就是客户端/服务器模式,我们的PC机作为客户端,当需要下载软件的时候就向服务器请求,因此我们需要知道服务器的地址,也叫做安装源或者更新源。
打开“软件和更新”设置,打开方式如下图所示:
图2.4.1.1 打开软件和更新设置
打开以后的界面如下图所示:
图2.4.1.2 软件和更新设置
在上图中的“Ubuntu软件”选项卡下面的“下载自”就是APT工具的安装源,因为我们是在中国,所以需要选择中国的服务器,否则的话可能会导致下载失败!这个也就是网上说的Ubuntu安装成功以后要更新源。
在我们使用APT工具下载安装或者更新
软件的时候,首先会在下载列表中与本机软件对比,看一下需要下载哪些软件,或者升级哪些软件,默认情况下APT会下载最新的软件包,被安装的软件包所依赖的其它软件也会被下载安装。说了这么多,APT下载工具究竟怎么用呢?APT工具常用的命令如下:
1、更新本地数据库
如果想查看本地哪些软件可以更新的话可以使用如下命令:
sudo apt-get update
这个命令会访问源地址,并且获取软件列表并保存在本电脑上,过程如下图所示:
图2.4.1.3更新本地数据库
2、检查依赖关系
有时候本地某些软件可能存在依赖关系,所谓依赖关系就是A软件依赖于B软件。通过如下命令可以查看依赖关系,如果存在依赖关系的话APT会提出解决方案:
sudo apt-get check
上述命令的执行结果如下图所示:
图2.4.1.4检查依赖关系
3、软件安装
这个是重点了,安装软件,使用如下命令:
sudo apt-get install package-name
可以看出上述命令是由“apt-get”和“install”组合在一起的,“package-name”就是要安装的软件名字,“apt-get”负责下载软件,“install”负责安装软件。比如我们要安装软件Ubuntu下的串口工具“minicom”,我们就可以使用如下命令:
sudo apt-get install minicom
执行上述命令以后就会自动下载和安装minicom软件,如下图所示:
图2.4.1.5安装minicom软件
上图就是安装minicom这个软件的过程,在安装的过程中,会有如下所示询问:
您希望继续执行吗?[Y/n]
如果希望继续执行的话就输入y,如果不希望继续执行的话就输入n。安装完成以后我们直接在终端输入如下命令打开minicom这个串口软件:
minicom -s
打开以后的minicom软件如下图所示:
图2.4.1.6 minicom软件
关于minicom的使用大家可以上网搜索一下,这里就不详细讲解了,要退出minicom可以直接按下ESC键。
注:推荐使用apt替代apt-get。
4、软件更新
有时候我们需要更新ruan件,更新ruan件的话使用命令:
sudo apt-get upgrade package-name
其中package-name为要升级的软件名字,比如我们升级刚刚安装的minicom这个软件,如下图所示:
图2.4.1.5 更新minicom软件
从上图可以看出,minicom已经是最新的了,不用更新,不过有其它软件需要更新,因此会自动更新其它的软件。
5、卸载软件
如果要卸载某个软件的话使用如下命令:
sudo apt-get remove package-name
其中package-name是要卸载的软件,比如卸载前面安装的minicom这个软件,操作如下图所示:
图2.4.1.6 卸载软件
从上图中可以看出软件minicom被卸载掉了。关于APT下载工具就讲解到这里,我们用的最多的就是“sudo apt-get install package-name”来下载和安装软件。有关Ubuntu其它的安装软件的方法打开可以自行上网查阅学习,这里就不一一详解了。
Ubuntu下文本编辑
Gedit编辑器
进行文本编辑是最常用的操作,Windows下我们会使用记事本来完成,或者其它一些优秀的文本编辑器,比如notepad++,Ubuut下有一个自带的文本编辑器,那就是Gedit。Gedit是一个窗口式的编辑器,关于Gedit的使用前面我们已经讲解了。本节我们重点讲解的是另外一个编辑器:VI/VIM编辑器。
VI/VIM编辑器
我们如果要在终端模式下进行文本编辑或者修改文件就可以使用VI/VIM编辑器,Ubuntu自带了VI编辑器,但是VI编辑器对于习惯了Windows下进行开发的人来说不方便,比如竟然不能使用键盘上的上下左右键调整光标位置。因此我推荐大家使用VIM编辑器,VIM编辑器是VI编辑器升级版本,VI/VIM编辑器都是一种基于指令式的编辑器,不需要鼠标,也没有菜单,仅仅使用键盘来完成所有的编辑工作。
我们需要先安装VIM编辑器,命令如下:
sudo apt-get install vim
安装完成以后就可以使用VIM编辑器了,VIM编辑器有3中工作模式:输入模式、指令模式和底行模式,通过切换不同的模式可以完成不同的功能,我们就以编辑一个文本文档为例讲解VIM编辑器的使用。打开终端,输入命令:vi test.txt,如下图所示:
图2.5.1新建test.txt文档
在终端中输入上图中所示的命令以后就会创建一个test.txt文档,并且用VIM打开了,如下图所示:
图2.5.2打开的test.txt文档
我们试着在上图中输入数字,发现根本没法输入,这不是因为你的键盘坏了。因为VIM默认是以只读模式打开的文档,因此我们要切换到输入模式,切换到输入模式的命令如下:
i 在当前光标所在字符的前面,转为输入模式。
I 在当前光标所在行的行首转换为输入模式。
a 在当前光标所在字符的后面,转为输入模式。
A 在光标所在行的行尾,转换为输入模式。
o 在当前光标所在行的下方,新建一行,并转为输入模式。
O 在当前光标所在行的上方,新建一行,并转为输入模式。
s 删除光标所在字符。
r 替换光标处字符。
最常用的就是“a”,我们在图2.5.2中按下键盘上的“a”键,这时候终端左下角会提示“插入”字样,表示我们进入到了输入模式,如下图所示:
图2.5.3切换到插入模式
上图表明我们可以正常输入文本了,我们可以输入图2.5.4所示文本:
图2.5.4输入文本
在上图中我们在test.txt中输入了字母、数字和中文,我们输入完成以后需要保存文本啊,Windows下的记事本可以使用快捷键Ctrl+S来保存,VIM是否也可以使用Ctrl+S来保存呢?你会发现当你按下Ctrl+S键以后你的终端不能操作了!!!这是因为在Ubuntu下Ctrl+S快捷键不是用来完成保存的功能的,而是暂停该终端!所以你一旦在使用终端的时候按下Ctrl+S快捷键,那么你的终端肯定不会再有任何反应,如果你按下Ctrl+S关闭了当前终端的话可以按下Ctrl+Q来重新打开终端。
既然Ctrl+S不能保存文本文档,那么有没有其它方法保存文本文档呢?肯定是有的,我们需要从VIM现在的输入模式切换到指令模式,方式就是按下键盘的ESC键,按下ESC键以后终端坐下角的“插入”字样就会消失,此时你就不能在输入任何文本了,如果想再次输入文本的话就按下“a”键重新进入到输入模式。指令模式顾名思义就是输入指令的模式,这些指令是控制文本的指令,我们将这些指令进行分类,如下所示:
1、移动光标指令:
h(或左方向键) 光标左移一个字符。
l(或右方向键) 光标右移一个字符。
j(或下方向键) 光标下移一行。
k(或上方向键) 光标上移一行。
nG 光标移动到第n行首。
n+ 光标下移n行。
n- 光标上移n行。
2、屏幕翻滚指令
Ctrl+f 屏幕向下翻一页,相当于下一页。
Ctrl+b 屏幕向上翻一页,相当于上一页。
3、复制、删除和粘贴指令
cc 删除整行,并且修改整行内容。
dd 删除改行,不提供修改功能。
ndd 删除当前行向下n行。
x 删除光标所在的字符。
X 删除光标前面的一个字符。
nyy 复制当前行及其下面n行。
p 粘贴最近复制的内容。
上面就是VI/VIM的命令模式下最常用的一些命令,还有一些不常用的我没有列出来,感兴趣的可以自行上网查阅。从上面的命令可以看出,并没有保存文本的命令,那是因为保存文档的命令是在底行模式中,我们要先进入到指令模式,进入底行模式的方式是先进入指令模式下,然后在指令模式下输入“:”进入底行模式,如下图所示:
图2.5.5 “:”底行模式
在上图中当进入底行模式以后会在终端的左下角就会出现符号“:”,我们可以在“:”后面输入命令,常用的命令如下:
x 保存当前文档并且退出。
q 退出。
w 保存文档。
q! 退出VI/VIM,不保存文档。
如果我们要退出并保存文本的话需要在“:”底行模式下输入“wq”,如下图所示:
图2.5.6保存并退出VIM
在“:”底行模式下输入“wq”以后按下回车键就保存test.txt并退出VI/VIM编辑器,退出以后我们可以使用命令“cat”来查看刚刚新建的test.txt文档的内容,如下图所示:
图2.5.7查看文档内容
从上图中可以看出,test.txt中的内容就是我们用VIM输入的内容,至此我们就完整的进行了一遍VI/VIM创建文档、编辑文档和保存文档。
在上面讲解进入VIM的底行模式的时候使用了在指令模式下输入“:”的方法,还可以在指令模式下输入“/”进入底行模式,输入“/”以后如下图所示。
图2.5.8“/”底行模式
在“/”底行模式下我们可以在文本中搜索指定的内容,比如搜索test.txt文件中“嵌入式”三个字,使用方法如下图所示:
图2.5.9搜索文本
在“/”后面输入要搜索的内容,然后按下回车键就会在test.txt中找到与字符串“嵌入式”匹配的部分,如下图所示:
图2.5.10查找到指定内容
从上图中可以看出,在test.txt中找到了“嵌入式”这个词,并且标记出来位置。我们以后要在一个文档中搜素是否存在某个字符串的时候就可以使用这种方法。有关VI/VIM编辑器的讲解就到这里,我们完整的练习了一遍如何使用VIM创建文档、编辑文档、保存文档和在文档中搜索字符串。有关更多更详细的VIM编辑器的操作大家自行上网查阅相关文档和博客。
Linux文件系统
操作系统的基本功能之一就是文件管理,而文件的管理是由文件系统来完成的。Linux支持多种文件系统,本节我们就来讲解Linux下的文件系统、文件系统类型、文件系统结构和文件系统相关Shell命令。
Linux文件系统简介以及类型
1、Linux文件系统简介
操作系统就是处理各种数据的,这些数据在硬盘上就是二进制,人类肯定不能直接看懂这些二进制数据,要有一个翻译器,将这些二进制的数据还原为人类能看懂的文件形式,这个工作就是由文件系统来完成的,文件系统的目的就是实现数据的查询和存储,由于使用场合、使用环境的不同,Linux有多种文件系统,不同的文件系统支持不同的体系。文件系统是管理数据的,而可以存储数据的物理设备有硬盘、U盘、SD卡、NAND FLASH、NOR FLASH、网络存储设备等。不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理NAND FLASH的话使用YAFFS文件系统,管理硬盘、SD卡的话就是ext文件系统等等。
我们在使用Windows的时候新买一个硬盘回来一般肯定是将这个硬盘分为好几个盘,比如C盘、D盘等。这个叫磁盘的分割,Linux下也支持磁盘分割,Linux下常用的磁盘分割工具为:fdisk,fdisk这个工具我们后面会详细讲解怎么用,因为我们移植Linux的时候需要将SD卡分为两个分区来存储不同的东西。在Windows下我们创建一个新的盘符以后都要做格式化处理,格式化其实就是给这个盘符创建文件系统的过程,我们在Windows格式化某个盘的时候都会让你选择文件系统,如下图所示:
图2.6.1格式化磁盘
上图就是格式化磁盘的时候选择的文件系统,Windows下一般有FAT、NTFS和exFAT这些文件系统。同样的,在Linux下我们使用fdisk创建好分区以后也是要先在创建好的分区上面创建文件系统,也就是格式化。
在Windows下有磁盘分区的概念,比如C,D,E盘等,在Linux下没有这个概念,因此Linux下你找不到像C、D、E盘这样的东西。前面我们说了Linux下可以给磁盘分割,但是没有C、D、E盘那怎么访问这些分区呢?在Linux下创建一个分区并且格式化好以后我们要将其“挂载”到一个目录下才能访问这个分区。Windows的文件系统挂载过程是其内部完成的,用户是看不到的,Linux下我们使用mount命令来挂载磁盘。挂载磁盘的时候是需要确定挂载点的,也就是你的这个磁盘要挂载到哪个目录下。
2、Linux文件系统类型
前面我们说了,在Windows下有FAT、NTFS和exFAT这样的文件系统,在Linux下又有哪些文件系统呢,Linux下的文件系统主要有ext2、ext3、ext4等文件系统。Linux还支持其他的UNIX文件系统,比如XFS、JFS、UFS等,也支持Windows的FAT文件系统和网络文件系统NFS等。这里我们主要讲一下Linux自带的ext2、ext3和ext4文件系统。
ext2文件系统:
ext2是Linux早期的文件系统,但是随着技术的发展ext2文件系统已经不推荐使用了,ext2是一个非日志文件系统,大多数的Linux发行版都不支持ext2文件系统了。
ext3文件系统:
ext3是在ext2的基础上发展起来的文件系统,完全兼容ext2文件系统,ext3是一个日志文件系统,ext3支持大文件,ext3文件系统的特点有如下:
高可靠性:使用ext3文件系统的话,即使系统非正常关机、发生死机等情况,恢复ext3文件系统也只需要数十秒。
数据完整性:ext3提高了文件系统的完整性,避免意外死机或者关机对文件系统的伤害。
文件系统速度:ext3的日志功能对磁盘驱动器读写头进行了优化,文件系统速度相对与ext2来说没有降低。
数据转换:从ext2转换到ext3非常容易,只需要两条指令就可以完成转换。用户不需要花时间去备份、恢复、格式化分区等,用ext3文件系统提供的工具tune2fs即可轻松的将ext2文件系统转换为ext3日志文件系统。ext3文件系统不需要经过任何修改,可以直接挂载成ext2文件系统。
ext4文件系统:
ext4文件系统是在ext3上发展起来的,ext4相比与ext3提供了更佳的性能和可靠性,并且功能更丰富,ext4向下兼容ext3和ext2,因此可以将ext2和ext3挂载为ext4。那么我们安装的Ubuntu使用的哪个版本的文件系统呢?在终端中输入如下命令来查询当前磁盘挂载的是啥文件系统:
df -T –h
结果如下图所示:
图2.6.2 Ubuntu使用的文件系统
在图2.6.2中,框起来的就是我们安装Ubuntu的这个磁盘,在Linux下一切皆为文件,“/dev/sda1”就是我们的磁盘分区,可以看出这个磁盘分区类型是ext4,它的挂载点是“/”,也就是根目录。
Linux文件系统结构
在Windows下直接打开C盘,我们进入的就是C盘的根目录,打开D盘进入的就是D盘的根目录,比如C盘根目录如下:
图2.6.3 C盘根目录
在Linux下因为没有C、D盘之说,因此Linux只有一个根目录,没有C盘根目录、D盘根目录之类的。其实如果你的Windows只有一个C盘的话那么整个系统也就只有一个根目录。
Windows下的C盘根目录就是“C:”,在Linux下的根目录就是“/”,你没有看错,Linux根目录就是用“/”来表示的,打开Ubuntu的文件浏览器,文件浏览器在左侧的导航栏,图标如下图所示:
图2.6.4文件浏览器
打开以后的文件浏览器如图2.6.5所示:
图2.6.5文件浏览器
直接打开文件浏览器以后,我们默认不是处于根目录中的,不像Windows,我们直接打开C盘就处于C盘根目录下。Ubuntu是支持多用户的,Ubuntu为每个用户创建了一个根目录,比如我电脑现在登陆的是“zuozhongkai”这个用户,因此默认进入的是“zuozhongkai”这个用户的根目录。我们点击图2.6.5中左侧的“其他位置”,打开以后如图2.6.6所示:
图2.6.6根目录“/”
图2.6.6就是Ubuntu的根目录“/”,这时候肯定就有人有疑问,刚刚说Ubuntu会给每个用户创建一个根目录,那这些用户的根目录在哪里?是不是和根目录“/”是一个地位的?其实所谓的给每个用户创建一个根目录只是方便说而已,这个所谓的用户根目录其实就是“/”下的一个文件夹,以我的“zuozhongkai”这个用户为例,其用户根目录就是:/home/zuozhongkai。只要你创建了一个用户,那么系统就会在/home这个目录下创建一个以这个用户名命名的文件夹,这个文件夹就是这个用户的根目录。
用户可以对自己的用户根目录下的文件进行随意的读写操作,但是如果要修改根目录“/”下的文件就会提示没有权限。打开终端以后默认进入的是当前用户根目录,比如我们打开终端以后输入“ls”命令查看当前目录下有什么文件,结果如图2.6.7所示:
图2.6.7目录查看
可以看出图2.6.7中的文件和图2.6.5中的一模一样,都是“zuozhongkai”这个账户的根目录。我们来看一下根目录“/”下都有哪些文件,在终端中输入如下命令:
cd / //进入到根目录“/
ls //查看根目录“/”下的文件以及文件夹
执行上述两行命令以后,终端如所示:
图2.6.8查看根目录“/”
图2.6.8中列举出了根目录“/”下面的所有文件夹,这里我们仔细观察一下,当我们进入到根目录“/”里面以后终端提示符“$”前面的符号“~”变成了“/”,这是因为当我们在终端中切换了目录以后“$”前面就会显示切换以后的目录路径。我们来看一下根目录“/”中的一些重要的文件夹:
/bin 存储一些二进制可执行命令文件,/usr/bin也存放了一些基于用户的命令文件。
/sbin 存储了很多系统命令,/usr/sbin也存储了许多系统命令。
/root 超级用户root的根目录文件。
/home 普通用户默认目录,在该目录下,每个用户都有一个以本用户名命名的文件夹。
/boot 存放Ubuntu系统内核和系统启动文件。
/mnt 通常包括系统引导后被挂载的文件系统的挂载点。
/dev 存放设备文件,我们后面学习Linux驱动主要是跟这个文件夹打交道的。
/etc 保存系统管理所需的配置文件和目录。
/lib 保存系统程序运行所需的库文件,/usr/lib下存放了一些用于普通用户的库文件。
/lost+found 一般为空,当系统非正常关机以后,此文件夹会保存一些零散文件。
/var 存储一些不断变化的文件,比如日志文件
/usr 包括与系统用户直接有关的文件和目录,比如应用程序和所需的库文件。
/media 存放Ubuntu系统自动挂载的设备文件。
/proc 虚拟目录,不实际存储在磁盘上,通常用来保存系统信息和进程信息。
/tmp 存储系统和用户的临时文件,该文件夹对所有的用户都提供读写权限。
/opt 可选文件和程序的存放目录。
/sys 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。
文件操作命令
本节我们来学习一下在终端进行文件操作的一些常用命令:
1、创建新文件命令—touch
在前面学习VIM的时候我们知道可以用vi指令来创建一个文本文档,本节我们就学习一个功能更全面的文件创建命令—touch。touch不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:
touch [参数] [文件名]
使用touch创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期,常用的命令参数如下:
-a 只更改存取时间。
-c 不建立任何文件。
-d<日期> 使用指定的日期,而并非现在日期。
-t<时间> 使用指定的时间,而并非现在时间。
进入到用户根目录下,直接使用命令“cd ~”即可快速进入用户根目录,进入用户根目录以后使用touch命令创建一个名为test的文件,创建过程如图2.6.9所示:
图2.6.9命令操作
2、文件夹创建命令—mkdir
既然可以创建文件,那么肯定也可以创建文件夹,创建文件夹使用命令“mkdir”,命令格式如下:
mkdir [参数] [文件夹名目录名]
主要参数如下:
-p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。
我们在用户根目录下创建两个分别名为“testdir1”和“testdir2”的文件夹,操作如图2.6.10所示:
图2.6.10创建文件夹
在图2.6.10中,我们使用命令“mkdir”创建了“testdir1”和“testdir2”这两个文件夹。
3、文件及目录删除命令—rm
既然有创建文件的命令,那肯定有删除文件的命令,要删除一个文件或者文件夹可以使用命令“rm”,此命令可以完成删除一个文件或者多个文件及文件夹,它可以实现递归删除。对于链接文件,只删除链接,原文件保持不变,所谓的链接文件,其实就是Windows下的快捷方式文件,此命令格式如下:
rm [参数] [目的文件或文件夹目录名]
命令主要参数如下:
-d 直接把要删除的目录的硬连接数据删成0,删除该目录。
-f 强制删除文件和文件夹(目录)。
-i 删除文件或者文件夹(目录)之前先询问用户。
-r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。
-v 显示删除过程。
我们使用rm命令来删除前面使用命令“touch”创建的test文件,操作过程如图2.6.11所示:
图2.6.11删除文件
命令“rm”也可以直接删除文件夹,我们可以试一下删除前面创建的testdir1文件夹,先直接使用命令“rm testdir1”测试一下是否可以删除,结果如图2.6.12所示:
图2.6.12删除文件夹
在图2.6.12中可以看出,直接使用命令“rm”是无法删除文件夹(目录)的,我们需要加上参数“-rf”,也就是强制递归删除文件夹(目录),操作结果如图2.6.13所示:
图2.6.13带参数删除文件夹
从图2.6.13可以看出,当在命令“rm”中加入参数“-rf”以后就可以删除掉文件夹“testdir1”了。
4、文件夹(目录)删除命令—rmdir
上面我们讲解了如何使用命令“rm”删除文件夹,那就是要加上参数“-rf”,其实Linux提供了直接删除文件夹(目录)的命令—rmdir,它可以不加任何参数的删除掉指定的文件夹(目录),命令格式如下:
rmdir [参数] [文件夹(目录)]
命令主要参数如下:
-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除。
我们使用命令“rmdir”删除掉前面创建的“testdir2”文件夹,操作过程如图2.6.14所示:
图2.6.14命令rmdir删除文件夹
5、文件复制命令—cp
在Windows下我们可以通过在文件上点击鼠标右键来进行文件的复制和粘贴,在Ubuntu下我们也可以通过点击文件右键进行文件的复制和粘贴。但是本节我们来讲解如何在终端下使用命令来进行文件的复制,Linux下的复制命令为“cp”,命令描述如下:
cp [参数] [源地址] [目的地址]
主要参数描述如下:
-a 此参数和同时指定“-dpR”参数相同
-d 在复制有符号连接的文件时,保留原始的连接。
-f 强行复制文件,不管要复制的文件是否已经存在于目标目录。
-I 覆盖现有文件之前询问用户。
-p 保留源文件或者目录的属性。
-r或-R 递归处理,将指定目录下的文件及子目录一并处理
我们在用户根目录下,使用前面讲解的命令“mkdir”创建两个文件夹:test1和test2,过程如图2.6.15所示。
图2.6.15创建test1和test2两个文件夹
进入上面创建的test1文件夹,然后在test1文件夹里面创建一个a.c文件,操作过程如图2.6.16所示:
图2.6.16创建a.c文件
我们先将图2.6.16中的a.c这个文件做个备份,也就是复制到同文件夹test1里面,新的文件命名为b.c。然后在将test1文件夹中的a.c和b.c这两个文件都复制到文件夹test2中,操作如图2.6.17所示
图2.6.17拷贝文件
在图2.6.17中,我们添加了一些高级使用技巧,首先是拷贝a.c和b.c文件到test2文件夹中,我们使用了通配符“*”,“*.c”就表示test1下的所有以“.c”结尾的文件,也就是a.c和b.c。“../test2”中的“../”表示上级目录,因此“../test2”就是上级目录下的test2文件夹。
上面都是文件复制,我们接下来学习一下文件夹复制,我们将test2文件夹复制到同目录下,新拷贝的文件夹命名为test3,操作如图2.6.18所示:
图2.6.18拷贝文件夹
6、文件移动命令—mv
有时候我们需要将一个文件或者文件夹移动到另外一个地方去,或者给一个文件或者文件夹进行重命名,这个时候我们就可以使用命令“mv”了,此命令格式如下:
mv [参数] [源地址] [目的地址]
主要参数描述如下:
-b 如果要覆盖文件的话覆盖前先进行备份。
-f 若目标文件或目录与现在的文件重复,直接覆盖目标文件或目录。
-I 在覆盖之前询问用户。
使用上面讲解“cp”命令的时候创建了三个文件夹,在上面创建的test1文件夹里面创建一个c.c文件,然后将c.c这个文件重命名为d.c。最后将d.c这个文件移动到test2文件夹里面,操作如下图所示:
图2.6.19移动文件操作
我们再将test1中的d.c文件移动到test2文件夹里面,操作如下图所示:
图2.6.20移动文件操作
文件压缩和解压缩
文件的压缩和解压缩是非常常见的操作,在Windows下我们有很多压缩和解压缩的工具,比如zip、360压缩等等。在Ubuntu下也有压缩工具,本节我们学习Ubuntu下图形化以及命令行这两种压缩和解压缩操作。
1、图形化压缩和解压缩
图形化压缩和解压缩和Windows下基本一样,在要压缩或者解压的文件上点击鼠标右键,然后选择要进行的操作,我们先讲解一下如何进行文件的压缩。首先找到要压缩的文件,然后在要压缩的文件上点击鼠标右键,选择“压缩”选项,如下图所示:
图2.6.21文件压缩
在上图中我们要对test2这个文件夹进行压缩,点击“压缩”以后会弹出下图所示界面让选择压缩后的文件名和压缩格式。
图2.6.22压缩命名和格式选择
在上图中,设置好压缩以后的文件名,然后选择压缩格式,可选的压缩格式如下图所示:
图2.6.23可选压缩格式
从上图中可以看出,可以选择的压缩格式只有三个。这是因为这三个压缩格式与所有系统兼容。挑选一个格式进行压缩,比如我选择的“.zip”这个格式,压缩完成以后如下图所示:
图2.6.24压缩完成的文件
上面就是使用图形化进行文件压缩的过程,我们接下来对刚刚压缩的test2.zip进行解压缩,鼠标放到test2.zip上然后点击鼠标右键,选择“提取到此处”,如下图所示:
图2.6.25解压缩文件
点击上图中的“提取到此处”以后,系统就会自动进行解压缩,上面就是在Ubuntu中使用图形化工具进行文件的压缩和解压缩。
2、命令行进行文件的压缩和解压缩
上面我们学习了如何使用图形化工具在Ubuntu下进行文件的压缩和解压缩,本节我们学学如何使用命令行进行压缩和解压缩,我们后面的开发中所有涉及到压缩和解压缩的操作都是在命令行下完成的。命令行下进行压缩和解压缩常用的命令有三个:zip、unzip和tar,我们依次来学习:
①、命令zip
zip命令看名字就知道是针对.zip文件的,用于将一个或者多个文件压缩成一个.zip结尾的文件,命令格式如下:
zip [参数] [压缩文件名.zip] [被压缩的文件]
主要参数函数如下:
-b<工作目录> 指定暂时存放文件的目录。
-d 从 zip 文件中删除一个文件。
-F 尝试修复已经损毁的压缩文件。
-g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。
-h 帮助。
-j 只保存文件的名,不保存目录。
-m 压缩完成以后删除源文件。
-n<字尾符号> 不压缩特定扩展名的文件。
-q 不显示压缩命令执行过程。
-r 递归压缩,将指定目录下的所有文件和子目录一起压缩。
-v 显示指令执行过程。
-num 压缩率,为1~9的数值。
上面讲解了如何使用图形化压缩工具对文件夹test2进行压缩,这里我们使用命令“zip”对test2文件夹进行压缩,操作如下图所示:
图2.6.26使用zip进行文件压缩
上图就是使用zip命令进行test2文件夹的压缩,我们使用的命令如下:
zip -rv test2.zip test2
上述命令中,-rv表示递归压缩并且显示压缩命令执行过程。
② 命令unzip
unzip命令用于对.zip格式的压缩包进行解压,命令格式如下:
unzip [参数] [压缩文件名.zip]
主要参数如下:
-l 显示压缩文件内所包含的文件。
-t 检查压缩文件是否损坏,但不解压。
-v 显示命令显示的执行过程。
-Z 只显示压缩文件的注解。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中的原有目录路径。
-L 将压缩文件中的全部文件名改为小写。
-n 解压缩时不要覆盖原有文件。
-P<密码> 解压密码。
-q 静默执行,不显示任何信息。
-x<文件列表> 指定不要处理.zip中的哪些文件。
-d<目录> 把压缩文件解到指定目录下。
对上面压缩的test2.zip文件使用unzip命令进行解压缩,操作如下图所示:
图2.6.27命令unzip使用演示
③、命令tar
我们前面讲的zip和unzip这两个是命令只适用于.zip格式的压缩和解压,其它压缩格式就用不了了,比如Linux下最常用的.bz2和.gz这两种压缩格式。其它格式的压缩和解压使用命令tar,tar将压缩和解压缩集合在一起,使用不同的参数即可,命令格式如下:
tar [参数] [压缩文件名] [被压缩文件名]
常用参数如下:
-c 创建新的压缩文件。
-C<目的目录> 切换到指定的目录。
-f<备份文件> 指定压缩文件。
-j 用tar生成压缩文件,然后用bzip2进行压缩。
-k 解开备份文件时,不覆盖已有的文件。
-m 还原文件时,不变更文件的更改时间。
-r 新增文件到已存在的备份文件的结尾部分。
-t 列出备份文件内容。
-v 显示指令执行过程。
-w 遭遇问题时先询问用户。
-x 从备份文件中释放文件,也就是解压缩文件。
-z 用tar生成压缩文件,用gzip压缩。
-Z 用tar生成压缩文件,用compress压缩。
使用tar命令来进行.zip和.gz格式的文件压缩,操作如下图所示:
图2.6.28命令进行压缩
在上图中,我们使用如下两个命令将test1文件夹压缩为.bz2和.gz这两个格式:
tar -vcjf test1.tar.bz2 test1
tar -vczf test1.tar.gz test1
在上面两行命令中,-vcjf表示创建bz2格式的压缩文件,-vczf表示创建.gz格式的压缩文件。学习了如何使用tar命令来完成压缩,我们再来学习使用tar命令完成文件的解压,操作如下图所示:
图2.6.29解压缩命令
上图中我们使用如下所示两行命令完成.bz2和.gz格式文件的解压缩:
tar -vxjf test1.tar.bz2
tar -vxzf test2.tar.gz
上述两行命令中,-vxjf用来完成.bz2格式压缩文件的解压,-vxzf用来完成.gz格式压缩文件的解压。关于Ubuntu下的命令行压缩和解压缩就讲解到这里,重点是tar命令,要熟练掌握使用tar命令来完成.bz2和.gz格式的文件压缩和解压缩。
文件查询和搜索
文件的查询和搜索也是最常用的操作,在嵌入式Linux开发中常常需要在Linux源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等。本节我们就讲解两个最常用的文件查询和搜索命令:find和grep。
1、命令find
命令用于在目录结构中查找文件,其命令格式如下:
find [路径] [参数] [关键字]
路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部分,主要参数如下:
-name<filename> 按照文件名称查找,查找与filename匹配的文件,可使用通配符。
-depth 从指定目录下的最深层的子目录开始查找。
-gid<群组识别码> 查找符合指定的群组识别码的文件或目录。
-group<群组名称> 查找符合指定的群组名称的文件或目录。
-size<文件大小> 查找符合指定文件大小的文件。
-type<文件类型> 查找符合指定文件类型的文件。
-user<拥有者名称> 查找符合指定的拥有者名称的文件或目录。
find命令的参数有很多,常用的就这些,关于其它的参数大家可以自行上网查找,我们来看一下如何使用find命令进行文件搜索,我们搜索目录/etc中以“vim”开头的文件为例,操作如下图所示:
图2.6.30命令操作
从上图可以看出,在目录/etc下,包含以“vim*”开头的文件有/etc/vim、/etc/vim/vimrc等等,就不一一列出了。
2、命令grep
find命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字,grep就是完成这个功能的,grep命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指定的关键字,grep命令就会把包含指定关键字的这一行标记出来,grep命令格式如下:
grep [参数] 关键字 文件列表
grep命令一次只能查一个关键字,主要参数如下:
-b 在显示符合关键字的那一列前,标记处该列第1个字符的位编号。
-c 计算符合关键字的列数。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用此参数!否则grep指令将回报信息并停止搜索。
-i 忽略字符大小写。
-v 反转查找,只显示不匹配的行。
-r 在指定目录中递归查找。
比如我们在目录/usr下递归查找包含字符“Ubuntu”的文件,操作如下图所示:
图2.6.31命令grep演示
文件类型
这里的文件类型不是说这个文件是音乐文件还是文本文件,在用户根目录下使用命令“ls -l”来查看用户根目录下所有文件的详细信息,如下图所示:
图2.6.32文件详细信息
在上图中,每个文件的详细信息占一行,每行最前面都是一个符号就标记了当前文件类型,比如test1的第一个字符是“d”,test1.tar.bz2文件第一个字符是“-”。这些字符表示的文件类型如下:
- 普通文件,一些应用程序创建的,比如文档、图片、音乐等等。
d 目录文件。
c 字符设备文件,Linux驱动里面的字符设备驱动,比如串口设备,音频设备等。
b 块设备文件,存储设备驱动,比如硬盘,U盘等。
l 符号连接文件,相当于Windwos下的快捷方式。
s 套接字文件。
p 管道文件,主要指FIFO文件。
我们后面学习Linux驱动开发的时候基本是在和字符设备文件和块设备文件打交道。
Linux用户权限管理
Ubuntu用户系统
Ubuntu是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性保护。
我们前面在安装Ubuntu系统的时候被要求创建一个账户,当我们创建好账号以后,系统会在目录/home下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件文件夹中。同样的,创建其它用户账号的时候也会在目录/home下生成一个文件夹来存储该用户的文件,下图就是我的电脑上“zuozhongkai”这个账户的文件夹。
图2.7.1用户账号根目录
装系统的时候创建的用户其权限比后面创建的用户大一点,但是没有root用户权限大,Ubuntu下用户类型分为以下3类:
● 初次创建的用户,此用户可以完成比普通用户更多的功能。
● root用户,系统管理员,系统中的玉皇大帝,拥有至高无上的权利。
● 普通用户,安装完操作系统以后被创建的用户。
以上三种用户,每个用户都有一个ID号,称为UID,操作系统通过UID来识别是哪个用户,用户相关信息可以在文件/etc/passwd中查看到,如下图所示:
图2.7.2文件内容
从配置文件passwd中可以看到,每个用户名后面都有两个数字,比如用户“zuozhongkai”后面“1000:1000”,第一个数字是用户的ID,另一个是用户的GID,也就是用户组ID。Ubuntu里面每个用户都属于一个用户组里面,用户组就是一组有相同属性的用户集合。
权限管理
在使用Windows的时候我们很少接触到用户权限,最多就是打开某个软件出问题的时候会选择以“管理员身份”打开。Ubuntu下我们会常跟用户权限打交道,权限就是用户对于系统资源的使用限制情况,root用户拥有最大的权限,可以为所欲为,装系统的时候创建的用户拥有root用户的部分权限,其它普通用户的权限最低。对于我们做嵌入式开发的人一般不关注用户的权限问题,因为嵌入式基本是单用户,做嵌入式开发重点关注的是文件的权限问题。
对于一个文件通常有三种权限:读(r)、写(w)和执行(x),使用命令“ls -l”可以查看某个目录下所有文件的权限信息,如下图所示:
图2.7.3文件权限信息
在上图中我们以文件test.c为例讲解,文件test.c文件信息如下:
-rw-rw-r-- 1 zuozhongkai zuozhongkai 0 12月 25 20:44 test.c
其中“-rw-rw-r--”表示文件权限与用户和用户组之间的关系,第一位表示文件类型,上一小节已经说了。剩下的9位以3位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组的权限以及其它用户权限。后面的“zuozhongkai zuozhongkai”分别代表文件拥有者(用户)和该用户所在的用户组,因此文件test.c的权限情况如下:
①、文件test.c的拥有者是用户zuozhongkai,其对文件tesst.c的权限是“rw-”,也就是对该文件拥有读和写两种权限。
②、用户zuozhongkai所在的用户组也叫做zuozhongkai,其组内用户对于文件test.c的权限是“rw-”,也是拥有读和写这两种权限。
③、其它用户对于文件test.c的权限是“r--”,也就是只读权限。
对于文件,可读权限表示可以打开查看文件内容,可写权限表示可以对文件进行修改,可执行权限就是可以运行此文件(如果是软件的话)。对于文件夹,拥有可读权限才可以使用命令ls查看文件夹中的内容,拥有可执行权限才能进入到文件夹内部。
如果某个用户对某个文件不具有相应的权限的话就不能进行相应的操作,比如根目录“/”下的文件只有root用户才有权限进行修改,如果以普通用户去修改的话就会提示没有权限。比如我们要在根目录“/” 创建一个文件mytest,使用命令“touch mytest”,结果如下图所示:
图2.7.4创建文件
在上图中,我以用户“zuozhongkai”在根目录“/”创建文件mytest,结果提示我无法创建“mytest”,因为权限不够,因为只有root用户才能在根目录“/”下创建文件。我们可以使用命令“sudo”命令暂时切换到root用户,这样就可以在根目录“/”下创建文件mytest了,如下图所示:
图2.7.5使用sudo命令创建文件
在上图中我们使用命令“sudo”以后就可以在根目录“/”创建文件mytest,在进行其它的操作的时候,遇到提示权限不够的时候都可以使用sudo命令暂时以root用户身份去执行。
上面我们讲了,文件的权限有三种:读(r)、写(w)和执行(x),除了用r、w和x表示以外,我们也可以使用二进制数表示,三种权限就可以使用3位二进制数来表示,一种权限对应一个二进制位,如果该位为1就表示具备此权限,如果该位为0就表示没不具备此权限,如下表所示:
字母 | 二进制 | 八进制 |
r | 100 | 4 |
w | 010 | 2 |
x | 001 | 1 |
表2.7.1文件权限数字表示方法
如果做过单片机开发的话,就会发现和单片机里面的寄存器位一样,将三种权限r、w和x进行不同的组合,即可得到不同的二进制数和八进制数,3位权限可以组出8种不同的权限组合,如下表所示:
权限 | 二进制数字 | 八进制数字 |
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
表2.7.2文件所有权限组合
表2.7.2.2中权限所对应的八进制数字就是每个权限对应的位相加,比如权限rwx就是4+2+1=7。前面的文件test.c其权限为“rw-rw-r--”,因此其十进制表示就是:664。
另外我们也开始使用a、u、g和o表示文件的归属关系,用=、+和-表示文件权限的变化,如下表所示:
字母 | 意义 |
r | 可读权限 |
w | 可写权限 |
x | 可执行权限 |
a | 所有用户 |
u | 归属用户 |
g | 归属组 |
o | 其它用户 |
= | 具备权限 |
+ | 添加某权限 |
- | 去除某权限 |
表2.7.3权限修改字母表示方式
对于文件test.c,我们想要修改其归属用户(zuozhongkai)对其拥有可执行权限,那么就可以使用:u+x。如果希望设置归属用户及其所在的用户组都对其拥有可执行权限就可以使用:gu+x。
权限管理命令
我们也可以使用Shell来操作文件的权限管理,主要用到“chmod”和“chown”这两个命令,我们一个一个来看。
1、权限修改命令chmod
命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使用字母表示,命令格式如下:
chmod [参数] [文件名/目录名]
主要参数如下:
-c 效果类似“-v”参数,但仅回显更改的部分。
-f 不显示错误信息。
-R 递归处理,指定目录下的所有文件及其子文件目录一起处理。
-v 显示指令的执行过程。
我们先来学习以下如何使用命令“chmod”修改一个文件的权限,在用户根目录下创建一个文件test,然后查看其默认权限,操作如下图所示:
图2.7.6创建文件test
在上图中我们创建了一个文件:test,这个文件的默认权限为“rw-rw-r--”,我们将其权限改为“rwxrw-rw”,对应数字就是766,操作如下:
图2.7.7修改权限
在上图中,我们修改文件test的权限为766,修改完成以后的test文件权限为“rwxrw-rw-”,和我们设置的一样,说明权限修改成功。
上面我们是通过数字来修改权限的,我们接下来使用字母来修改权限,操作如下图所示:
图2.7.8使用字母修改文件权限
上面两个例子都是修改文件的权限,接下来我们修改文件夹的权限,新建一个test文件夹,在文件夹test里面创建a.c、b.c和c.c三个文件,如下图所示:
图2.7.9文件夹
在上图中test文件夹下的文件a.c、b.c和c.c的权限均为“rw-rw-r--”,我们将test文件夹下的所有文件权限都改为“rwxrwxrwx”,也就是数字777,操作如下图所示:
图2.7.10递归修改文件夹权限
2、文件归属者修改命令chown
命令chown用来修改某个文件或者目录的归属者用户或者用户组,命令格式如下:
chown [参数] [用户名.<组名>] [文件名/目录]
其中[用户名.<组名>]表示要将文件或者目录改为哪一个用户或者用户组,用户名和组名用“.”隔开,其中用户名和组名中的任何一个都可以省略,命令主要参数如下:
-c 效果同-v类似,但仅回显更改的部分。
-f 不显示错误信息。
-h 只对符号连接的文件做修改,不改动其它任何相关的文件。
-R 递归处理,将指定的目录下的所有文件和子目录一起处理。
-v 显示处理过程。
在用户根目录下创建一个test文件,查看其文件夹所属用户和用户组,如下图所示:
图2.7.11文件信息查询
从上图中可以看出,文件test的归属用户为zuozhongkai,所属的用户组为zuozhongkai,将文件test归属用户改为root用户,所属的用户组也改为root,操作如下图所示:
图2.7.12修改文件归属用户和归属组
命令shown同样也可以递归处理来修改文件夹的归属用户和用户组,用法和命令chown一样,这里就不演示了。
Linux磁盘管理
Linux磁盘管理基本概念
Linux的磁盘管理体系和Windows有很大的区别,在Windows下经常会遇到“分区”这个概念,在Linux中一般不叫“分区”而叫“挂载点”。 “挂载点”就是将一个硬盘的一部分做成文件夹的形式,这个文件夹的名字就是“挂载点”,不管在哪个发行版的Linux中,用户是绝对看到不到C盘、D盘这样的概念的,只能看到以文件夹形式存在的“挂载点”.
文件/etc/fstab详细的记录了Ubuntu中硬盘分区的情况,如图2.8.1.1所示:
图2.8.1.1 文件fstab
在图2.8.1.1中有一行“/ was on /dev/sda1 during installation”,意思是根目录“/”是在/dev/sda1上的,其中“/”是挂载点,“/dev/sda1”就是我们装Ubuntu系统的硬盘。由于我们的系统是安装在虚拟机中的,因此图2.8.1.1没有出现实际的硬盘。可以通过如下命令查看当前系统中的磁盘:
ls /dev/sd*
上述命令就是打印出所有以/dev/sd开头的设备文件,如图2.8.1.2所示:
图2.8.1.2 查看硬盘设备文件
在图2.8.1.2中有四个磁盘设备文件,其中sd表示是SATA硬盘或者其它外部设备,最后面的数字表示该硬盘上的第n个分区,比如/dev/sda1就表示磁盘sda上的第一个分区。图2.8.1.2中都是以/dev/sda开头的,说明当前只有一个硬盘。如果再插上U盘、SD卡啥的就可能会出现/dev/sdb,/dev/sdc等等。如果你的U盘有两个分区那么可能就会出现/dev/sdb1、dev/sdb2这样的设备文件。比如我现在插入我的U盘,插入U盘会提示U盘是接到主机还是虚拟机,如图2.8.1.3所示:
图2.8.1.3 U盘连接选择
设置好图2.8.1.3以后,点击“确定”按钮U盘就会自动连接到虚拟机中,也就是连接到Ubuntu系统中,我们再次使用命令“ls /dev/sd*”来查看当前的“/dev/sd*”设备文件,如图2.8.1.4所示:
图2.8.1.4 插入U盘后的设备文件
从图2.8.1.4可以看出,相比图2.8.1.2多了/dev/sdb和/dev/sdb1这两个文件,其中/dev/sdb就是U盘文件,/dev/sdb1表示U盘的第一个分区,因为我的U盘就一个分区。
磁盘管理命令
本节我们学习以下跟磁盘操作有关的命令,这些命令如下:
1、磁盘分区命令fdisk
如果要对某个磁盘进行分区,可以使用命令fdisk,命令格如下:
fdisk [参数]
主要参数如下:
-b<分区大小> 指定每个分区的大小。
-l 列出指定设备的分区表。
-s<分区编号> 将指定的分区大小输出到标准的输出上,单位为块。
-u 搭配“-l”参数,会用分区数目取代柱面数目,来表示每个分区的起始地址。
比如我要对U盘进行分区,千万不要对自己装Ubuntu系统进行分区!!!可以使用如下命令:
sudo fdisk /dev/sdb
结果如图2.8.2.1所示:
图2.8.2.1 U盘分区界面
在图2.8.2.1中提示我们输入“m”可以查看帮助,因为fdisk还有一些字命令,通过输入“m”可以查看都有哪些子命令,如图2.8.2.2所示:
图2.8.2.2 fdisk命令的子命令
图2.8.2.2中常用的命令如下:
p 显示现有的分区
n 建立新分区
t 更改分区类型
d 删除现有的分区
a 更改分区启动标志
w 对分区的更改写入到硬盘或者存储器中。
q 不保存退出。
由于我的U盘里面还有一些重要的文件,所以现在不能进行分区,所以就不演示fdisk的分区操作了,后面我们讲解裸机例程的时候需要将可执行的bin文件烧写到SD卡中,烧写到SD卡之前需要对SD卡进行分区,到时候再详细讲解如何使用fdisk命令对磁盘进行分区。
2、格式化命令mkfs
使用命令fdisk创建好一个分区以后,我们需要对其格式化,也就是在这个分区上创建一个文件系统,Linux下的格式化命令为mkfs,命令格式如下:
mkfs [参数] [-t 文件系统类型] [分区名称]
主要参数如下:
fs 指定建立文件系统时的参数
-V 显示版本信息和简要的使用方法。
-v 显示版本信息和详细的使用方法。
比如我们要格式化U盘的分区/dev/sdb1为FAT格式,那么就可以使用如下命令:
mkfs –t vfat /dev/sdb1
3、挂载分区命令mount
我们创建好分区并且格式化以后肯定是要使用硬盘或者U盘的,那么如何访问磁盘呢?比如我的U盘就一个分区,为/dev/sdb1,如果直接打开文件/dev/sdb1会发现根本就不是我们要的结果。我们需要将/dev/sdb1这个分区挂载到一个文件夹中,然后通过这个文件访问U盘,磁盘挂载命令为mount,命令格式如下:
mount [参数] -t [类型] [设备名称] [目的文件夹]
命令主要参数有:
-V 显示程序版本。
-h 显示辅助信息。
-v 显示执行过程详细信息。
-o ro 只读模式挂载。
-o rw 读写模式挂载。
-s-r 等于-o ro。
-w 等于-o rw。
挂载点是一个文件夹,因此在挂载之前先要创建一个文件夹,一般我们把挂载点放到“/mnt”目录下,在“/mnt”下创建一个tmp文件夹,然后将U盘的/dev/sdb1分区挂载到/mnt/tmp文件夹里面,操作如图2.8.2.3所示:
图2.8.2.3 挂载U盘
在图2.8.2.3中我们将U盘以fat格式挂载到目录/mnt/tmp中,然后我们就可以通过访问/mnt/tmp来访问U盘了。
4、卸载命令umount
当我们不在需要访问已经挂载的U盘,可以通过umount将其从卸载点卸除,命令格式如下:
umount [参数] -t [文件系统类型] [设备名称]
-a 卸载/etc/mtab中的所有文件系统。
-h 显示帮助。
-n 卸载时不要将信息存入到/etc/mtab文件中
-r 如果无法成功卸载,则尝试以只读的方式重新挂载。
-t <文件系统类型> 仅卸载选项中指定的文件系统。
-v 显示执行过程。
上面我们将U盘挂载到了文件夹/mnt/tmp里面,这里我们使用命令umount将其卸载掉,操作如图2.8.2.4所示:
图2.8.2.4 卸载U盘
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。