嵌入式
嵌入式层次结构
用户空间:
命令 脚本(命令的集合) app
---------------------------------系统调用----------------------------------
内核空间:
内核也是一个程序,只不过是在计算机启动时就运行的程序。
linux内核五大功能:
1.进程管理:----时间片轮转 上下文切换 分时多任务
2.内存管理:----空间的分配和回收
3.文件管理:----将一堆 0 1 转换成方便人类识别的内容
4.网络管理:----网络协议栈
5.设备管理:----通过设备驱动去操作硬件,linux中一切皆文件
---------------------------------------------------------------------------------
硬件空间:
led 摄像头 扬声器 键盘
注意:
用户空间想要操作硬件,需要先进到内核空间,进入内核空间的方式
是通过系统调用,(系统调用就是内核给用户提供的访问内核的接口函数),
然后通过内核操作硬件。
为什么linux要分为用户空间和内核空间?
主要是出于安全的角度。段错误之后,程序崩了,但是系统不会崩。
Linux 操作系统的使用
对文件命令:
查看文件信息-ls
ls :查看文件夹下非隐藏内容
-a 查看文件夹下所有内容
-l 查看文件夹下所有内容的详细信息
-lh 查看文件夹下所有内容的详细信息,文件的大小会详细标出
-r 更改文件排序:'按首字母顺序’
-R 以每个文件夹一个一个打开的方式详细显示内容
-i 显示文件的iNode号码
ll :同ls -l 相同
eg: ls -alh 显示所有文件的详细内容(包括文件大小)
清除-clear
clear :清空终端下的所有内容
切换-cd,移动-mv,拷贝-cp
cd :切换到指定位置
cd [指定位置]
eg: cd ~ :切换到家目录下,但可以不要“~”
cd - :切换到上次所在的目录
cd / :切换到根目录下
mv :移动文件或目录到指定位置
mv [源文件/目录] [目标目录]
eg:mv ~/A ~/B : 将用户家目录下的A文件夹 移动到B文件夹下面
重命名:mv [源文件/目录 名称] [重命名后 文件/目录名称]
eg:mv B C : 将当前路径下的B文件/目录 重命名为C
cp :完成文件/目录的拷贝
cp [源文件] [目标目录] :将源文件拷贝到模板目录中
eg:cp hello.c world: 将当前路径下的 hello.c 文件拷贝到 world 目录下
cp [源目录] [目标目录] -r : 将原目录拷贝到目标目录下.
eg:cp hello world -r : 将当前路径下的 hello 目录拷贝到 world目录下
查看文件-pwd,cat,head,tail,echo,more,less
pwd:以绝对路径的形式,显示你当前所在的位置
eg:pwd
cat:将文件内的内容打印到终端中.
cat 文件名 //查看文件全部内容
cat -n 文件名 //带行号显示文件的全部内容
cat [文件名]
eg:cat /etc/passwd: 将/etc/passwd文件打印到终端.
head: //显示文件开头的内容 默认显示前10行
head file //显示文件file开头的内容 默认显示前10行
head -n 20 file //显示文件file的前20行内容 使用 head -20 file 也可以
head -n 5 file //显示文件file的前5行内容 使用 head -5 file 也可以
tail:显示文件结尾的内容 默认显示后10行.
tail file //显示文件file结尾的内容 默认显示后10行
tail -n 20 file //显示文件file的最后20行内容 使用 tail -20 file 也可以
tail -n 5 file //显示文件file的最后5行内容 使用 tail -5 file 也可以
tail 命令常用的用法
tail -f 文件名 //动态的显示文件内容的新增情况 一般多用于查看日志文件 | 管道符 作用:将前面命令的结果 作为后面命令的参数
head -n 35 file | tail -n 5 //查看文件的第 31-35 行的内容
echo:将字符串打印到终端中
echo [希望输出的字符串]
注:重定向符号:
> : 以覆盖的方式重定向
echo hello world > show.txt : 将hello world 的内容以覆盖的形式写入到show.txt
>>: 以追加的方式重定向
echo hello world >> show.txt : 将hello world的内容以追加的形式写入到show.txt
more :以 百分比 形式显示文件的内容
more file 以 百分比 形式显示文件file的内容
//按回车键 继续向下显示
// 按 q 键退出
less : 滚动显示文件内容
less file //滚动显示文件内容
//按上下方向键控制滚动
//按 q 退出
查看二进制文件的命令-od
od -c 二进制文件名
创建-touch、mkdir,删除-rm
touch:创建一个普通文件.如果文件存在,则修改文件的时间戳.
touch [文件名] : 创建一个文件
eg:touch 1.c : 创建一个1.c 的文件
touch [文件1] [文件2] [文件3]
eg:touch 1.c 2.txt 3.cpp 4.doc : 创建 1.c 2.txt 3.cpp 4.doc文件.
mkdir:创建一个目录文件
mkdir [目录名称] 注:在同一个目录下,是不可以创建两个相同名称的目录的.
mkdir [目录名称1] [目录名称2] [目录名称3]
mkdir 支持嵌套创建文件
mkdir -p [嵌套目录]
eg:mkdir -p A/B/C/D
rm:删除文件/目录
删除文件: rm [文件名]
删除多个文件: rm [文件名1] [文件名2] [文件名3]
删除目录: rm -rf [目录名] -r:递归删除 -f:强制删除
其他
tab:补全命令功能
sudo:临时申请管理员权限.
eg:sudo + [shell命令]
Vim
插入模式本质: 向文本中写入内容.
i (小写) : (insert) 在光标所在位置的前面,进入到插入模式.
I (大写) : (insert) 在光标所在的行首,进入到插入模式.
a (小写) : (append) 在光标所在位置的后面,进入到插入模式.
A (大写) : (append) 在光标所在的行尾,进入到插入模式.
o (小写) : 在光标所在位置的下一行,进入到插入模式.
O (大写) : 在光标所在位置的上一行进入到插入模式.
命令行是执行 vim 内置一些命令 (复制, 粘贴, 剪切 .....)
ESC 键进入到命令行模式.
复制命令:
yy: 复制光标所在行的内容,到剪切板中.
nyy: 复制n行的内容到剪切板中.
粘贴命令:
p: 在光标所在行的下一行将剪切板上的内容到粘贴文件中.
P(大写): 在光标所在行的上一行将剪切板上的内容到粘贴文件中.
剪切命令:
dd : 剪切光标所在行的内容,到剪切板中.
ndd: 将切n行的内容到剪切板中.
撤销命令:
u: 撤销上一步操作
ctrl + r : 反撤销
光标调整:
G: 将光标调整到文件结尾行
gg: 将光标调整到文件开始为止
w: 将光标移动到下一个单词中.
shift + : ''键盘1前面的键, 将光标的内容进行大小写转换.
shift + : + n : 光标跳转到n行.
代码对齐:
gg=G: 将全局的代码进行对齐操作. 一定在语言代码 .c .py
局部对齐: 选中需要对齐的代码.然后按一下 =
删除光标后面的所有内容:
dG: 删除光标后面的所有内容
字符串查找高亮:
/+string : 将查找到的字符串进行高亮操作
n: 将光标切换到下一个高亮的内容中
N: 将光标切换到上一个高亮的内容中
取消高亮:
shift + :nohl :取消高亮.
底行模式 : 在命令行的模式下: 使用 shift + : 进入到底行模式.
保存退出相关命令
q : quit 退出 (不保存退出)
w : write 保存
wq :保存退出
! : 强制, 需要配合其他的底行命令使用
q!: 强制退出
w!: 强制保存
wq!: 强制保存退出
跳转行数:
n: 光标跳转到第n行
行号显示:
set nu: 显示行号
set nonu: 不显示行号
替换:
局部替换: %s/需要替换的字符串/替换成的字符串
eg: %s/h/H : 将文件中的每一行的第一个出现的h字符替换为 H
全局替换: %s/需要替换的字符串/替换成的字符串/g
eg: %s/h/yello/g : 将文件中的每一行的所有的h替换为 yellow
指定的行进行替换: m,ns/需要替换的字符串/替换成为的字符串
eg 10,20s/h/hello :将10~ 20 里面的第一个出现的h 替换为hello
指定的行进行替换: m,ns/需要替换的字符串/替换成为的字符串/g
eg 10,20s/h/hello :将10~ 20 里面的h 替换为hello
linux软件包管理
软件包的后缀
.deb (给Ubuntu使用)
.rpm (给Redhat使用)
软件包的命名规则
软件名 版本号 修订版本号 架构 给Ubuntu使用
sl _ 5.02 -1 _ amd64 .deb
架构: i386 给32位系统用的 amd64 给64位系统用的
软件的安装、卸载、清楚
安装-dpkg,apt-get
离线----dpkg
需要有软件包,且不会检查软件的依赖,如果有依赖,需要自己安装。
安装软件:
sudo dpkg -i 软件包名
查看软件的使用说明
man 软件名
查看安装的软件的信息
sudo dpkg -l(小写的L) 软件名
查看软件的安装路径
sudo dpkg -L 软件名
卸载软件:(会保留软件的配置信息)
sudo dpkg -r 软件名
完全卸载
sudo dpkg -P 软件名
在线----apt-get
不需要安装包,但是需要联网,且安装软件时会检查软件的依赖,
如果有依赖,会一并装到系统中
检查Ubuntu是否联网
ping www.baidu.com
注意:每个服务器都会保存(尽量)所有软件仓库的地址
由于用于所在的地理位置不同,使用不同的服务器下载软件的速度也不同。
用户下载软件,需要先选择一个合适的服务器。
选择服务器的流程:
点击左下角所有程序--》选择软件更新器--》设置---》
选择Ubuntu软件选项卡--》勾选所有复选框---》点击下载自后面的下拉箭头
----》选择其他站点----》选择华为云的即可---》点击关闭----》不用重新载入
在 /etc/apt/sources.list 文件中记录的就是服务器的地址
看到新选择的服务器的地址,说明选择成功了。
更新本地源:
sudo apt-get update
(将服务器中软件仓库的地址同步到主机上,更新后会在 /var/lib/apt/lists 显示软件信息)
卸载-sudo apt-get remove
卸载:
sudo apt-get remove 软件名
只下载不安装
sudo apt-get download 软件名
下载源代码
sudo apt-get source 软件名
清理安装包
sudo apt-get clean
安装完软件后 安装包会被留在 /var/cache/apt/archives 目录下
clean操作就是清理这个目录下的 所有安装包
系统命令
关机的命令-sudo shutdown -h
sudo shutdown -h now //立即关机
sudo shutdown -h 10:30 //10:30关机
sudo shutdown -h +30 //30分钟后关机
重启的命令-sudo shutdown -r
sudo shutdown -r now //立即重启 sudo reboot
sudo shutdown -r 10:30 //10:30重启
sudo shutdown -r +30 //30分钟后重启
目录管理
压缩和归档的命令
压缩-gzip,bzip2,xz和解压缩-gunzip,bunzip2,unxz
操作的对象的单个文件
压缩方式:
gzip ---->.gz
bzip2 ---->.bz2
xz ---->.xz
上述三种压缩方式:压缩率是依次递增的,压缩速率是依次递减的
例如:
gzip file1 //将文件按 gzip 格式压缩,生成 file1.gz 文件,压缩后源文件被删除
gunzip file1.gz //解压
bzip2 file1 //将文件按 bzip2 格式压缩,生成 file1.bz2 文件,压缩后源文件被删除
bunzip2 file1.bz2 //解压
xz file1 //将文件按 xz 格式压缩,生成 file1.xz 文件,压缩后源文件被删除
unxz file1.xz //解压
归档(打包)和解归档-tar
归档:把1个或多个文件归档成一个文件,一般我们用来操作目录文件
归档的命令 tar
tar命令的选项
-c 归档
-x 解归档
-v 显示详细信息
-f 必须放在选项最后
注意:选项可以连用 -c -v -f 可以写成 -cvf
附加选项
-z 归档的同时将文件按 gzip 格式压缩
-j 归档的同时将文件按 bzip2 格式压缩
-J 归档的同时将文件按 xz 格式压缩
归档和解归档
tar -cvf dir.tar dir //将目录dir及其子目录下的所有文件归档成一个文件dir.tar并显示过程信息
//归档并不会删除源文件
tar -xvf dir.tar //将dir.tar 解归档 解归档之后 归档文件也不会被删除
归档的同时进行压缩
tar -zcvf dir.tar.gz dir //归档的同时将文件按 gzip 格式压缩
tar -zxvf dir.tar.gz //解归档并解压缩
tar -jcvf dir.tar.bz2 dir //归档的同时将文件按 bzip2 格式压缩
tar -jxvf dir.tar.bz2 //解归档并解压缩
tar -Jcvf dir.tar.xz dir //归档的同时将文件按 xz 格式压缩
tar -Jxvf dir.tar.xz //解归档并解压缩
通用的解归档并解压缩的方式:
tar -xvf dir.tar.gz
tar -xvf dir.tar.bz2
tar -xvf dir.tar.xz
统计文件内容的命令--wc
wc 文件名 //统计文件内容
会看到如下信息
4 7 47 file
行数 单词数 字符数 文件名
wc 命令的选项
-l(小写的L) 行数 line
-w 单词数 word
-c 字符数 char
wc 命令支持通配符
如:查看当前路径下所有.c文件的行数
wc -l *.c
检索文件内容的命令--grep
grep "string" file //检索文件file中所有包含string的行
grep 命令的常用选项
-n 显示行号
-i 忽略大小写
-w 精确查找 只查找 string 独立出现的地方 有前缀 和 后缀都不行
-v 反选 查找不包含 string 的行
-R 递归查找,可以检索子目录下的内容
常用的用法:
grep -nR "string" * //在当前路径及子目录下的所有文件中 查找包含string的行 且显示行号
关于 grep 命令的 string 也有说法:
grep "^string" file //检索以string开头的行
grep "string$" file //检索以string结尾的行
grep "^string$" file //检索string独立成行的行
查找文件的命令--find
find ./ -name file //在当前目录及子目录下查找所有名为 file 的文件
find /home/linux -name file //在/home/linux目录及子目录下查找所有名为 file 的文件
find ./ -type d //在当前目录及子目录下查找所有的 目录文件
类型可以写这些种:bsp-lcd 注意:普通文件时 要用 f 而不是 -
find ./ -type f //在当前目录及子目录下查找所有的 普通文件
要特别注意下面的用法:
find ./ -name *.c
这种写法不是查找当前目录及子目录下的所有 .c 文件
他是先匹配当前目录下所有的.c文件 然后把他们作为 find 命令的参数
如果当前目录下只有一个.c 文件,那么执行时不会报错,但是结果也不表示查找所有.c
如果当前目录下有多个.c文件,那么执行时 会报错 find 命令参数过多
如果想找当前目录及子目录下所有的.c文件,可以使用下面的用法
find ./ -type f | grep "\.c$"
find ./ -type f | grep "\.c$" |wc -l 统计当前目录及子目录下所有.c文件的个数
find ./ -type f | grep "\.c$" |xargs wc -l 统计当前目录及子目录下所有.c文件的行数
文件内容截取的命令--cut
选项:
-d 分隔符
-f 选择哪些域
注意:
1.cut命令是以行为单位操作的,如果某一行没有指定的分隔符 就不处理
2.如果指定的分隔符是特殊的,如 双引号 或者 单引号 需要使用转义字符 \"
例:
文件file内容如下:
西安市:莲湖区:桃园路:街道:团结东路:195号
aa-bb-cc-dd-ee-ff
cut:
cut -d : -f 3 file
桃园路街道
aa-bb-cc-dd-ee-ff
cut -d : -f 3,5,6 file
桃园路街道:团结东路:195号
aa-bb-cc-dd-ee-ff
cut -d - -f 3,4 file
西安市:莲湖区:桃园路:街道:团结东路:195号
cc-dd
linux系统中 /etc/passwd 文件中记录的是系统中用户的信息
linux系统中 /etc/group 文件中记录的是系统中组的信息
/etc/passwd 中记录的信息说明:
linux : x : 1000 : 1000 : linux,,, : /home/linux : /bin/bash
用户名 有密码 用户id 组id 描述字段 用户的家目录 默认的命令行解释器
编写命令,显示出 linux 用户再 /etc/passwd 文件中的行号:
cat /etc/passwd | cut -d : -f 1 | grep -n "^linux$" | cut -d : -f 1
通配符
* 通配任意长度的任意字符
原有文件:
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c
abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls * 显示结果
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls *.c 显示结果
abcd.c A.c B.c C.c D.c file2.c file4.c skjdfhaksjdfh.c a.c b.c c.c d.c file1.c file3.c qwer.c
ls file* 显示结果
file1.c file1.txt file2.c file2.txt file3.c file3.txt file4.c
? 通配一个长度的任意字符
原有文件:
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c
abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls ?.c 显示内容
a.c A.c b.c B.c c.c C.c d.c D.c
ls ????.c 显示内容
abcd.c qwer.c
[字符1字符2..字符n] 通配 [ ] 中的任意一个字符
原有文件:
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls file[13468].c 显示结果
file1.c file3.c file4.c
[起始字符-结束字符] 通配 起始字符到结束字符 间的任意一个字符
原有文件:
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c
abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls file[0-9].c 显示结果
file1.c file2.c file3.c file4.c
ls [a-c].c 显示结果
a.c b.c c.c
注意:有的系统本地语序不是 a-zA-Z 而是 aAbBcC..zZ
这时 可以使用命令 export LC_ALL=C 来清空本地语序
让其变成 a-zA-Z
[^字符1字符2..字符n] 通配不包含 [ ] 中字符的任意一个字符--反选
原有文件:
abcd.c a.c b.c c.c d.c file1.c file2.c file3.c file4.c skjdfhaksjdfh.c
abcd.txt A.c B.c C.c D.c file1.txt file2.txt file3.txt qwer.c
ls file[^12].c 显示结果
file3.c file4.c
文件权限管理
文件的权限
- rw-rw-r-- 1 linux linux 76 3月 15 15:43 a.c
类型 权限 硬链接数 所属用户 所属组 大小 时间戳 文件名
权限分为三组
rw- rw- r--
所属用户权限 所属组权限 其他人权限
r 读权限
w 写权限
x 执行权限
- 没有对应的权限
修改文件的权限--chmod
注意:只有文件的所属用户和root用户可以修改文件的权限。
1 通过+-方式修改
u--> user 所属用户
g--> group 所属组
o--> other 其他人
a--> all 所有用户
r--> read 读
w--> write 写
x--> exec 执行权限
chmod u+w file //给文件file的所属用户添加写权限
chmod g-r file //给文件file的所属组减掉读权限
chmod o+r file //给文件file的其他人添加读权限
chmod a+x file //给文件file的所属用户所属组其他人都添加执行权限
通过八进制数修改
rwxrwxrwx --> 0777
rw-r----- --> 0640
chmod 0640 file //将文件的权限改成 rw-r-----
chmod 0662 file //将文件的权限改成 rw-rw--w-
修改文件所属用户
注意:只有root用户可以修改文件的所属用户
sudo chown 新的用户 文件名
修改文件所属组
注意:只有root用户可以修改文件的所属用户
sudo chgrp 新的组 文件名
链接文件
软连接(符号链接)
ls -l 能看到类型为 链接文件的 是软链接文件
软连接相当于windows中的 快捷方式
创建软连接
ln -s 被链接的文件 要生成的软链接文件
注意:
1.创建软连接文件时,最好使用绝对路径,否则一旦链接文件
和被链接的文件相对位置发生变化时,链接就失效了。
2.如果被链接的文件位置变化了或者被删除了 链接也会失效
硬链接
硬链接相当于给文件起了一个别名
创建硬链接的方式:
ln 被链接的文件 要生成的软链接文件
硬链接只是给文件起了个别名,并没有产生新的文件,因为操作系统不是根据名字来识别文件的
而是根据文件的 Inode 号来识别的 Inode 号是文件在文件系统中的唯一编号
同一组的硬链接文件 Inode号是相同的
查看inode号的方式: ls -i 文件名 stat 文件名
当删除一个硬链接文件时,并不会直接把文件删除,只有当左右一个名字被删除时,
文件才真正的被删除了
同一组的硬链接文件 修改其中一个 另外的也会发生变化
用户管理相关命令
linux系统是一个多用户的操作系统。
添加用户
sudo adduser 用户名
用户创建成功后,会在 /etc/passwd 文件中新增新用户的信息
会在 /etc/group 文件中新增组的信息
新创建的用户不允许使用sudo以管理员身份执行命令。
可以用下面的方式给新用户添加 sudo 权限
1.切换到root用户 su root
2.给 /etc/sudoers 文件添加写权限 chmod u+w /etc/sudoers
3.打开文件 vi /etc/sudoers
4.复制 root ALL=(ALL:ALL) ALL 粘贴到下面 将新行中的用户名改成新用户名 :wq保存退出
5.给 /etc/sudoers 文件删除写权限 chmod u-w /etc/sudoers 一定要改回去 防止被误修改!
6.退出 root 用户 exit
切换用户
su 用户名
查看当前使用的用户
whoami
退出当前用户
exit
修改用户密码
只有用户自己和管理员用户(root) 可以修改用户的密码
且管理员用户不需要知道 旧密码
passwd 用户名 修改用户密码
修改用户信息--usermod
sudo usermod -c "beijing" user2 //将用户user2的描述字段改为 beijing
sudo usermod -d /home/test user2 //将用户user2的家目录改为 /home/test
因为用户的家目录下有很多和用户的相关的隐藏文件
所以修改家目录前需要先将这些文件拷贝到新目录 否则用户可能就无法使用了
sudo usermod -l(小写的L) hqyj user2 //将用户user2的用户名改为hqyj
sudo usermod -g new_group user2 //将用户user2的所属组改为new_group
查看用户的简略信息
id 用户名
删除用户
sudo deluser 用户名
删除组
sudo delgroup 组名