目录
【 I.MX6U-ALPHA 】嵌入式 Linux Ubuntu系统入门系列(一)Ubuntu 系统安装
【 I.MX6U-ALPHA 】嵌入式Linux Ubuntu系统入门系列(三)Linux C编程入门
我们已经安装好虚拟机,并且在虚拟机中安装好了 Ubuntu 操作系统了,我们就来学习 Ubuntu 系统的基本使用,通过学习为我们以后的开发做准备。主要目的是教会读者掌握后续嵌入式开发所需的 Ubuntu 基本技能,比如系统的基本设置、常用的 shell 命令、vim 编辑器的基本操作等等,如果想详细的学习 Ubuntu 操作系统请参考其它更为详实的书籍,本章参考了《Ubuntu Linux 从入门到精通》,这本书不厚,很适合用来作 Ubuntu 入门。
1、Ubuntu系统初体验
1.1、开启Ubuntu虚拟机
1.2、系统设置
我们会发现,Ubuntu 的默认桌面很小,这是因为 Ubuntu 默认分辨率是 800*600,因此我们首先要设置系统分辨率,调整到合适的大小。我们通过安装VMware Tools 来自动根据窗口适配分辨率(参考 VMware Tools安装 配置)
1.3、中文输入法
1.4、Ubuntu终端操作
终端操作,也就是俗称的“敲命令”,不管是哪个版本的 Linux 发行版系统,它都会提供终端操作,Linux 下的终端操作类似与 Windows下的 DOS 操作。要使用终端首先肯定是要打开终端,在主界面上点击鼠标右键,然后选择打开
终端,如图所示:
终端默认会有类似下面一行所示的一串提示符:
hanhui@hanhui-virtual-machine: ~$
上述字符串中,@前面的“hanhui”是当前的用户名字,@后面的 hanhui-virtual-machine 是我的机器名字。最后面的符号“$”表示当前用户是普通用户,我们可以在提示符后面输入命令,比如输入命令“ls”,命令“ls”是打印出当前所在目录中所有文件和文件夹,如图所示:
2、Shell操作
Shell 是一个应用程序,它负责接收用户输入的命令,然后根据命令做出相应的动作,Shell 负责将应用层或者用户输入的命令传递给系统内核,由操作系统内核来完成相应的工作,然后将结果反馈给应用层或者用户。
2.1 Shell基本操作
前面我们说 Shell 就是“敲命令”,那么既然是命令,那肯定是有格式的,Shell 命令的格式如下:
command -options [argument]
command: Shell 命令名称。
options:选项,同一种命令可能有不同的选项,不同的选项其实现的功能不同。
argument:Shell 命令是可以带参数的,也可以不带参数运行。
2.2、常用Shell命令
2.2.1、目录信息查看命令 ls
文件浏览是最基本的操作了,Shell 下文件浏览命令为 ls,格式如下:
ls [选项] [路径]
ls 命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录,它的主要参数有:
-a 显示所有的文件以及子目录,包括以“.”开头的隐藏文件。
-l 显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。
-t 将文件按照创建时间排序列出。
-A 和-a 一样,但是不列出“.”(当前目录)和“..”(父目录)。
-R 递归列出所有文件,包括子目录中的文件。
2.2.2、目录切换命令 cd
要想在 Shell 中切换到其它的目录,使用的命令是 cd,命令格式如下:
cd [路径]
路径就是我们要进入的目录路径,比如下面所示操作:
cd / //进入到根目录“/”下,Linux 系统的根目录为“/”,
cd /usr //进入到目录“/usr”里面。
cd .. //进入到上一级目录。
cd ~ //切换到当前用户主目录
2.2.3、当前路径显示命令 pwd
pwd 命令用来显示当前工作目录的绝对路径,不需要任何的参数
2.2.4、系统信息查看命令 uname
要查看当前系统信息,可以使用命令 uname,命令格式如下:
uname [选项]
可选的选项参数如下:
-r 列出当前系统的具体内核版本号。
-s 列出系统内核名称。
-o 列出系统信息。
2.2.5、清屏命令 clear
clear 命令用于清除终端上的所有内容,只留下一行提示符。
2.2.6、切换用户执行身份命令sudo
Ubuntu(Linux)是一个允许多用户的操作系统,其中权限最大的就是超级用户 root,有时候我们执行一些操作的时候是需要用 root 用户身份才能执行,比如安装软件。通过 sudo 命令可以使我们暂时将身份切换到 root 用户。当使用 sudo 命令的时候是需要输入密码的,这里要注意输入密码的时候是没有任何提示的!命令格式如下:
sudo [选项] [命令]
选项主要参数如下:
-h 显示帮助信息。
-l 列出当前用户可执行与不可执行的命令
-p 改变询问密码的提示符。
假如我们现在要创建一个新的用户 test,创建新用户的命令为“adduser”,创建新用户的权限只有 root 用户才有,我们在装系统的时候创建的那个用户是没有这个权限的,比如我的“hanhui”用户。所以创建新用户的话需要使用“sudo”命令以 root 用户执行“adduser”这个命令,
我们一开始直接使用“adduser test”命令添加用户的时候提示我们“adduser:只有 root 才能将用户或组添加到系统。”所以我们要在前面加上“sudo”命令,表示以 root 用户执行 adduser 操作。
2.2.7、 添加用户命令 adduser
在讲解 sudo 命令的时候我们已经用过命令“adduser”,此命令需要 root 身份去运行。命令格式如下:
adduser [参数] [用户名]
常用的参数如下:
-system 添加一个系统用户
-home DIR DIR 表示用户的主目录路径
-uid ID ID 表示用户的 uid。
-ingroup GRP 表示用户所属的组名。
adduser 的使用我们前面已经演示过了,大家可以试着再添加一个用户。
2.2.8、删除用户命令 deluser
前面讲了添加用户的命令,那肯定也有删除用户的命令,删除用户使用命令“deluser”,命令参数如下:
deluser [参数] [用户名]
主要参数有:
-system 当用户是一个系统用户的时候才能删除。
-remove-home 删除用户的主目录
-remove-all-files 删除与用户有关的所有文件。
-backup 备份用户信息
同样的,命令“deluser”也要使用“sudo”来以 root 用户运行,以删除我们前面创建的用
户 test 为例,
2.2.9、切换用户命令 su
前面在讲解命令“sudo”的时候说过,“sudo”是以 root 用户身份执行一个命令,并没有更改当前的用户身份,所有需要 root 身份执行的命令都必须在前面加上“sudo”。命令“su”可以直接将当前用户切换为 root 用户,切换到 root 用户以后就可以尽情的进行任何操作了!因为你已经获得了系统最高权限,在 root 用户下,所有的命令都可以无障碍执行,不需要在前面加上“sudo”,“su”命令格式如下:
su [选项] [用户名]
常用选项参数如下:
-c –command 执行指定的命令,执行完毕以后回复原用户身份。
-login 改变用户身份,同时改变工作目录和 PATH 环境变量。
-m 改变用户身份的时候不改变环境变量
-h 显示帮助信息
以切换到 root 用户为例,
先使用命令“sudo su”切换到 root 用户,su 命令不写明用户名的话默认切换到 root 用户。然后输入密码,密码正确的话就会切换到 root 用户,可以看到切换到 root 用户以后提示符的“@”符号前面的用户名变成了“root”,表示当前的用户是 root 用户。并且以“#”结束。
注意!!由于 root 用户权限太大,稍微不注意就可能删除掉系统文件,导致系统奔溃,因此强烈建议大家,不要以root用户运行Ubuntu。当要用到root身份执行某些命令的时候使用“sudo”命令即可。
要切换回原来的用户,使用命令“sudo su 用户名”即可,比如我要从 root 切换回 hanhui这个用户。
2.2.10、显示文件内容命令 cat
查看文件内容是最常见的操作了,在 windows 下可以直接使用记事本查看一个文本文件内容,linux 下也有类似记事本的软件,叫做 gedit,找到一个文本文件,双击打开,默认使用的就是 gedit,
我们现在讲解的是 Shell 命令,那么 Shell 下有没有办法读取文件的内容呢?肯定有的,那就是命令“cat”,命令格式如下:
cat [选项] [文件]
选项主要参数如下:
-n 由 1 开始对所有输出的行进行编号。
-b 和-n 类似,但是不对空白行编号。
-s 当遇到连续两个行以上空白行的话就合并为一个行空白行。
比如我们以查看文件“/etc/environment”的内容为例,
2.2.11、显示和配置网络属性命令 ifconfig
ifconfig 是一个跟网络属性配置和显示密切相关的命令,通过此命令我们可以查看当前网络属性,也可以通过此命令配置网络属性,比如设置网络 IP 地址等等,此命令格式如下:
ifconfig interface options | address
主要参数如下:
interface 网络接口名称,比如 eth0 等。
up 开启网络设备。
down 关闭网络设备。
add IP 地址,设置网络 IP 地址。
netmask add 子网掩码。
2.2.12、系统帮助命令 man
Ubuntu 系统中有很多命令,这些命令都有不同的格式,不同的格式对应不同的功能,要完全记住这些命令和格式几乎是不可能的,必须有一个帮助手册,当我们需要了解一个命令的详细信息的时候查阅这个帮助手册就行了。Ubuntu 提供了一个命令来帮助用户完成这个功能,那就是“man”命令,通过“man”命令可以查看其它命令的语法格式、主要功能、主要参数说明等, “man”命令格式如下:
man [命令名]
比如我们要查看命令“ifconfig”的说明,输入“man ifconfig”即可,
在终端中输入图 所示的命令,然后点击回车键就会打开“ifconfig”这个命令的详细说明,
就是命令“ifconfig”的详细介绍信息,按“q”键退出到终端。
2.2.13、系统重启命令reboot
通过点击 Ubuntu 主界面右上角的齿轮按钮来选择关机或者重启系统,同样的我们也可以使用 Shell 命令“reboot”来重启系统,直接输入命令“reboot”然后点击回车键接口。
2.2.14、系统关闭命令 poweroff
使用命令“reboot”可以重启系统,使用命令“poweroff”就可以关闭系统,在终端中输入命令“poweroff”然后按下回车键即可关闭 Ubuntu 系统,
2.2.15、软件安装命令 install
截至目前,我们都没有讲过 Ubuntu 下如何安装软件,因为 Ubuntu 安装软件不像 Windows下那样,直接双击.exe 文件就开始安装了。Ubuntu 下很多软件是需要先自行下载源码,下载源码以后自行编译,编译完成以后使用命令“intsall”来安装。当然 Ubuntu 下也有其它的软件安装方法,但是用的最多的就是自行编译源码然后安装,尤其是嵌入式 Linux 开发。命令“install”格式如下:
install [选项]... [-T] 源文件 目标文件
或:install [选项]... 源文件... 目录
或:install [选项]... -t 目录 源文件...
或:install [选项]... -d 目录...
“install”命令是将文件(通常是编译后的文件)复制到目的位置,在前三种形式中,将源文件复制到目标文件或将多个源文件复制到一个已存在的目录中同时设置其所有权和权限模式。在第四种形式会创建指定的目录。命令“install”通常和命令“apt-get”组合在一起使用的,关于“apt-get”命令我们稍后会讲解。
3、APT下载工具
对于长时间使用Windows的我们,下载安装软件非常容易,Windows下有很多的下载软件,Ubuntu 同样有不少的下载软件,本节我们讲解 Ubuntu 下我们用的最多的下载工具:APT 下载工具,APT 下载工具可以实现软件自动下载、配置、安装二进制或者源码的功能。APT 下载工具和我们前面讲解的“install”命令结合在一起构成了 Ubuntu 下最常用的下载和安装软件方法。它解决了 Linux 平台下一安装软件的一个缺陷,即软件之间相互依赖。APT 采用的 C/S 模式,也就是客户端/服务器模式,我们的 PC 机作为客户端,当需要下载软件的时候就向服务器请求,因此我们需要知道服务器的地址,也叫做安装源或者更新源。打开系统设置,打开“软件和更新”设置。
我们这里已经切换成阿里云的源,参考ubuntu切换国内下载源这篇博客。
APT工具常用的命令如下:
3.1、更新本地数据库
如果想查看本地哪些软件可以更新的话可以使用如下命令:
sudo apt-get update
这个命令会访问源地址,并且获取软件列表并保存在本电脑上,过程如图所示:
3.2、检查依赖关系
有时候本地某些软件可能存在依赖关系,所谓依赖关系就是 A 软件依赖于 B 软件。通过如下命令可以查看依赖关系,如果存在依赖关系的话 APT 会提出解决方案:
sudo apt-get check
上述命令的执行结果如图所示:
3.3、软件安装
这个是重点了,安装软件,使用如下命令:
sudo apt-get install package-name
可以看出上述命令是由“apt-get”和“install”组合在一起的,“package-name”就是要安装的软件名字,“apt-get”负责下载软件,“install”负责安装软件。比如我们要安装软件 Ubuntu 下的串口工具“minicom”,我们就可以使用如下命令:
sudo apt-get install minicom
执行上述命令以后就会自动下载和安装 minicom 软件,如图所示:
安装完成以后我们直接在终端输入如下命令打开 minicom 这个串口软件:
minicom -s
打开以后的 minicom 软件如图所示:
要退出 minicom 可以直接按下 ESC 键。
3.4、软件更新
有时候我们需要更新软件,更新软件的话使用命令:
sudo apt-get upgrade package-name
其中 package-name 为要升级的软件名字,比如我们升级刚刚安装的 minicom 这个软件,如图所示:
从图可以看出,minicom 已经是最新的了,不用更新,不过有其它软件需要更新,因此会自动更新其它的软件。
3.5、卸载软件
如果要卸载某个软件的话使用如下命令:
sudo apt-get remove package-name
其中 package-name 是要卸载的软件,比如卸载前面安装的 minicom 这个软件,操作如图所示:
从图中可以看出软件 minicom 被卸载掉了。关于 APT 下载工具就讲解到这里,我们用的最多的就是“sudo apt-get install package-name”来下载和安装软件。
4、VI/VIM编辑器
4.1、安装VIM编辑器
我们如果要在终端模式下进行文本编辑或者修改文件就可以使用 VI/VIM 编辑器,Ubuntu自带了 VI 编辑器,但是 VI 编辑器对于习惯了 Windows 下进行开发的人来说不方便,比如竟然不能使用键盘上的上下左右键调整光标位置。因此我推荐大家使用 VIM 编辑器,VIM 编辑器是 VI 编辑器升级版本,VI/VIM 编辑器都是一种基于指令式的编辑器,不需要鼠标,也没有菜单,仅仅使用键盘来完成所有的编辑工作。
我们需要先安装 VIM 编辑器,命令如下:
sudo apt-get install vim
安装完成以后就可以使用 VIM 编辑器了,VIM 编辑器有 3 种工作模式:输入模式、指令模式和底行模式,通过切换不同的模式可以完成不同的功能。
4.2、输入模式
我们就以编辑一个文本文档为例讲解 VIM 编辑器的使用。
我们试着在图 2.5.2.2 中输入数字,发现根本没法输入,这不是因为你的键盘坏了。因为 VIM默认是以只读模式打开的文档,因此我们要切换到输入模式,切换到输入模式的命令如下:
i 在当前光标所在字符的前面,转为输入模式。
I 在当前光标所在行的行首转换为输入模式。
a 在当前光标所在字符的后面,转为输入模式。
A 在光标所在行的行尾,转换为输入模式。
o 在当前光标所在行的下方,新建一行,并转为输入模式。
O 在当前光标所在行的上方,新建一行,并转为输入模式。
s 删除光标所在字符。
r 替换光标处字符。
最常用的就是“a”,我们在图中按下键盘上的“a”键,这时候终端左下角会提示“插入”字样,表示我们进入到了输入模式,如图所示:
在图中我们在 test.txt 中输入了字母、数字和中文,我们输入完成以后需要保存文本啊,Windows 下的记事本可以使用快捷键 Ctrl+S 来保存,VIM 是否也可以使用 Ctrl+S 来保存呢?你会发现当你按下 Ctrl+S 键以后你的终端不能操作了!!!这是因为在 Ubuntu 下 Ctrl+S 快捷键不是用来完成保存的功能的,而是暂停该终端!所以你一旦在使用终端的时候按下 Ctrl+S快捷键,那么你的终端肯定不会再有任何反应,如果你按下 Ctrl+S 关闭了当前终端的话可以按下 Ctrl+Q 来重新打开终端。
4.3、指令模式
我们需要从 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 粘贴最近复制的内容。
4.4、指令模式
从上面的命令可以看出,并没有保存文本的命令,那是因为保存文档的命令是在底行模式中,我们要先进入到指令模式,进入底行模式的方式是先进入指令模式下,然后在指令模式下输入“:”进入底行模式,如图所示:
在图 2.5.2.5 中当进入底行模式以后会在终端的左下角就会出现符号“:”,我们可以在“:”后面输入命令,常用的命令如下:
x 保存当前文档并且退出。
q 退出。
w 保存文档。
q! 退出 VI/VIM,不保存文档。
如果我们要退出并保存文本的话需要在“:”底行模式下输入“wq”,如图所示:
在“:”底行模式下输入“wq”以后按下回车键就保存 test.txt 并退出 VI/VIM 编辑器,退出以后我们可以使用命令“cat”来查看刚刚新建的 test.txt 文档的内容,如图所示:
test.txt 中的内容就是我们用 VIM 输入的内容,至此我们就完整的进行了一遍 VI/VIM 创建文档、编辑文档和保存文档。
在上面讲解进入 VIM 的底行模式的时候之说了在指令模式下输入“:”的方法,还可以在指令模式下输入“/”进入底行模式,输入“/”以后如图所示。
在“/”底行模式下我们可以在文本中搜索指定的内容,比如搜索 test.txt 文件中“嵌入式”三个字,使用方法如图所示:
在“/”后面输入要搜索的内容,然后按下回车键就会在 test.txt 中找到与字符串“嵌入式”匹配的部分,如图所示:
图中可以看出,在 test.txt 中找到了“嵌入式”这个词,并且标记出来位置。我们以后要在一个文档中搜素是否存在某个字符串的时候就可以使用这种方法。
5、Linux文件系统
5.1、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
结果如图所示:
在图中,框起来的就是我们安装 Ubuntu 的这个磁盘,在 Linux 下一切皆为文件,“/dev/sda1”就是我们的磁盘分区,可以看出这个磁盘分区类型是 ext4,它的挂载点是“/”,也就是根目录。
5.2、Linux文件系统结构
我们来看一下根目录“/”下都有哪些文件,在终端中输入如下命令:
cd / //进入到根目录“/
ls //查看根目录“/”下的文件以及文件夹
执行上述两行命令以后,终端如图所示:
列举出了根目录“/”下面的所有文件夹,这里我们仔细观察一下,当我们进入到根目录“/”里面以后终端提示符“$”前面的符号“~”变成了“/”,这是因为当我们在终端中切换了目录以后“$”前面就会显示切换以后的目录路径。我们来看一下根目录“/”中的一些重要的文件夹:
/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 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。
5.3、文件操作命令
5.3.1、创建新文件命令— —touch
在前面学习 VIM 的时候我们知道可以用 vi 指令来创建一个文本文档,本节我们就学习一个功能更全面的文件创建命令—touch。touch 不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:
touch [参数] [文件名]
使用 touch 创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期,常用的命令参数如下:
-a 只更改存取时间。
-c 不建立任何文件。
-d< 日期> 使用指定的日期,而并非现在日期。
-t< 时间> 使用指定的时间,而并非现在时间。
(进入到用户根目录下,直接使用命令“cd ~”即可快速进入用户根目录。)
5.3.2、文件夹创建命令— —mkdir
既然可以创建文件,那么肯定也可以创建文件夹,创建文件夹使用命令“mkdir”,命令格式如下:
mkdir [参数] [文件夹名目录名]
主要参数如下:
-p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。
5.3.2、文件及目录删除命令— —rm
既然有创建文件的命令,那肯定有删除文件的命令,要删除一个文件或者文件夹可以使用命令“rm”,此命令可以完成删除一个文件或者多个文件及文件夹,它可以实现递归删除。对于链接文件,只删除链接,原文件保持不变,所谓的链接文件,其实就是 Windows 下的快捷方式文件,此命令格式如下:
rm [参数] [目的文件或文件夹目录名]
命令主要参数如下:
-d 直接把要删除的目录的硬连接数据删成 0,删除该目录。
-f 强制删除文件和文件夹(目录)。
-i 删除文件或者文件夹(目录)之前先询问用户。
-r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。
-v 显示删除过程。
直接使用命令“rm”是无法删除文件夹(目录)的,我们需要加上参数“-rf”,也就是强制递归删除文件夹(目录)
5.3.4、文件夹( 目录) 删除命令— —rmdir
上面我们讲解了如何使用命令“rm”删除文件夹,那就是要加上参数“-rf”,其实 Linux 提供了直接删除文件夹(目录)的命令—rmdir,它可以不加任何参数的删除掉指定的文件夹(目录),命令格式如下:
rmdir [参数] [文件夹(目录)]
命令主要参数如下:
-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除。
5.3.5、文件复制命令— —cp
在 Windows 下我们可以通过在文件上点击鼠标右键来进行文件的复制和粘贴,在 Ubuntu下我们也可以通过点击文件右键进行文件的复制和粘贴。但是本节我们来讲解如何在终端下使用命令来进行文件的复制,Linux 下的复制命令为“cp”,命令描述如下:
cp [参数] [源地址] [目的地址]
主要参数描述如下:
-a 此参数和同时指定“-dpR”参数相同
-d 在复制有符号连接的文件时,保留原始的连接。
-f 强行复制文件,不管要复制的文件是否已经存在于目标目录。
-I 覆盖现有文件之前询问用户。
-p 保留源文件或者目录的属性。
-r 或-R 递归处理,将指定目录下的文件及子目录一并处理
5.3.6、文件移动命令— —mv
有时候我们需要将一个文件或者文件夹移动到另外一个地方去,或者给一个文件或者文件夹进行重命名,这个时候我们就可以使用命令“mv”了,此命令格式如下:
mv [参数] [源地址] [目的地址]
主要参数描述如下:
-b 如果要覆盖文件的话覆盖前先进行备份。
-f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录。
-I 在覆盖之前询问用户。
5.4、文件压缩和解压缩
5.4.1、图形化压缩和解压缩
图形化压缩和解压缩和 Windows 下基本一样,在要压缩或者解压的文件上点击鼠标右键,然后选择要进行的操作,我们先讲解一下如何进行文件的压缩。首先找到要压缩的文件,然后在要压缩的文件上点击鼠标右键,选择“压缩”选项
可以选择的压缩格式还是有很多的,挑选一个格式进行压缩,比如我选择的“.zip”这个格式,
上面就是使用图形化进行文件压缩的过程,我们接下来对刚刚压缩的 test.txt.zip 进行解压缩,鼠标放到 test.txt.zip 上然后点击鼠标右键,选择“提取到此处”
点击图中的“提取到此处”以后,系统就会自动进行解压缩,上面就是在 Ubuntu 中使用图形化工具进行文件的压缩和解压缩。
5.4.2、命令行进行文件的压缩和解压缩
我们后面的开发中所有涉及到压缩和解压缩的操作都在命令行下完成的。是命令行下进行压缩和解压缩常用的命令有三个:zip、unzip 和 tar,我们依次来学习:
5.4.3、命令 zip
zip 命令看名字就知道是针对.zip 文件的,用于将一个或者多个文件压缩成一个.zip 结尾的
文件,命令格式如下:
zip [参数] [压缩文件名.zip] [被压缩的文件]
主要参数函数如下:
-b< 工作目录> 指定暂时存放文件的目录。
-d 从 zip 文件中删除一个文件。
-F 尝试修复已经损毁的压缩文件。
-g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。
-h 帮助。
-j 只保存文件的名,不保存目录。
-m 压缩完成以后删除源文件。
-n< 字尾符号> 不压缩特定扩展名的文件。
-q 不显示压缩命令执行过程。
-r 递归压缩,将指定目录下的所有文件和子目录一起压缩。
-v 显示指令执行过程。
-num 压缩率,为 1~9 的数值。
5.4.4、命令 unzip
unzip 命令用于对.zip 格式的压缩包进行解压,命令格式如下:
unzip [参数] [压缩文件名.zip]
主要参数如下:
-l 显示压缩文件内所包含的文件。
-t 检查压缩文件是否损坏,但不解压。
-v 显示命令显示的执行过程。
-Z 只显示压缩文件的注解。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中的原有目录路径。
-L 将压缩文件中的全部文件名改为小写。
-n 解压缩时不要覆盖原有文件。
-P< 密码> 解压密码。
-q 静默执行,不显示任何信息。
-x< 文件列表> 指定不要处理.zip 中的哪些文件。
-d< 目录> 把压缩文件解到指定目录下。
5.4.5、命令 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 压缩。
我们使用如下两个命令将 test1 文件夹压缩为.bz2 和.gz 这两个格式:
tar -vcjf test1.tar.bz2 test1
tar -vczf test1.tar.gz test1
在上面两行命令中,-vcjf 表示创建 bz2 格式的压缩文件,-vczf 表示创建.gz 格式的压缩文件。
我们使用如下所示两行命令完成.bz2 和.gz 格式文件的解压缩:
tar -vxjf test1.tar.bz2
tar -vxzf test2.tar.gz
上述两行命令中,-vxjf 用来完成.bz2 格式压缩文件的解压,-vxzf 用来完成.gz 格式压缩文件的解压。关于 Ubuntu 下的命令行压缩和解压缩就讲解到这里,重点是 tar 命令,要熟练掌握使用 tar 命令来完成.bz2 和.gz 格式的文件压缩和解压缩。
5.5、文件查询和搜索
文件的查询和搜索也是最常用的操作,在嵌入式 Linux 开发中常常需要在 Linux 源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等。本节我们就讲解两个最常用的文件查询和搜索命令:find 和 grep。
5.5.1、命令 find
find 命令用于在目录结构中查找文件,其命令格式如下:
find [路径] [参数] [关键字]
路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部分,主要参数如下:
-name<filename> 按照文件名称查找,查找与 filename 匹配的文件,可使用通配符。
-depth 从指定目录下的最深层的子目录开始查找。
-gid< 群组识别码> 查找符合指定的群组识别码的文件或目录。
-group< 群组名称> 查找符合指定的群组名称的文件或目录。
-size< 文件大小> 查找符合指定文件大小的文件。
-type< 文件类型> 查找符合指定文件类型的文件。
-user< 拥有者名称> 查找符合指定的拥有者名称的文件或目录。
5.5.2、命令 grep
find 命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字,grep 就是完成这个功能的,grep 命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指定的关键字,grep 命令就会把包含指定关键字的这一行标记出来,grep 命令格式如下:
grep [参数] 关键字 文件列表
grep 命令一次只能查一个关键字,主要参数如下:
-b 在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号。
-c 计算符合关键字的列数。
-d< 进行动作> 当指定要查找的是目录而非文件时,必须使用此参数!否则 grep 指令将回报信息并停止搜索。
-i 忽略字符大小写。
-v 反转查找,只显示不匹配的行。
-r 在指定目录中递归查找。
比如我们在目录/usr 下递归查找包含字符“Ubuntu”的文件,操作如图所示:
5.6、文件类型
这里的文件类型不是说这个文件是音乐文件还是文本文件,在用户根目录下使用命令“ls -l”来查看用户根目录下所有文件的详细信息,如图所示:
每个文件的详细信息占一行,每行最前面都是一个符号就标记了当前文
件类型,比如 linux 的第一个字符是“d”,test.txt 文件第一个字符是“-”。这些字符表示
的文件类型如下:
- 普通文件,一些应用程序创建的,比如文档、图片、音乐等等。
d 目录文件。
c 字符设备文件,Linux 驱动里面的字符设备驱动,比如串口设备,音频设备等。
b 块设备文件,存储设备驱动,比如硬盘,U 盘等。
l 符号连接文件,相当于 Windwos 下的快捷方式。
s 套接字文件。
p 管道文件,主要指 FIFO 文件。
我们后面学习 Linux 驱动开发的时候基本是在和字符设备文件和块设备文件打交道。
6、Linux用户权限管理
6.1、Ubuntu用户系统
Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性保护。
我们前面在安装 Ubuntu 系统的时候被要求创建一个账户,当我们创建好账号以后,系统会在目录/home 下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件文件夹中。同样的,创建其它用户账号的时候也会在目录/home 下生成一个文件夹来存储该用户的文件,图 2.7.1.1 就是我的电脑上“hanhui”这个账户的文件夹。
装系统的时候创建的用户其权限比后面创建的用户大一点,但是没有 root 用户权限大,Ubuntu 下用户类型分为以下 3 类:
● 初次创建的用户,此用户可以完成比普通用户更多的功能。
● root 用户,系统管理员,系统中的玉皇大帝,拥有至高无上的权利。
● 普通用户,安装完操作系统以后被创建的用户。
以上三种用户,每个用户都有一个 ID 号,称为 UID,操作系统通过 UID 来识别是哪个用户,用户相关信息可以在文件/etc/passwd 中查看到,如图所示:
从配置文件 passwd 中可以看到,每个用户名后面都有两个数字,比如用户“hanhui”后面“1000:1000”,第一个数字是用户的 ID,另一个是用户的 GID,也就是用户组 ID。Ubuntu里面每个用户都属于一个用户组里面,用户组就是一组有相同属性的用户集合。
6.2、权限管理
在使用 Windows 的时候我们很少接触到用户权限,最多就是打开某个软件出问题的时候会选择以“管理员身份”打开。Ubuntu 下我们会常跟用户权限打交道,权限就是用户对于系统资源的使用限制情况,root 用户拥有最大的权限,可以为所欲为,装系统的时候创建的用户拥有root 用户的部分权限,其它普通用户的权限最低。对于我们做嵌入式开发的人一般不关注用户的权限问题,因为嵌入式基本是单用户,做嵌入式开发重点关注的是文件的权限问题。
对于一个文件通常有三种权限:读(r)、写(w)和执行(x),使用命令“ls -l”可以查看某个目录下所有文件的权限信息,如图 所示:
在图中我们以文件 test.txt 为例讲解,文件 test.txt 文件信息如下:
-rw-rw-r-- 1 hanhui hanhui 47 8月 28 15:10 test.txt
其中“-rw-rw-r--”表示文件权限与用户和用户组之间的关系,第一位表示文件类型,上一小节已经说了。剩下的 9 位以 3 位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组的权限以及其它用户权限。后面的“hanhui hanhui”分别代表文件拥有者(用户)和该用户所在的用户组,因此文件 test.txt 的权限情况如下:
①、文件 test.txt 的拥有者是用户 hanhui,其对文件 test.txt 的权限是“rw-”,也就是对该文件拥有读和写两种权限。
②、用户 hanhui所在的用户组也叫做 hanhui,其组内用户对于文件 test.txt 的权限是“rw-”,也是拥有读和写这两种权限。
③、其它用户对于文件 test.txt 的权限是“r--”,也就是只读权限。
对于文件,可读权限表示可以打开查看文件内容,可写权限表示可以对文件进行修改,可执行权限就是可以运行此文件(如果是软件的话)。对于文件夹,拥有可读权限才可以使用命令 ls查看文件夹中的内容,拥有可执行权限才能进入到文件夹内部。
如果某个用户对某个文件不具有相应的权限的话就不能进行相应的操作,比如根目录“/”下的文件只有 root 用户才有权限进行修改,如果以普通用户去修改的话就会提示没有权限。比如我们要在根目录“/” 创建一个文件 mytest,使用命令“touch mytest”,结果如图所示:
我以用户“hanhui”在根目录“/”创建文件 mytest,结果提示我无法创建“mytest”,因为权限不够,因为只有 root 用户才能在根目录“/”下创建文件。我们可以使用命令“sudo”命令暂时切换到 root 用户,这样就可以在根目录“/”下创建文件 mytest 了,如图所示:
在图中我们使用命令“sudo”以后就可以在根目录“/”创建文件 mytest,在进行其它的操作的时候,遇到提示权限不够的时候都可以使用 sudo 命令暂时以 root 用户身份去执行。
上面我们讲了,文件的权限有三种:读(r)、写(w)和执行(x),除了用 r、w 和 x 表示以外,我们也可以使用二进制数表示,三种权限就可以使用 3 位二进制数来表示,一种权限对应一个二进制位,如果该位为 1 就表示具备此权限,如果该位为 0 就表示没不具备此权限,如表所示:
如果做过单片机开发的话,就会发现和单片机里面的寄存器位一样,将三种权限 r、w 和 x进行不同的组合,即可得到不同的二进制数和八进制数,3 位权限可以组出 8 种不同的权限组合,如表 所示:
表中权限所对应的八进制数字就是每个权限对应的位相加,比如权限 rwx 就是4+2+1=7。前面的文件 test.c 其权限为“rw-rw-r--”,因此其十进制表示就是:664。
另外我们也开始使用 a、u、g 和 o 表示文件的归属关系,用=、+和-表示文件权限的变化,如表所示:
对于文件 test.txt,我们想要修改其归属用户(hanhui)对其拥有可执行权限,那么就可以使用:u+x。如果希望设置归属用户及其所在的用户组都对其拥有可执行权限就可以使用:gu+x。
6.3、权限管理命令
我们也可以使用 Shell 来操作文件的权限管理,主要用到“chmod”和“chown”这两个命
令,我们一个一个来看。
6.3.1、权限修改命令 chmod
命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使
用字母表示,命令格式如下:
chmod [参数] [文件名/目录名]
主要参数如下:
-c 效果类似“-v”参数,但仅回显更改的部分。
-f 不显示错误信息。
-R 递归处理,指定目录下的所有文件及其子文件目录一起处理。
-v 显示指令的执行过程。
我们先来学习以下如何使用命令“chmod”修改一个文件的权限,在用户根目录下创建一个文件 test,然后查看其默认权限,操作如图所示:
在图中我们创建了一个文件:test,这个文件的默认权限为“rw-rw-r--”,我们将其权限改为“rwxrw-rw”,对应数字就是 766,操作如下:
在图中,修改文件 test 的权限为 766,修改完成以后的 test 文件权限为“rwxrw-rw-”,和我们设置的一样,说明权限修改成功。
上面我们是通过数字来修改权限的,我们接下来使用字母来修改权限,操作如图所示:
上面两个例子都是修改文件的权限,接下来我们修改文件夹的权限,新建一个 test 文件夹,在文件夹 test 里面创建 a.c、b.c 和 c.c 三个文件,如图 所示:
在图 中 test 文件夹下的文件 a.c、b.c 和 c.c 的权限均为“rw-rw-r--”,我们将 test 文件夹下的所有文件权限都改为“rwxrwxrwx”,也就是数字 777,操作如图所示:
6.3.2、文件归属者修改命令 chown
命令 chown 用来修改某个文件或者目录的归属者用户或者用户组,命令格式如下:
chown [参数] [用户名.<组名>] [文件名/目录]
其中[用户名.<组名>]表示要将文件或者目录改为哪一个用户或者用户组,用户名和组名用“.”隔开,其中用户名和组名中的任何一个都可以省略,命令主要参数如下:
-c 效果同-v 类似,但仅回报更改的部分。
-f 不显示错误信息。
-h 只对符号连接的文件做修改,不改动其它任何相关的文件。
-R 递归处理,将指定的目录下的所有文件和子目录一起处理。
-v 显示处理过程。
在用户根目录下创建一个 test 文件,查看其文件夹所属用户和用户组,如图 所示:
从图中可以看出,文件test的归属用户为zuozhongkai,所属的用户组为zuozhongkai,将文件 test 归属用户改为 root 用户,所属的用户组也改为 root,操作如图所示:
命令 shown 同样也可以递归处理来修改文件夹的归属用户和用户组,用法和命令 chown 一样,这里就不演示了。
7、Linux磁盘管理
7.1、Linux 磁盘管理基本概念
Linux 的磁盘管理体系和 Windows 有很大的区别,在 Windows 下经常会遇到“分区”这个概念,在 Linux 中一般不叫“分区”而叫“挂载点”。 “挂载点”就是将一个硬盘的一部分做成文件夹的形式,这个文件夹的名字就是“挂载点”,不管在哪个发行版的 Linux 中,用户是绝对看到不到 C 盘、D 盘这样的概念的,只能看到以文件夹形式存在的“挂载点”.
文件/etc/fstab 详细的记录了 Ubuntu 中硬盘分区的情况,如图所示:
在图中有一行“/ was on /dev/sda1 during installation”,意思是根目录“/”是在/dev/sda1上的,其中“/”是挂载点,“/dev/sda1”就是我们装 Ubuntu 系统的硬盘。由于我们的系统是安装在虚拟机中的,因此图没有出现实际的硬盘。可以通过如下命令查看当前系统中的磁盘:
ls /dev/sd*
上述命令就是打印出所有以/dev/sd 开头的设备文件,如图所示:
在图有四个磁盘设备文件,其中 sd 表示是 SATA 硬盘或者其它外部设备,最后面的数字表示该硬盘上的第 n 个分区,比如/dev/sda1 就表示磁盘 sda 上的第一个分区。图中都是以/dev/sda 开头的,说明当前只有一个硬盘。如果再插上 U 盘、SD 卡啥的就可能会出现/dev/sdb,/dev/sdc 等等。如果你的 U 盘有两个分区那么可能就会出现/dev/sdb1、dev/sdb2 这样的设备文件。比如我现在插入我的 U 盘,插入 U 盘会提示 U 盘是接到主机还是虚拟机,如图所示:
设置好图以后,点击“确定”按钮 U 盘就会自动连接到虚拟机中,也就是连接到Ubuntu 系统中,我们再次使用命令“ls /dev/sd*”来查看当前的“/dev/sd*”设备文件,如图所示:
从图可以看出,相比图多了/dev/sdb 和/dev/sdb1 这两个文件,其中/dev/sdb就是 U 盘文件,/dev/sdb1 表示 U 盘的第一个分区,因为我的 U 盘就一个分区。
7.2、磁盘管理命令
7.2.1、磁盘分区命令 fdisk
如果要对某个磁盘进行分区,可以使用命令 fdisk,命令格如下:
fdisk [参数]
主要参数如下:
-b< 分区大小> 指定每个分区的大小。
-l 列出指定设备的分区表。
-s< 分区编号> 将指定的分区大小输出到标准的输出上,单位为块。
-u 搭配“-l”参数,会用分区数目取代柱面数目,来表示每个分区的起始地址。
比如我要对 U 盘进行分区,千万不要对自己装 Ubuntu 系统进行分区!!!可以使用如下命令:
sudo fdisk /dev/sdb
在图中提示我们输入“m”可以查看帮助,因为 fdisk 还有一些字命令,通过输入“m”可以查看都有哪些子命令,如图 所示:
p 显示现有的分区
n 建立新分区
t 更改分区类型
d 删除现有的分区
a 更改分区启动标志
w 对分区的更改写入到硬盘或者存储器中。
q 不保存退出。
由于我的 U 盘里面还有一些重要的文件,所以不能现在不能进行分区,所以现在就不演示fdisk 的分区操作了。
7.2.2、格式化命令 mkfs
使用命令 fdisk 创建好一个分区以后,我们需要对其格式化,也就是在这个分区上创建一个文件系统,Linux 下的格式化命令为 mkfs,命令格式如下:
mkfs [参数] [-t 文件系统类型] [分区名称]
主要参数如下:
fs 指定建立文件系统时的参数
-V 显示版本信息和简要的使用方法。
-v 显示版本信息和详细的使用方法。
比如我们要格式化 U 盘的分区/dev/sdb1 为 FAT 格式,那么就可以使用如下命令:
mkfs –t vfat /dev/sdb1
7.2.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 文件夹里面,操作如图所示:
在图 中我们将 U 盘以 fat 格式挂载到目录/mnt/tmp 中,然后我们就可以通过访问/mnt/tmp 来访问 U 盘了。
7.2.4、卸载命令 umount
当我们不在需要访问已经挂载的 U 盘,可以通过 umount 将其从卸载点卸除,命令格式如下:
umount [参数] -t [文件系统类型] [设备名称]
-a 卸载/etc/mtab 中的所有文件系统。
-h 显示帮助。
-n 卸载时不要将信息存入到/etc/mtab 文件中
-r 如果无法成功卸载,则尝试以只读的方式重新挂载。
-t< 文件系统类型> 仅卸载选项中指定的文件系统。
-v 显示执行过程。
上面我们将 U 盘挂载到了文件夹/mnt/tmp 里面,这里我们使用命令 umount 将其卸载掉,操作如图所示:
在图中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。