文章目录
对于刚开始接触嵌入式 Linux 的小伙伴来说,Linux 操作系统的强大和复杂性可能会让人感到有些望而却步。然而,掌握一些基本的知识点和常用命令,可以大大提高学习和使用 Linux 的效率,使你更快地适应这个广泛应用于嵌入式系统的操作平台。
本文将结合我个人学习 Linux 系统编程和驱动开发时的个人心得,介绍学习嵌入式 Linux 时必知必会的 X 个知识点,帮助刚刚接触 Linux 系统的萌新小伙伴,快速熟悉 Linux 系统。
一、Linux 系统与 Windows 系统的差别
大多数小伙伴在接触 Linux 系统之前,在 PC 端用过的操作系统基本都是 Windows 系统。根据市调机构 Statcounter 公布的最新统计报告,使用 Windous 系统的 PC 端占全球所有 PC 端的 72.81%,而使用 Linux 系统作为自己电脑操作系统的只有 4.05%。
可见,Linux 系统市占率也说明了大部分人的时候是接触不到 Linux 系统的(其实也有,主要体现在移动端的 Android 系统,不过与 Linux 还是有些区别)。当然,这并不会影响我们学习 Linux 系统,我们可以通过类比 Windows 系统的办法来学习 Linux 系统。
那么 Linux 系统与 Windows 系统到底有什么差别呢?
讨论 Linux 系统与 Windows 系统之间的主要差别,可以从多个角度来分析,包括设计理念、架构、用户界面等方面。当然,这些对于还没正式学习 Linux 系统开发的萌新来说都不是最重要的。
以嵌入式领域最常见的 Ubuntu 系统为例,从我个人初学 Linux 的角度来看,最大的不同在于目录(这里说的目录,其实是指文件夹)。对于 Windows 系统来说,打开 “我的电脑” 或 “此电脑”,看到的不同盘符。而 Linux 系统没有盘符的概念,以树状结构表示文件夹与文件。
[!NOTE]
如果你用过 Android 手机,你会发现 Ubuntu 系统的界面跟 Android 系统出奇的相似,主要这两个操作系统的内核都是 Linux 内核,在 Android 系统的手机也没有分盘符的情况。
在 Windows 系统下,文件或文件夹的路径从盘符开始,比如:“C:\XXX\XXX\hello.txt”,这是在 C 盘的 XXX 目录下,有 XXX 子目录,而 XXX 中有 hello.txt 这个文件。从路径就可以知道,文件在哪个分区。
在 Linux 系统下,文件或文件夹的路径从根目录开始,比如:“/XXX/XXX/hello.txt”(注意斜杠的方向,Windows 系统用的正斜杠(\),Linux 用的是反斜杠(/)),这表示在根目录下有 XXX 子目录,而 XXX 下又有 XXX 目录,XXX 中有 hello.txt 文件。从路径上是无法得知文件在磁盘的哪个分区。
主要对于普通用户来说,使用 Linux 系统是不需要关心分区、盘符等问题的,我们只需要知道哪个目录存放什么就可以了。
另一个差别就是,学习 Linux 系统编程基本不用图形界面,用的全是命令行终端。这对于使用惯图形界面的 Windows 用户来说,需要一定时间适应。
一般情况下,Linux 同一版本的发行版都会有 Desktop 和 Server 两个版本。Server 版本是没有图形界面的,相较于带有图形界面的 Desktop 版本而言,Server 版本系统安装包都小非常多。Server 版本主要用在服务器或者一些不需要显示器的嵌入式设备上,没有图形界面的操作系统,就只能纯靠命令行的方式操作了。而 Desktop 版本的系统,不仅有图形界面,还保留了命令行的操作方式。
那么,Linux 系统的开发者为什么偏爱命令行,而不使用图形界面呢?
并不是因为有些设备和服务器没有图形界面,才使 Linux 系统的开发者才不得不使用命令行(虽然这也是原因之一,但不是最主要的),而是命令行有其独特的优点,主要集中在效率、精确和灵活性上。
首先是效率和速度,命令行操作往往比图形界面更快,因为命令行不需要加载额外的图形界面组件,消耗更少的系统资源。对于批量处理任务和脚本编写,命令行提供了强大的自动化能力,可以高效地完成大量重复工作。如果是通过 SSH 等协议进行远程管理时,即使设备有图形界面,开发者依然会使用命令行操作,图形界面太消耗系统资源了。
其次是精确控制,命令行允许用户对系统进行非常细致的控制,可以执行复杂的操作,如文件系统管理、进程监控、网络配置等。图形界面通常提供的是更通用的用户界面,而命令行可以调用底层系统功能,实现更深入的系统管理。
最后是可移植性和灵活性,命令行工具通常具有更好的跨平台兼容性,可以在不同类型的系统上运行。命令行程序的输出可以很容易地被其他程序读取和解析,方便数据处理和脚本编写。
另外,对于系统管理员和技术人员来说,掌握命令行是基本技能之一,它可以帮助他们更好地理解系统内部运作。学习命令行可以提高解决问题的能力,因为很多系统日志和错误信息都是文本形式,通过命令行阅读和分析更加直接。
二、Linux 命令行初识
第一次接触命令行,一定会有很多东西不知道是什么意思,下面将以 Ubuntu22.04 为例,说明命令行界面、各种路径的含义和常用的命令。
1. 终端界面
进入 Linux 系统后,可以通过按组合快捷键 Ctrl + Alt + t
打开终端。
[!NOTE]
打开终端的方法还有很多,可以用鼠标点击界面的左下角的
Show Applications
,找到并点击Terminal
打开终端。不过,摆脱鼠标是学习 Linux 的第一步,还是推荐使用快捷键。
打开后的终端如下图:
[!NOTE]
普通用户和 root 用户有什么区别呢?
普通用户和 root 用户在权限级别、安全性、系统操作和系统管理方面存在显著区别。普通用户拥有有限的权限,有助于保护系统的安全性,而 root 用户拥有最高权限,可以进行任何系统级操作,但需谨慎使用,以避免误操作导致的严重后果。理解这些区别有助于在 Linux 系统中合理分配和使用权限,确保系统的稳定和安全。
2. 路径的含义
相信很多萌新第一次听到什么绝对路径、相对路径、家目录等新名词都不知是什么意思,下面就盘点几个常见的路径含义:
绝对路径(Absolute Path):绝对路径是从根目录(/)开始,指向一个文件或目录的完整路径。它始终以根目录符号
/
开头。例如:/home/user/documents/file.txt
,这个路径指向root
目录下的home
目录中的user
目录,再到documents
目录,最后到file.txt
文件。相对路径(Relative Path):相对路径是从当前工作目录开始,指向一个文件或目录的路径。它不以
/
开头,而是根据当前所在的目录进行导航。例如:如果当前工作目录是/home/user
,那么./documents/file.txt
是相对路径,其中的.
就是当前目录的意思,指向/home/user/
,整个路径指向/home/user/documents/file.txt
。~
(Tilde):波浪号~
表示当前用户的主目录。例如:~/documents
表示/home/username/documents
,其中username
是当前登录用户的用户名。/
(Slash):斜杠/
有两种主要用法:- 作为根目录:
/
表示文件系统的根目录,是所有目录的起点。 - 作为目录分隔符:在路径中用来分隔不同的目录和文件名。
例如:
/home/user/documents
中的除第一个/
表示根目录之外,后面每一个/
都用于分隔不同的目录。- 作为根目录:
.
(Dot):前面解释相对路径的时候提到过,一个点.
表示当前目录。例如:./script.sh
表示当前目录中的script.sh
文件。.
常用于运行当前目录下的可执行文件或脚本。..
(Double Dot):两个点..
表示上一级目录。例如:../script.sh
表示执行当前目录的上一级目录中的script.sh
脚本文件。
以更具体的例子说明一下,假设当前工作目录是/home/user
:
- 绝对路径:
/etc/passwd
指向根目录下的etc
目录中的passwd
文件。 - 相对路径:
documents/report.txt
指向/home/user/documents/report.txt
。 ~
:~/documents
指向/home/user/documents
。/
:/var/log
指向根目录下的var
目录中的log
目录。.
:./script.sh
指向当前目录/home/user
中的script.sh
文件。..
:../admin
指向上一级目录/home
中的admin
目录。
通过理解这些基本概念,可以更有效地在 Linux 文件系统中导航和操作文件与目录。
3. 命令结构说明
初学 Linux 时,掌握一些常用命令可以更有效地使用和管理系统。在学习 Linux 命令之前,需要了解一下 Linux 命令有哪些部分组成,如下图:
关于 Linux 命令行的说明有如下几点:
- Linux 命令行通常有三部分组成,分别是命令、选项、参数,三者之间用空格(两两之间的空格没有数量限制)隔开,其中每条命令行的命令通常只有一个,选项和参数可以有多个,多个选项和参数也需要用空格隔开;
- 上图中的选项和参数被
[]
包裹,表示这两项不是必需的,如果命令中的选项或者参数被<>
包裹,则表示必须加上某个选项或某个参数; - 选项前要加上
-
,参数不需要; - 输入完整的命令行后,按下回车
Enter
执行命令。
4. 常见的 Linux 命令
4-1. 文件和目录操作
ls - 列出目录内容
ls ls [directory]
ls
命令全称为 list,如下图所示,执行ls
命令可以列出当前所在目录的文件夹和文件(仅显示可见文件夹和文件,隐藏文件夹和文件不显示),也可以在ls
命令后加上其他文件夹,将列出该文件夹里的子文件夹和文件。如果要显示更加详细的信息,可以加上
-l
选项:如果要显示所有文件夹和文件(包含隐藏文件夹和文件),可以加上
-a
选项:选项之间也可以组合使用,例如我现在要查看
C_Pro
文件夹的全部文件夹和文件,并且要详细信息,则命令有两种写法,如下:ls -a -l C_Pro ls -al C_Pro
如下图所示,为两条命令的执行效果,效果完全一致:
cd - 改变目录
cd /path/to/directory # 切换到指定目录 cd ~ # 切换到当前用户的主目录 cd .. # 切换到上一级目录
cd
命令取自 change directory 的首字母,意思是改变目录,在 Linux 命令行中,主要用于切换到其他的目录去。 例如,当前处在主目录上,要进入该目录下的C_Pro
文件夹,可以执行cd C_Pro
:回到上一级目录可以执行
cd ..
,当然,由于C_Pro
的上一级目录是主目录,也可以单独执行cd
:[!NOTE]
在任意路径下,直接执行
cd
命令(不带参数),都是直接回到主目录。此外,在任意路径下进入主目录还可以执行cd ~
和cd /home/<username>
。前面提过,~
表示主目录,而/home/<username>
则是以绝对路径的方式进入主目录,其中<username>
是当前的用户名。cd
命令是可以一次性跨过多个目录进入目标目录的。例如,当前处于C_Pro
目录下,假设要切换到根目录的tmp
,除了执行cd /tmp
,还可以执行cd ../../../tmp
,如下图:[!NOTE]
连续三个
..
都是相对的上一级目录,第一个..
表示C_Pro
上一级,也就是主目录;第二个..
是主目录的上一级,即/home
目录;第三个..
是/home
的上一级,即根目录;然后在根目录下找到tmp
并进入。pwd - 显示当前工作目录
pwd
pwd
命令是取自 print working directory 的首字母,用于显示出当前的路径,路径以绝对路径的方式显示。mkdir - 创建目录(创建文件夹)
mkdir <directory_name> mkdir -p /path/to/directory # 递归创建目录
mkdir
命令全称为 make directory,即创建目录。例如,在当前目录下创建一个temp
文件夹:如果创建一个文件夹的同时,再该文件夹里再创建一个子文件夹,则需要加上
-p
选项。例如,创建abc
文件夹的同时,再abc
文件夹里还要创建123
文件夹,则可以执行mkdir -p abc/123
:rmdir - 删除空目录
rmdir directory_name
rmdir
命令全称为 remove directory,即删除目录,但只能删除空目录。例如,前面创建一个temp
文件夹,该文件夹目前为空文件夹,则可以执行rmdir temp
删除:同理,前面递归创建
abc/123/
文件夹时,加上-p
选项,删除文件夹及其子文件夹也可以加上这个选项(所有子文件夹都不能有文件):rm - 删除文件或目录
rm file_name rm -r directory_name # 递归删除目录及其内容 rm -f file_name # 强制删除文件
rm
命令全称为 remove,用于删除文件或者目录。例如,删除当前文件夹下的123.txt
文件:前面提到的
rmdir
命令,只能删除空文件夹,如果文件夹里其他文件,则是无法删除的。如果要删除整个文件夹(包含里面所有的子文件夹和文件),可以用rm
命令加上-r
选项,来进行递归删除:[!CAUTION]
rm
命令加上-rf
选项,经常被人们拿到网上玩梗,经常被人们调侃成跑路神器,也有人拿去逗刚刚学习 Linxu 的新手。尤其是rm -rf /
是一个危险且具有破坏性的命令,如果你在 Linux 终端执行了rm -rf /
或者rm -rf /*
命令,且刚好是 root 用户,则会删除 Linux 根目录下的所有文件,直接导致系统瘫痪,新手不要轻易尝试。cp - 复制文件或目录
cp source_file destination_file cp -r source_directory destination_directory # 递归复制目录
cp
命令全称为 copy,用于复制文件或者目录。例如,将当前文件夹下的color.sh
文件复制到C_Pro
文件夹中:使用
cp
命令复制文件时,还可以对复制后的文件进行重命名。例如,我们在写一个贪食蛇小游戏的项目,现在需要在原来的程序上添加一些其他功能,但又不想破坏之前写过的程序,就可以在复制的时候重命名文件。比如,源文件为snake.c
,执行cp snake.c snake2.c
后,可以得到与snake.c
内容一样的snake2.c
文件(前期没学过 git 进行版本控制,新手都是这样玩的):此外,
cp
命令还可以复制文件夹,只需要加上-r
选项即可。例如,把当前路径的snake
文件夹在复制一个作为备份,并把备份命名为snake_bak
:mv - 移动或重命名文件或目录
mv old_name new_name mv /path/to/source /path/to/destination
mv
命令全称 move,作用是移动文件或文件夹,相当于 Windows 系统中的剪切操作。与剪切不同的是,mv
还可以进行重命名操作。例如,把当前目录下的baidu
重命名为a.out
:mv
命令还可以移动文件夹。例如,把snake
文件夹移动到上一级目录的CPP_Pro
里:touch - 创建文件
touch <filenanme>
touch
命令本意是 “触碰” 或 “接触”,新手初学时可能也不太明白,创建文件为什么要用touch
这个单词。其实,touch
命令有两个作用:一是用于修改文件或目录的时间属性,包括存取时间和更改时间;二是建立一个新的文件。前者的前提是文件已经存在,否则作用就是后者。作为新手,只要知道该命令用于创建文件即可。例如,在当前目录创建一个名为
a.c
的文件:如果对已经存在的文件,进行
touch
命令,则是修改时间属性,例如:
4-2. 网络相关命令
ping - 测试网络连通性
ping www.baidu.com ping 192.168.0.1
ping
命令一般用于测试网络的连通性,也可以测试同一局域网下,哪些 IP 是否在线。ifconfig - 显示或配置网络接口(现代系统中推荐使用
ip
命令)ifconfig
ifconfig
命令不是 Linux 自带的命令,需要通过安装网络工具才可以使用。如果没用安装工具,系统也会提示,如下:按提示输入对应的命令进行安装即可。
再次输入
ifconfig
:ip - 显示或配置网络接口
ip addr show ip link show
如果不安装网络工具,也可以查看 IP 地址,执行
ip addr show
即可:
5. 使用命令行时的小技巧
5-1. 使用 TAB
键补全
刚刚接触 Linux 系统时,很多新手觉得打命令行很浪费时间,尤其是遇到命令或者文件名很长的时候,要打完全部很麻烦,而且也很容易出错。其实,Linux 系统是自带命令和文件名补全功能的,很多时候是不需要输入完整的命令或者文件名,靠自动补全功能就可以很高效地完成命令的执行了。在 Linux 系统中,使用 TAB
键进行补全是一个非常方便且强大的功能,可以显著提高命令行操作的效率。以下是关于 TAB
键补全的一些详细说明和使用示例:
文件和目录补全:
当你输入部分文件或目录名称后,按
TAB
键可以自动补全。如果存在多个匹配项,按TAB
键两次会列出所有可能的补全选项。cd /ho<TAB> # 自动补全为: cd /home/
如果
/home/
目录下有多个子目录,比如user1
和user2
,输入/home/u<TAB>
后会补全至/home/user
,再次按TAB
会列出/home/user1
和/home/user2
。命令补全:
当你输入部分命令名称后,按
TAB
键可以自动补全。如果存在多个匹配的命令,按TAB
键两次会列出所有可能的命令。sudo apt-g<TAB> # 自动补全为: sudo apt-get
5-2. 巧用通配符 *
在 Linux 命令行中,通配符 *
(星号)是一个非常好用的工具,它可以匹配多个字符。巧用通配符可以显著简化文件操作、查找和管理任务。
例如,当前目录为 C_Pro
文件夹,里面混杂着很多文件类型的文件,而现在只需要显示以 .c
结尾的文件时,可以执行:
ls *.c
效果如下图,最终只会显示扩展名为 .c
的文件。
同样在这个文件夹下,如果我要搜出文件名里带有字母 b
的文件,可以执行下面的命令:
ls *b*
执行结果如下:
通配符在删除文件名相似的文件时,也非常好用,如下图所示,删除除了 1.c
之外的所有缓存文件。
关于通配符还有很多用法,这里不一一展示,后面有机会再总结一篇与通配符用法相关的博客。
5-3. 命令行历史功能
除了用 TAB
键补全命令可以提高效率,在 Linux 命令行中,使用命令历史功能也可以极大地提高效率。其中,最基本的操作就是上下键,上箭头键 (↑
) 可以显示之前执行的命令,下箭头键 (↓
):显示之后的命令,通常在使用上箭头键浏览历史记录后使用。翻找历史命令后,可以按回车执行命令。
此外,用双感叹号 !!
也可以再执行一次上一个命令:
篇幅问题,还有其他使用命令历史功能这里暂时不讲。
三、文件的详细信息
前面提过,执行 ls -l
命令会显示目录内容的详细列表,每行一个文件或目录,并包含多个字段。那么,这些信息到底是什么意思呢?
以下图为例,该命令列出的详细信息大致可分为八个组成部分,下面一一解释这八个部分的具体意思。
total 行(首行)
total
表示目录中所有文件和子目录的块大小总和。在文件系统中,文件和目录的大小是以块(block)为单位来表示的。一个块通常是 1KB,但也可能是其他大小(如 4KB),这取决于文件系统的配置。上图的系统为 Ubuntu22.04 ,其默认使用的文件系统通常是 ext4。在较新的 Linux 发行版和安装过程中,为了优化性能和磁盘空间的利用,ext4 文件系统的默认块大小通常是 4KB(即 4096 字节)。因此,
total 68
的含义就是该文件夹占了 68 个块,每个块 4KB,即整个文件夹大小为 68 * 4KB = 272KB。不过,我们只能说这个文件占了 68 个块,不能精确地说它占了 272 字节,因为文件系统在存储文件时,会分配一个或多个块给每个文件。
例如,一个文件大小为 5678 字节,如果一个块大小为 1024 字节,那么这个文件会占用:
ceil(5678 / 1024) = ceil(5.55) = 6块
文件类型和权限(第 1 列)
由于文件较多,我只列出其中一部分的第 1 列信息:
-rw-rw-r-- drwxrwxr-x -rw-rw-r-- -rwxrwxr-x
可以发现,每行的第 1 列信息都是有 10 个字符,可以分成两部分:第 1 个字符和后面的 9 个字符。
第 1 个字符表示文件类型:
-
:普通文件d
:目录l
:符号链接c
:字符设备文件b
:块设备文件p
:管道文件s
:套接字文件
后面的 9 个字符表示文件权限,每 3 个字符一组,分别表示所有者、组和其他用户的权限:
r
:读权限w
:写权限x
:执行权限-
:无权限示例:
drwxr-xr-x
d
:目录rwx
:所有者拥有可读、可写、可执行三个权限r-x
:同组的用户拥有可读和可执行的权限,不可写r-x
:其他用户拥有可读和可执行的权限,不可写
硬链接数(第 2 列)
表示文件或目录的硬链接数量。对于目录,这个数字包括它本身、它的父目录(…)和它包含的每个子目录的父目录(…)。
对于初学者来说,可以暂时不用在于这个信息。
所有者(第 3 列)
表示文件或目录的所有者,即用户名称(user)。以上图中的
grayson
为例,即grayson
是这个文件或目录的用户。组(第 4 列)
表示文件或目录所属的组,即组名称(group)。以上图中的
grayson
为例,即grayson
是这个文件或目录的用户所在的组。文件大小(第 5 列)
表示文件的大小,以字节(B)为单位。对于目录,表示目录内容的大小。
最后修改时间(第 6 到第 8 列)
表示文件或目录的最后修改时间,包括月份、日期和时间。年份会显示在较旧的文件中。
文件名(第 9 列)
这个没什么好说的,就是文件或目录的名称。
通过理解这些字段的含义,可以更好地管理和操作 Linux 文件系统,也对后续学习 Linux 系统编程更有帮助。
四、Linux 系统根目录各文件夹的含义
在 Linux 系统中,根目录(/)是整个文件系统的起点,也是所有文件和目录的根节点。无论使用的是哪个 Linux 的发行版,根目录下的文件夹结构基本都是相似的,每个文件夹都有其特定的用途和功能。了解这些文件夹的含义和作用,不仅有助于我们更好地使用 Linux 系统,还可以帮助我们解决各种系统问题。
如下图所示,为 Ubuntu22.04 的根目录:
除开一些 Ubuntu 系统特定的根目录,下面说明一下所有 Linux 发行版共有的根目录文件夹:
/bin
存放基本用户命令的二进制文件(binaries),这些命令在单用户模式下也可用。例如:
ls
、cp
、mv
等。/boot
存放启动引导程序和内核镜像文件。例如:
vmlinuz
(内核文件)、initrd
(初始RAM磁盘文件)等。/dev
包含设备文件,这些文件代表系统中的硬件设备。例如:
/dev/sda
(硬盘设备)、/dev/tty
(终端设备)等。/etc
存放系统的全局配置文件和子目录。例如:
/etc/passwd
(用户信息)、/etc/fstab
(文件系统表)等。/home
用户的主目录,用户的个人文件和配置文件通常存放在此。
/lib
存放基本系统程序的共享库文件和内核模块。例如:
libc.so
、ld-linux.so
等。/media
挂载可移动介质的目录,例如:CD-ROM、USB 驱动器等。系统通常会在此目录下创建子目录以挂载这些设备。
/mnt
临时挂载文件系统的目录。管理员可以在此目录下创建子目录以临时挂载文件系统。
/opt
用于安装附加的应用程序包。通常用于存放第三方软件或附加软件包。
/proc
虚拟文件系统,包含内核和进程的信息。例如:
/proc/cpuinfo
(CPU信息)、/proc/meminfo
(内存信息)等。/root
超级用户(root用户)的主目录。与普通用户的主目录类似,但具有更高的权限。
/run
存放系统启动后生成的临时文件和运行时信息。例如:进程ID文件、守护进程的套接字等。
/sbin
存放系统管理员使用的基本系统管理命令。例如:
ifconfig
、reboot
、shutdown
等。/srv
存放系统提供的服务数据。例如:Web 服务器的数据文件、FTP 服务器的数据文件等。
/sys
虚拟文件系统,存放设备和内核相关的信息。用于访问系统硬件和内核信息。
/tmp
存放临时文件,系统重启后该目录中的文件可能会被删除。
/usr
全称为 Unix Software Resource(不少人一开始误会为
user
的缩写,包括我),存放用户级应用程序和文件。包含多个子目录,例如:/usr/bin
:常用用户命令的二进制文件。/usr/sbin
:系统管理员使用的二进制文件。/usr/lib
:共享库文件。/usr/share
:共享数据文件。/usr/local
:本地安装的软件和文件。
/var
存放可变数据文件,例如日志文件、邮件存储、缓存文件等。例如:
/var/log
:系统日志文件。/var/mail
:用户邮件。/var/cache
:应用程序缓存文件。
通过理解这些目录的含义,可以更好地管理和操作 Linux 系统,提高系统维护和故障排除的效率。当然对于新手来说,不管是学习 Linux 系统编程,还是 Linux驱动开发都有很大的帮助。