初步复制wiki内容

This commit is contained in:
陌生人 2022-04-21 23:11:59 +08:00
parent 48ac4bf98b
commit df4521914a
19 changed files with 2294 additions and 0 deletions

View File

@ -0,0 +1,66 @@
---
title: Ubuntu软件源格式解析
toc: true
date: 2021-02-20 14:08:43
tags:
categories:
---
1. Ubuntu的包管理工具是apt由于官方的软件源一般都在国外所以有时候源会很慢所以有时候会替换成国内的镜像站但是需要我们修改软件仓库的配置。Ubuntu的软件软分为两部分官方源和ppappa其实是一个网站launchpad.net。Launchpad 是 Ubuntu 母公司 Canonical 有限公司所架设的网站,是一个提供维护、支援或联络 Ubuntu 开发者的平台。由于不是所有的软件都能进入 Ubuntu 的官方的软件库launchpad.net 提供了 PPA允许开发者建立自己的软件仓库自由的上传软件。供用户安装和查看更新。官方的源在/etc/apt/sources.list,ppa在/etc/apt/sources.list.d/这个文件夹里,我们说的换源是换的官方源,打开官方源的文件能看到很多链接.
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
整个软件源结构可以分解为四个部分:
第一部分 第二部分 第三部分 第四部分
软件包格式 软件包服务器地址 发行版版本代号 软件包的分类目录
deb/deb-src http://mirrors.aliyun.com/ubuntu/ xenial/xenial-updates/xenial-security/xenial-backports/proposed main、restricted、universe、multiverse
2. 第一部分的deb是deb软件包deb-src则是源代码包
第三部分严格来说不算是发行版版本代号它应该是Ubuntu系统发布之后在此基础上进行的安全性更新的分类。
第四部分是按照软件包的自由度来分类的:
main即“基本”组件其中只包含符合Ubuntu的协议要求并由Ubuntu团队维护支持的软件。
restricted即“受限”组件其中包含了非常重要的但并不具有合适的自由协议的软件如显卡驱动同样有 Ubuntu团队维护支持。
universe即“社区维护”组件其中包含的软件种类繁多它们可能采用受限于协议可能不是但都不为Ubuntu 团队维护。
multiverse即“非自由”组件其中包括了不符合自由软体要求而且不被Ubuntu团队支援的软件通常为商业公司编写的软件。
3. 下面我们来看一下Ubuntu软件源镜像站的目录结构以阿里云镜像站为例 http://mirrors.aliyun.com/ubuntu/ 在浏览器地址栏中输入此地址便进入了Ubuntu软件源镜像站如下图所示[图1] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/151031uvap21lg32epp0zo.png)
重点看两个文件夹dists和pool
dists目录包含的全是Ubuntu发行版目录及其附加仓库目录xenial、xenial-update、xenial-security、xenial-backports就是Ubuntu xenial发行版目录及其附加仓库目录
pool/:
所有 Ubuntu 发布版及已发布版的软件包的物理地址。按照源码包名称分类存放。pool目录下按属性再分类main、restricted、 universe和multiverse分类下面再按源码包名称的首字母归档。这些目录包含的文件有运行于各种系统架构的二进制软件包生成这些二进制软件包的源码包。
我们知道Ubuntu还有其他的附加仓库Ubuntu附加仓库的命名格式是“版本代号-限定词”限定词是这update、security、proposed、backports四个词中的一个比方说版本代号xenial和限定词update组合就是xenial-update附加仓库xenial和security组合就是xenial-security附加仓库以此类推可以自行写出Ubuntu所有的附加仓库的目录名称。
4. 在sources.list文件里只有一条包含发行版仓库xenial的软件源还不够我们还要写出包含其他4个附加仓库的软件源只要把已经写好的软件源中的xenial依次替换成xenial-update、xenial-security、xenial-proposed、xenial-backports即可下面是完整的包含所有附加仓库的软件源
deb http://mirrors.aliyun.com/ubuntu/ xenial-update main universe restricted multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main universe restricted multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main universe restricted multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main universe restricted multiverse
将这四条软件源再一并写入sources.list再加上
deb http://mirrors.aliyun.com/ubuntu/ xenial main universe restricted multiverse
总共五条
另外为了防止运营商劫持大家可以使用https但是要求镜像站支持https一般现在大型镜像站都是支持https的比如清华镜像站阿里镜像站163等。
本文在撰写过程中参考了以下文章
[https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=191480](https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=191480)

39
其他/ssh基础用法.md Normal file
View File

@ -0,0 +1,39 @@
---
title: ssh基础用法
toc: true
date: 2021-02-20 14:35:08
tags:
categories:
---
1. SSH 为 Secure Shell 的缩写,由 IETF 的网络小组Network Working Group所制定SSH 为建立在应用层基础上的安全协议一般来说用的最频繁的还是用来登录远程主机他内置了一个sftp的模块使用加密的方式传输用的端口也是22比起 不加密的ftp安全性要好很多。最简单的指令格式如下
ssh 用户名@主机地址
当然这是基于端口是默认的情况如果sshserver的端口不是默认的就会变成下边这样:
ssh 用户名@主机地址 -p 端口号
然后会提示输入密码,这个密码就是你要登录的用户名的密码,这个用户必须是存在的,而且是允许登录的才行,一般情况下大家在安装系统时候建立的用户是没问题的,而且密码默认不回显.
他还可以代理x11协议把界面传输到本地但是实际上是在远程主机运行但是需要远程主机安装xauth并且本地和远端都启动x11代理才可以实际测试的时候有的应用可能是不支持的此外如果本地系统是win的话可能不好用如果是优麒麟那么只要网速足够还是挺好的缺点是有可能无法使用中文输入法只能复制粘贴虽然可以通过配置的方式让输入法启动但是我没成功过。另外就是有一个端口映射的作用一般来说称之为ssh隧道可以把远端的端口映射到本地也可以把本地的端口映射到远程也可以改成双向的这样可以用作内网穿透或者是把本地服务暴露在远端也可以把远端的端口变成本地访问而且是用ssh加密过的不用担心被窃听等一般情况下开发会用的比较多把数据库的端口映射到本地的某个端口直接访问不用把公网的对应端口打开提高安全性再比如说vnc把vnc的端口映射到本地虽然vncview提示不加密但是中间传输的数据是经过ssh加密的不用担心被窃听而且可以关闭对应端口的防火墙不用担心被别人扫描到。ssh可以禁用密码登录只使用密钥登录也可以两者并存只要有一个公钥和私钥然后把公钥放到特定的文件里就可以直接使用私钥免密登录。
2. SSh的一个小技巧ssh如果在一段时间不响应的话可以修改心跳时间每隔一定时间发送一个空包保持响应一般来说我不建议设置的时间超过30如果是网络环境差点30都可能断一般设置成15极端情况设置成5这里以秒为单位。
还有就是如果退出了ssh那么正在运行的程序就会被杀死可以使用screen命令让程序运行在后台然后Ctrl+a+d来返回这样就可以安心的退出ssh不用担心程序挂了恢复的命令也有。
3. 如果是第一次登录一个主机会出现一个提示语,大概如下:
这个就是你第一次登录一个新主机的时候给的提示至于为什么给这个提示是因为ssh的通讯过程导致的算是一种验证方法具体大家可以查一下百度需要注意的是在这里只有输入yes才可以继续单纯的一个y或者是回车是不可以的
然后输入密码登录,成功登录之后会显示一些欢迎语,和最后一次的登录地址。
最下边的看起来是和上边的一致的但是实际上是ssh登录的结果因为终端的显示方式就是“用户名@主机名”这种格式
登录成功之后就可以用终端在远程主机执行一些命令操作
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可能大部分没有尝试过的用户会发现在使用远程登录自己主机的时候会被拒绝这是因为ssh分为两部分一部分是server一部分是clientclient就是我们上边用的ssh命令server部分桌面环境不一定有Ubuntu的server版会在安装的时候让用户选择是否安装server如果没有的话可以直接安装openssh-server需要注意的是我们自己安装的server默认禁止root用户登录所以要想让root用户远程登录需要修改server的配置文件再次就不细说的网上一把教程节省资源。
本文撰写过程中参考了以下文章:
[https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=193097](https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=193097)
[https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=193211](https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=193211)

View File

@ -0,0 +1,96 @@
---
title: '在双系统Windows 8 、Ubuntu Kylin中如何从Windows 8卸载Ubuntu Kylin '
toc: true
date: 2019-06-29 11:47:58
tags:
categories:
---
![](https://www.ubuntukylin.com/upload/images/q1.jpg)
曾几次介绍如何在Windows 8存在的情况下安装Ubuntu Kylin。但是我们如何从Windows 8中卸载Ubuntu Kylin呢这篇教程适用于任何Linux操作系统如Ubuntu Kylin、Linux Mint、Elementary或任何其他Linux的发行版。
如果您认为卸载Ubuntu Kylin是一个艰巨的任务那完全是错误的因为从Windows中删除Ubuntu Kylin是很容易的。如果你有一个Windows安装盘从Windows中卸载Linux简直就是小菜一碟。
本教程教你当启动了Windows 8/8.1安装盘时如何从Windows 8或Windows 8.1中彻底删除Linux。
从双系统中安全卸载Ubuntu Kylin
如果您有Windows 8安装盘并且已经安装了Windows 8.1操作系统,它的运行过程都是一样的,虽不与Windows 7相同。如果有Windows安装盘就来一起学习下面这个在Windows中删除Ubuntu Kylin Linux操作系统的过程。
从双系统中删除Linux分两部分进行。首先是删除已安装Linux的分区S。由于只删除Linux分区会导致Grub错误所以第二部分是修复Windows启动加载器。
第一部分在Windows中删除Linux分区
第1步登录Windows。按Windows+ R运行diskmgmt.msc命令打开Windows的磁盘管理工具。
![](https://www.ubuntukylin.com/upload/images/q2.jpg)
第2步既然已经安装了Linux就很容易让您通过它的容量大小识别Linux分区。另一个提示可以通过看分区是否无文件系统和驱动器号来识别Linux分区。 Windows分区都标有一个驱动器号如通常在NTFS或FAT文件系统CDE等。
正如您所看到的这有三个Linux分区。
![](https://www.ubuntukylin.com/upload/images/q3.jpg)
第3步选择Linux分区S右击选择“删除卷”选项。
![](https://www.ubuntukylin.com/upload/images/q4.jpg)
它会弹出一个警告,在这里选择“是”。
![](https://www.ubuntukylin.com/upload/images/q5.jpg)
第4步被删除的分区将作为一大块空闲空间。您可以扩展现有分区或创建一个新的Windows分区出来。如果想双启动Linux与Windows建议创建一个新的驱动器或卷或分区随便您怎么称呼它
![](https://www.ubuntukylin.com/upload/images/q6.jpg)
第二部分修复Windows启动加载器
一旦删除Linux分区就需要花时间来修复Windows启动加载器。这里的图片可能有点不清晰因为Ubuntu Kylin登录界面的截屏比Windows简单。
第1步放入Windows 8安装盘重启计算机。在开机时按F10或F12键进入BIOS/ UEFI从硬盘启动。
![](https://www.ubuntukylin.com/upload/images/q7.jpg)
第2步选择“修复计算机”。
![](https://www.ubuntukylin.com/upload/images/q8.jpg)
第3步进入“故障处理”选项。
![](https://www.ubuntukylin.com/upload/images/q9.jpg)
第4步在“故障处理”页面中选择“高级选项”。
![](https://www.ubuntukylin.com/upload/images/q10.jpg)
第5步找到”命令提示符”。
![](https://www.ubuntukylin.com/upload/images/q11.jpg)
第6步在命令行中输入以下命令来修复Windows启动加载器。
bootrec.exe /fixmbr
通常情况下,它运行的时间很短。您甚至不必等它。
![](https://www.ubuntukylin.com/upload/images/q11.jpg)
第7步一旦完成重启计算机这时候从硬盘正常启动进入Windows。如果您仍看到Grub错误请尝试以下步骤。
第8步如果第6步失效尝试在”高级故障排除”选项中的”自动修复”选项。
![](https://www.ubuntukylin.com/upload/images/q13.jpg)
这将需要一点时间来找问题,然后修复它。
![](https://www.ubuntukylin.com/upload/images/q14.jpg)
现在如果您重启应该在Windows中正常就不会看到任何的grub救援错误。
希望这篇技巧文章能帮您从Windows8双系统启动中完全删除Ubuntu Kylin Linux系统。欢迎给UK团队提出任何问题或建议。

View File

@ -0,0 +1,35 @@
---
title: 如何在grub添加启动参数
toc: true
date: 2020-08-28 19:26:55
tags:
categories:
---
## 如何在grub添加启动参数
对于grub2ubuntu给了一个官方的配置文件/etc/default/grub。大部分情况下grub2的设置都可以在这个文件中搞定而且这个文件结构也比较简单修改起来也容易。完全没有必要直接改/boot/grub/grub.cfg或者/etc/grub.d/下的文件。
修改/etc/default/grub只需简单一个命令sudo vim /etc/default/grub
下面是系统默认的内容,以及最常用的修改菜单显示时间和默认操作系统的方法:
#If you change this file, run 'update-grub' afterwards to update
#/boot/grub/grub.cfg.
GRUB_DEFAULT=0 #将0改为saved可让grub记住上次启动时选择的系统
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT="5" #显示启动选择菜单的时间
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
修改完成后执行以下命令:
$ sudo apt-get install grub2-common //没有 update-grub命令时,先运行这个安装命令
$ sudo update-grub //生成grub的配置文件
即可。

View File

@ -0,0 +1,54 @@
---
title: 如何扩展根分区
toc: true
date: 2021-02-20 11:30:42
tags:
categories:
---
## 说明
修改根分区其实不难,只是时间可能比较长,最主要的修改有两个,/etc/fstab和引导引导可以用 sudo update-grub 来更新fstab则需要自己根据情况来修复截图我会用16.04修改17.04的根分区修改16.04的根分区时间太长需要用麒麟的启动盘版本无所谓启动电脑这里是把16.04当做启动盘启动之后的系统来用,需要说明的一点是,有的设备文件是不同的比如,这里是单硬盘双系统,你的可能是双硬盘双系统,不要全按照文中设备文件来写,文章尽量的描述应该找的分区特征,大家根据实际情况修改,文章会尽量啰嗦的写清楚,宁可多说不能漏说,在这里漏了你的电脑可能就开不了机,所以最好把这个读完再操作.
1. 首先查看自己的根分区在哪个分区上打开gparted就可以看到了这是我在17.04下截的图 [图1] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832fjg2dqvxgedddg8d.png),可以看到根分区所在的地方时/dev/sda7那么sda7就是我们要扩大的分区记住分区号码就可以了因为sda可能会更改。 然后双系统的换到另一个Linux或者用麒麟启动盘启动电脑然后打开gparted如果发现打开的磁盘没有自己要修改的分区可以点击右上角切换磁盘但是切换磁盘找到自己的分区号以后下边所有的分区操作都是以你新找到的分区进行操作的你只要把sda7替换成你自己的分区就可以。[图2] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832r3yqn8cq2cwq7ccv.png)
2. 如图17.04装在了/dev/sda7,所以我可以切sda12或者sda8我选择把/dev/sda12的分区切出来5G这里是实验大家可以根据自己的需要修改切前边还是切后边都可以。这是无损的切记要修改的分区不能挂载。
注意:所有要修改的分区都不能挂载,已经挂载的可以在分区上右键选择卸载,不修改分区的是无所谓的,已挂载的分区前会出现一个钥匙,就像我的/dev/sda1那个一样。
首先从/dev/sda7前边或者后边的分区切出来一部分我切的是前边的sda12。[图3] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832sv6vdz4c3ndnkgrt.png)
[图4] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832q0oubktydhmtthdd.png) [图5] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832wx6xv6xc6zvf5w5e.png)。
3. 因为我要在分区之后切出来5GB的空间所以在之后的空余空间输入5120如果希望在分区前边切出来空余的空间就只修改之前的空余空间但是不推荐修改之前的空余空间分区数据少的话还好数据多的话最后修改大小的时候会很耗时间输入完毕后回车之后点击调整按钮会变成下边这样。[图6] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114832gf96nc1ktqzne79t.png)。
4. gparted不会直接操作他会等你点击应用后把你的操作按照顺序执行这是如果执行修改的分区分布下边则是执行的步骤顺序然后同样的方式把sda7扩大这是选择调整sda7之后显示的窗口。[图7] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833wjjofhhujzf22hya.png).
5. 我们可以拖动前边的箭头拖动到最前边之后点击修改然后会弹出一个窗口提示可能无法启动这个没事但是Windows我好像没试过点击确定之后是这样的 [图8] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833avyh9wffjd9wwify.png)。
6. 然后点击上边的应用,就会按照你的步骤顺序来执行操作,有的操作是比较浪费时间的,所以有时候是需要等待的,在应用前边的是撤销,做错了可以用这个撤销掉,所以最好在应用前检查下 [图9] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833i5njn1nnn2kqk9ya.png)。
7. 点击应用后会出现个应用操作到设备,点击应用即可,然后会出现具体的操作步骤 [图10] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833x15pvso2ja92c9cf.png).
8. 在分区后边缩小分区比较快,如果在分区前边缩小,会移动整个分区的数据,速度的话,你自己想想,扩大分区倒是不用太长时间,这是我扩大之后的分区 [图11] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833wajhlg5d53uml3o3.png)。
9. 然后打开文件管理进入sda7所在的挂载目录右键在此打开终端表述可能不同意思就是在这个地方打开一个终端这是我的终端 [图12] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833o5cco0xtlcb5ztlc.png)。
10. 终端默认都会显示当前的所在路径比如现在我的终端是在/media/root/17.04打开的,这个路径如果是用绝对路径挂载的话需要用到,具体的路径可以在自己的终端上查看,这里是相对路径是用不到的然后执行三条类似于新建挂载点的命令。
sudo mount --rbind /dev dev
sudo mount --rbind /proc proc
sudo mount --rbind /sys sys
注意这是boot没有单独分区的情况如果单独分区了还需要再挂载boot分区到boot目录
假设boot分区在/dev/sda3
sudo mount /dev/sda3 boot
如果是efi还需要再挂载efi分区假设efi分区在/dev/sda2
sudo mount /dev/sda2 boot/efi
然后执行
sudo chroot .
注意:最后是有一个英文状态下的点的。
此时你的用户会变成root目录会变成根目录也就是/ [图13] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833wmpko7a72mpqyohm.png)
11. 然后在这个终端执行 update-grub [图14] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833i6ufr1bs6pussrs3.png)
12. 这样引导就修复完成了
注意此处针对的是单系统的引导多Linux系统的引导最好再用主引导来修复第三方引导就只能自己修复了之后还有最最重要的一步修改fstab不修改fstab的话虽然能启动内核但是是不能挂载根分区的也就不能顺利启动系统。
进入17.04所在分区的etc目录然后打开终端用管理员权限编辑fstab注意不是你现在使用的系统是之前调整的分区那里的目录
输入 sudo gedit fstab
我们主要修改的是圈住的部分那里是根分区的UUID因为我们修改了分区所以这里可能会被改变我们需要手动修改下如果对比没有变化的话就可以不用修改 [图15] (https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833p99llub5l542br2b.png)。
13. 打开gparted
在17.04所在的分区右键选择最底下的“信息”弹出来这个我们只要复制圈住的部分就是UUID那里就可以了快捷键Ctrl+C如果右键没有复制的话。 [图16](https://www.ubuntukylin.com/ukylin/data/attachment/forum/201912/27/114833brgaojpzaj8xgjko.png)。 这里分区的UUID没有被改变我们可以不修改如果发现gparted的UUID和fstab里边的不同那么就把gparted里边的UUID替换到fstab里保存一下然后就可以开机了。
本文撰写过程中参考了以下文章:
[https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=191476](https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=191476)

View File

@ -0,0 +1,175 @@
---
title: 我就是我原理不一样的snap
toc: true
date: 2019-06-24 09:03:40
tags:
categories:
---
**引言**
snap和flatpak都是新一代跨Linux发行版的软件包管理技术上一篇我们简单介绍了flatpak的原理传送门今天我们接着简要介绍snap的安全机制。
### 简介
snap是Canoncial公司提出的新一代linux包管理工具致力于将所有linux发行版上的包格式统一做到“一次打包到处使用”。目前snap已经可以在包括Ubuntu、Fedora、Mint等多个Linux发行版上使用。首先我们来了解下snap相关的各种名词
#### snap
新一代跨Linux发行版的软件包管理技术支持各大主流Linux发行版通过Linux内核安全机制保证用户数据安全彻底解决包依赖关系相关问题并大大简化应用软件的打包工序。snap同时为安装及管理snap包的命令行工具。
#### snapd
管理snap软件包的后台服务。
#### kernel snap
使用snap格式打包的内核包含内核镜像及内核模块。
#### OS snap
使用snap格式重新打包的rootfs包含了运行和管理snap的基本资源当你第一次安装snap时OS snap 首先被安装。
#### snapcraft
将软件打包成snap格式的打包工具集。
#### snappy
原指完全基于snap构建的系统此名称已弃用现统一称为Ubuntu Core即Ubuntu的全snap操作系统有别于传统基于deb包的classic Ubuntu。
### 安全策略
snap应用以沙箱的方式运行。系统通过一些机制限制应用访问资源的权限来实现其安全特性比如通过对内核安全机制AppArmorSeccomp等的配置实现的沙箱和snap文件系统等。开发者不必过多了解系统安全机制的细节。下面简要说明snap使用的部分安全策略。
#### Sandbox
Linux Sandbox 是根据内核中支持的一些安全机制实现的进程访问控制方式。通常通过为进程分配随机uid将进程置于chroot环境和为进程uid配置Capability等方式将进程置于严格受限的一种状态下。snap应用使用这种方式运行在系统为其分配的沙箱环境中。
#### security policy ID
每一个snap应用程序命令都有唯一的security policy ID系统将此ID与命令绑定由此可以为同一snap包内的不同程序配置不同的安全策略。作为系统识别命令的标示当程序安装和运行时系统会根据其Security Policy ID为其分配资源。在沙箱中运行的snap应用之间的通信控制也通过此ID来进行配置。
snap应用的security policy ID的命名规则为snap.name.command
例如hello程序的security policy ID即为snap.hello.hello
#### snap文件系统
snap文件系统被划分为具有只读和读写两种不同权限的区域每个snap应用有其独有的受限文件目录如下图所示
![](https://www.ubuntukylin.com/upload/201708/1501752729610536.png)
可以通过如下方式查看某应用的文件访问权限:
$ snap install hello
hello 2.10 from 'canonical' installed
$ snap run --shell hello.hello
$ env | grep SNAP
SNAP_USER_COMMON=/home/kylin/snap/hello/common
单用户所有版本应用的可写目录
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:/var/lib/snapd/void
增加到LD_LABRARY_PATH的目录
SNAP_COMMON=/var/snap/hello/common
所有用户所有版本应用的可写目录
SNAP_USER_DATA=/home/kylin/snap/hello/20
单用户指定版本应用的可写目录
SNAP_DATA=/var/snap/hello/20
所有用户指定版本应用的可写目录
由此可见一个snap应用具有写权限的目录是极其有限的并且每个snap应用都有其独立的可写目录。snap文件系统对snap应用相关目录的权限配置说明这种方式实现了应用与应用应用与系统之间的隔离。
同时这种方式对snap应用的升级和回滚提供了很好的支持升级时只需将确定版本的相关目录复制到更高版本的对应目录而回退只需删除更高版本的目录。
#### AppArmor
AppArmor是一个强制访问控制系统在内核层面对进程可访问的资源进行控制。 在snap应用程序安装时系统会为其中的每一个命令生成其特有的AppArmor配置文件。内核对可执行程序的Capability限制也可以通过Aparmor来配置。当执行应用程序中的命令时AppArmor机制可保证此命令不会越权访问。 作为一种内核中的安全机制在ubuntu classic系统中也同时支持AppArmor提供的机制。但与classic系统不同snap系统对程序的访问控制更加严格基本做到“只满足程序执行所需的最小权限”。
#### Seccomp
Seccomp是一个内核接口访问过滤器snap应用程序通过其独有的过滤器访问内核接口。在snap应用程序启动之前会自动配置过滤器。Seccomp在snap系统中的作用类似于AppArmor。都是控制应用程序对系统资源的访问。
Snap接口调用
snap应用被严格限制在上面介绍的安全策略下但snap应用之间也需要进行通信比如硬件驱动作为一个snap应用肯定要为使用这个硬件的应用提供接口和服务。下面就简单说明一下snap应用之间的通信机制。
#### 默认安全策略
在没有特殊配置时snap应用使用默认的安全策略其中包含之前提到的snap文件系统中的默认目录访问控制以及以下部分策略
· snap应用安装目录的只读权限。
· 共享内存的读写权限(ie. /dev/shm/snap.SNAP_NAME.*)
· 相同应用的不同进程之间互相发送signal的权限
#### 安装模式
snap通过不同的安装模式提供不同的资源访问控制。
1) Devmode
devmode即为开发模式。使用以下命令将应用安装在此模式下
$ snap install hello --devmode
$ snap list
Name Version Rev Developer Notes
core 16-2.26.9 2381 canonical -
hello 2.10 20 canonical devmode
pc 16.04-0.8 9 canonical -
pc-kernel 4.4.0-83.106 68 canonical -
此模式为应用程序提供完全的访问权限,但会在日志中记录程序的越权行为。
在devmode下snap应用只能访问/snap/下的文件。
2) Classic
此模式将取消所有访问限制,不会在日志中记录越权行为。
在classic模式下snap应用可以访问/’下的文件。
#### Interfaces
除去默认安全策略为其提供的资源外snap应用没有权限访问系统其它资源。若snap应用需要使用系统资源或其它应用程序提供的资源需通过interfaces机制配置接口。interfaces接口分为两种slot(服务提供者)和plug(服务使用者)。
snap应用访问受限资源的示意如下
![](https://www.ubuntukylin.com/upload/201708/1501752836565131.png)
注意操作系统在snap系统中也作为snap应用的形式存在。
如图所示通过配置snap应用的plug和slot即可实现snap应用的互相访问。
查看系统上已经存在的plug和slot
$ snap interfaces
Slot Plug
:account-control -
:alsa -
:autopilot-introspection -
:bluetooth-control -
:browser-support -
:camera -
:classic-support classic
:core-support core:core-support-plug
.........
下面以一个例子说明plug和slot的使用。
name: blue
...
apps:
blue:
command: bin/blue
slots: 【bluez】
以上文件可作为一个蓝牙设备驱动程序的snap包打包控制文件。当此应用被安装时系统将为其分配security policy ID为snap.blue.blue并包含规则当blue启动时为其创建bluez slot。
要在其它应用中使用这个slot提供的功能则打包控制文件如下所示
name: blue-client
...
apps:
blue-client:
command: bin/blue-client
plugs: 【bluez】
同理当此应用被安装时系统将为其分配security policy ID为snap.blue-client.blue-client并包含规则允许此应用与snap.blue.blue通信。同时提供slot的安全规则也会改写为snap.blue.blue允许snap.blue-client.blue-client与其进行通信。
下图说明了snap应用与应用之间在严格的分隔限制下的互相通信。
![](https://www.ubuntukylin.com/upload/201708/1501752890346136.png)
snap系统由snap应用组成包括系统和内核都以snap包的形式出现在系统中。各个snap包之间通过interfaces互相提供服务来完成协同工作同时各个应用又不失自身的独立性。
### 总结
snap系统提供了强大的安全系统。与传统linux发行版相比snap系统中的应用更加独立、安全同时对snap应用权限的配置也更加简单。在日益增长的嵌入式和物联网需求与日益严峻的系统安全形势下snap系统表现出了比传统linux发行版更突出的优势。

View File

@ -0,0 +1,196 @@
---
title: 无线网卡支持
toc: true
date: 2020-08-29 13:48:46
tags:
categories:
---
## WifiDocs/WirelessCardsSupported(支持的无线卡)
  如果你要购买一台新电脑最好选择带有无线组件的电脑它是为Linux等免费软件设计的。为免费软件设计的网卡能给你提供更好的支持。兼容免费软件的设备也可以开箱即用。
  1.目前[ThinkPenguin.com](http://thinkpenguin.com/)提供了一款采用AR9170芯片组的802.11N USB卡可以保证免费软件的兼容性。此外还有用于笔记本电脑的MiniPCI wifi卡和连接蓝牙无线设备的USB蓝牙适配器。
  2.[Passys](http://www.passys.nl/wirelessnetwork)销售的PCI卡与Linux兼容虽然不兼容免费软件适用于台式电脑。
  3.[维基百科](http://en.wikipedia.org/wiki/Comparison_of_open_source_wireless_drivers)有更多关于哪些芯片组和驱动程序是免费软件兼容的信息。
  4.其他一些卡也兼容Linux但不兼容自由软件。这些通常可以工作但在某些情况下可能无法工作。
  即使您的无线网卡没有为Ubuntu设计的驱动程序您也可以使用[NDISWrapper](http://ndiswrapper.sourceforge.net/)和微软Windows的驱动程序让它工作。但这是以牺牲功能和可靠性为代价的。如果您使用这种方法您的网络连接很可能会很不稳定。
  其他Ubuntu的无线网络维基页面。
  1.[Wifi信息的中心页面](https://help.ubuntu.com/community/WifiDocs)
  2.[WifiDocs/WirelessTroubleShootingGuide(无线故障排除指南)](https://help.ubuntu.com/community/WifiDocs/WirelessTroubleShootingGuide)
  3.[无线故障排除程序](https://help.ubuntu.com/community/WirelessTroubleshootingProcedure)
### 无线卡
  要确定你的无线网卡/芯片组是什么首先要确定它是否是一个独立的设备插在电脑上。如果是独立的USB设备打开终端输入以下内容。
<li style="background: #DCDCDC">lsusb</li>
  并查找 "无线 "等字样,以找到你的卡类型。  
  对于非USB芯片但包含在计算机中的芯片输入以下内容。
<li style="background: #DCDCDC">lspci -v</li>
  并阅读最后一节。
### 按制造商
  社区已经为以下制造商创建了文章。
| 制造商 | 网卡类型 |
| ---- | -------- |
| 3Com | PCMCIA、PCI、PCI、Low、Profile、USB |
| A-Link | USB |
| Accton | PCI |
| Adaptec | PCMCIA |
| Advent | PCMCIA |
| ADDON | USB |
| Airlink101 | PCMCIA、PCI、USB |
| Aptiva | USB |
| Asus | PCMCIA PCI USB |
| Atlantis Land | PCI
| AVM | USB |
| Belkin | PCMCIA PCI ExpressCard/34 USB |
| Blitzz | Cardbus |
| Broadcom | miniPCI |
| Buffalo | PCMCIA PCI USB |
| Cable & Wireless | Cardbus
| Cisco | PCMCIA Cardbus |
| Cnet | PCMCIA PCI |
| Compaq | USB |
| CompUSA/Realtek | PCI |
| Conceptronic | USB
| Dell | USB |
| Dexlan | PCMCIA |
| Digicom | USB |
| Digitus | PCMCIA PCI Unknown USB |
| D-Link | PCMCIA PCI Unknown USB |
| Edimax | PCMCIA PCI Unknown USB |
| eHome | PCMCIA |
| Encore | PCI USB |
| Gigabyte Technology | miniPCI PCI |
| Hawking | PCMCIA PCI Cardbus USB |
| HP | PCI |
| Intel | miniPCI |
| KCorp | Cardbus |
| Level One | PCMCIA |
| Linksys | PCMCIA PCI USB |
| Longshine | PCMCIA |
| Motorola | PCMCIA
| MSI | miniPCI PCI |
| MyEssentials | USB |
| Netcomm | PCI USB |
| Netcore | USB |
| Netgear | PCMCIA PCI USB |
| Novatech | USB |
| Orient | USB |
| Pheenet | USB |
| Proxim/Orinoco | PCMCIA PCI |
| Qualcomm Atheros | miniPCI |
| RealTek | PCI USB |
| RetailPlus | USB |
| Rosewill | USB |
| Sierra | USB |
| Sitecom | PCMCIA PCI |
| SMC | PCMCIA PCI USB |
| Sonnet | PCMCIA |
| Sweex | PCMCIA PCI USB |
| Topcom | PCMCIA |
| TP-Link | PCMCIA PCI USB |
| Trendnet | PCMCIA PCI USB |
| Trust | Unknown |
| US Robotics | PCMCIA USB |
| Veho | USB |
| Westell | USB |
| Zonet | PCMCIA PCI USB |
| Zyxel | PCMCIA PCI USB |
| Various | miniPCI USB |
### 按版本
请参阅本页面。[WifiDocs/WirelessCardsByVersion(无线卡按版本分类)](https://help.ubuntu.com/community/WifiDocs/WirelessCardsByVersion)
### 按网卡
1.[WifiDocs/Device](https://help.ubuntu.com/community/WifiDocs/Device)
2.[WifiDocs/Device/ADDON_ADD-GWP110](https://help.ubuntu.com/community/WifiDocs/Device/ADDON_ADD-GWP110)
3.[WifiDocs/Device/AR5006EG](https://help.ubuntu.com/community/WifiDocs/Device/AR5006EG)
4.[WifiDocs/Device/AR5007](https://help.ubuntu.com/community/WifiDocs/Device/Actiontec)
5.[WifiDocs/Device/Actiontec](https://help.ubuntu.com/community/WifiDocs/Device/Actiontec)
6.[WifiDocs/Device/Airlink101_AWLL3026](https://help.ubuntu.com/community/WifiDocs/Device/Airlink101_AWLL3026)
7.[WifiDocs/Device/AirportExtreme](https://help.ubuntu.com/community/WifiDocs/Device/AirportExtreme)
8.[WifiDocs/Device/Atheros/AR9285](https://help.ubuntu.com/community/WifiDocs/Device/Atheros/AR9285)
9.[WifiDocs/Device/BCM43224 802.11a/b/g/n (rev 01)](https://help.ubuntu.com/community/WifiDocs/Device/BCM43224%20802.11a/b/g/n%20%28rev%2001%29)
10.[WifiDocs/Device/BT_Voyager_1055](https://help.ubuntu.com/community/WifiDocs/Device/BT_Voyager_1055)
11.[WifiDocs/Device/Belkin 300 N F7D2101](https://help.ubuntu.com/community/WifiDocs/Device/Belkin%20300%20N%20F7D2101)
12.[WifiDocs/Device/Belkin F5D8053](https://help.ubuntu.com/community/WifiDocs/Device/Belkin%20F5D8053)
13.[WifiDocs/Device/Belkin_F5D7050_ver_3000_(Ralink_rt73_driver)](https://help.ubuntu.com/community/WifiDocs/Device/Belkin_F5D7050_ver_3000_%28Ralink_rt73_driver%29)
14.[WifiDocs/Device/Belkin_F5D8010](https://help.ubuntu.com/community/WifiDocs/Device/Belkin_F5D8010)
15.[WifiDocs/Device/BuffaloWLIL11GUSB](https://help.ubuntu.com/community/WifiDocs/Device/BuffaloWLIL11GUSB)
16.[WifiDocs/Device/CiscoCB21AG](https://help.ubuntu.com/community/WifiDocs/Device/CiscoCB21AG)
17.[WifiDocs/Device/CompaqW200](https://help.ubuntu.com/community/WifiDocs/Device/CompaqW200)
18.[WifiDocs/Device/D-Link_WUA-1340](https://help.ubuntu.com/community/WifiDocs/Device/D-Link_WUA-1340)
19.[WifiDocs/Device/D-Link_WUA-2340](https://help.ubuntu.com/community/WifiDocs/Device/D-Link_WUA-2340)
20.[WifiDocs/Device/DWA-111](https://help.ubuntu.com/community/WifiDocs/Device/DWA-111)
21.[WifiDocs/Device/DWA-140](https://help.ubuntu.com/community/WifiDocs/Device/DWA-140)
22.[WifiDocs/Device/DWA-552](https://help.ubuntu.com/community/WifiDocs/Device/DWA-552)
23.[WifiDocs/Device/DWL-122](https://help.ubuntu.com/community/WifiDocs/Device/DWL-122)
24.[WifiDocs/Device/DWL-520vE1](https://help.ubuntu.com/community/WifiDocs/Device/DWL-520vE1)
25.[WifiDocs/Device/DWL-G122_(Rev_B)](https://help.ubuntu.com/community/WifiDocs/Device/DWL-G122_%28Rev_B%29)
26.[WifiDocs/Device/DWL-G122_(Rev_C1)](https://help.ubuntu.com/community/WifiDocs/Device/DWL-G122_%28Rev_C1%29)
27.[WifiDocs/Device/DWL-G650+](https://help.ubuntu.com/community/WifiDocs/Device/DWL-G650%2B)
28.[WifiDocs/Device/EdimaxEW7128G](https://help.ubuntu.com/community/WifiDocs/Device/EdimaxEW7128G)
29.[WifiDocs/Device/EdimaxEW7128UG]()https://help.ubuntu.com/community/WifiDocs/Device/EdimaxEW7128UG
30.[WifiDocs/Device/EnGenius EUB9603](https://help.ubuntu.com/community/WifiDocs/Device/EnGenius%20EUB9603)
31.[WifiDocs/Device/F5D7000](https://help.ubuntu.com/community/WifiDocs/Device/F5D7000)
32.[WifiDocs/Device/F5D7010](https://help.ubuntu.com/community/WifiDocs/Device/F5D7010)
33.[WifiDocs/Device/F7D2102](https://help.ubuntu.com/community/WifiDocs/Device/F7D2102)
34.[WifiDocs/Device/Fritz!WLAN_USB_Stick](https://help.ubuntu.com/community/WifiDocs/Device/Fritz%21WLAN_USB_Stick)
35.[WifiDocs/Device/ICIDU_NI-707529_150N_ PCI-E](https://help.ubuntu.com/community/WifiDocs/Device/ICIDU_NI-707529_150N_%20PCI-E)
36.[WifiDocs/Device/IntersilPrism25Wavelan](https://help.ubuntu.com/community/WifiDocs/Device/IntersilPrism25Wavelan)
37.[WifiDocs/Device/Linksys WMP600N](https://help.ubuntu.com/community/WifiDocs/Device/Linksys%20WMP600N)
38.[WifiDocs/Device/Linksys WUSB600N](https://help.ubuntu.com/community/WifiDocs/Device/Linksys%20WUSB600N)
39.[WifiDocs/Device/LinksysWPC54GS-UK](https://help.ubuntu.com/community/WifiDocs/Device/LinksysWPC54GS-UK)
40.[WifiDocs/Device/LinksysWUSB11](https://help.ubuntu.com/community/WifiDocs/Device/LinksysWUSB11)
41.[WifiDocs/Device/LinksysWUSB54GC](https://help.ubuntu.com/community/WifiDocs/Device/LinksysWUSB54GC)
42.[WifiDocs/Device/LinksysWUSB54GP](https://help.ubuntu.com/community/WifiDocs/Device/LinksysWUSB54GP)
43.[WifiDocs/Device/Linksys_WMP54GX](https://help.ubuntu.com/community/WifiDocs/Device/Linksys_WMP54GX)
44.[WifiDocs/Device/Linksys_WUSB54GS_v1_&_v2](https://help.ubuntu.com/community/WifiDocs/Device/Linksys_WUSB54GS_v1_%26_v2)
45.[WifiDocs/Device/NEXXT NW122NXT12](https://help.ubuntu.com/community/WifiDocs/Device/NEXXT%20NW122NXT12)
46.[WifiDocs/Device/NetgearMA111](https://help.ubuntu.com/community/WifiDocs/Device/NetgearMA111)
47.[WifiDocs/Device/NetgearWG111](https://help.ubuntu.com/community/WifiDocs/Device/NetgearWG111)
48.[WifiDocs/Device/Netgear_WG311_v3](https://help.ubuntu.com/community/WifiDocs/Device/Netgear_WG311_v3)
49.[WifiDocs/Device/PENGUIN80211N](https://help.ubuntu.com/community/WifiDocs/Device/PENGUIN80211N)
50.[WifiDocs/Device/Pentagram_Hornet_USB_Lite](https://help.ubuntu.com/community/WifiDocs/Device/Pentagram_Hornet_USB_Lite)
51.[WifiDocs/Device/Proxim RangeLAN-DS](https://help.ubuntu.com/community/WifiDocs/Device/Proxim%20RangeLAN-DS)
52.[WifiDocs/Device/RT3090](https://help.ubuntu.com/community/WifiDocs/Device/RT3090)
53.[WifiDocs/Device/RTL8180L](https://help.ubuntu.com/community/WifiDocs/Device/RTL8180L)
54.[WifiDocs/Device/Ralink RT5390](https://help.ubuntu.com/community/WifiDocs/Device/Ralink%20RT5390)
55.[WifiDocs/Device/RalinkRT2860](https://help.ubuntu.com/community/WifiDocs/Device/RalinkRT2860)
56.[WifiDocs/Device/Ralink_RT5370](https://help.ubuntu.com/community/WifiDocs/Device/Ralink_RT5370)
57.[WifiDocs/Device/Realtek 8172](https://help.ubuntu.com/community/WifiDocs/Device/Realtek%208172)
58.[WifiDocs/Device/RealtekRTL8187b](https://help.ubuntu.com/community/WifiDocs/Device/RealtekRTL8187b)
59.[WifiDocs/Device/Rosewill RNX-N150UBE](https://help.ubuntu.com/community/WifiDocs/Device/Rosewill%20RNX-N150UBE)
60.[WifiDocs/Device/Rosewill RNX-N2LX](https://help.ubuntu.com/community/WifiDocs/Device/Rosewill%20RNX-N2LX)
61.[WifiDocs/Device/RosewillRNXN150UBE](https://help.ubuntu.com/community/WifiDocs/Device/RosewillRNXN150UBE)
62.[WifiDocs/Device/Sabrent 802.11n Wireless PCI](https://help.ubuntu.com/community/WifiDocs/Device/Sabrent%20802.11n%20Wireless%20PCI)
63.[WifiDocs/Device/Sabrent PCI-G802](https://help.ubuntu.com/community/WifiDocs/Device/Sabrent%20PCI-G802)
64.[WifiDocs/Device/SabrentUSB-G802](https://help.ubuntu.com/community/WifiDocs/Device/SabrentUSB-G802)
65.[WifiDocs/Device/SparkLAN WL-850R](https://help.ubuntu.com/community/WifiDocs/Device/SparkLAN%20WL-850R)
66.[WifiDocs/Device/TL-WN722N](https://help.ubuntu.com/community/WifiDocs/Device/TL-WN722N)
67.[WifiDocs/Device/TP-LINK_TL-WN781ND](https://help.ubuntu.com/community/WifiDocs/Device/TP-LINK_TL-WN781ND)
68.[WifiDocs/Device/TP-Link_TL-WN620G_(ndiswrapper)](https://help.ubuntu.com/community/WifiDocs/Device/TP-Link_TL-WN620G_%28ndiswrapper%29)
69.[WifiDocs/Device/Tenda W522U USB](https://help.ubuntu.com/community/WifiDocs/Device/Tenda%20W522U%20USB)
70.[WifiDocs/Device/Tenda_W311M](https://help.ubuntu.com/community/WifiDocs/Device/Tenda_W311M)
71.[WifiDocs/Device/Topcom_Skyracer_USB_4001g_(WLAN-USB-Stick)](https://help.ubuntu.com/community/WifiDocs/Device/Topcom_Skyracer_USB_4001g_%28WLAN-USB-Stick%29)
72.[WifiDocs/Device/WG111T](https://help.ubuntu.com/community/WifiDocs/Device/WG111T)
73.[WifiDocs/Device/WG121](https://help.ubuntu.com/community/WifiDocs/Device/WG121)
74.[WifiDocs/Device/ipn2220](https://help.ubuntu.com/community/WifiDocs/Device/ipn2220)
75.[WifiDocs/Device/wpn111](https://help.ubuntu.com/community/WifiDocs/Device/wpn111)
76.[WifiDocs/Device/xg-301](https://help.ubuntu.com/community/WifiDocs/Device/xg-301)

View File

@ -0,0 +1,218 @@
---
title: 震惊没想到你是这样的flatpak...
toc: true
date: 2019-06-24 09:04:06
tags:
categories:
---
![](https://www.ubuntukylin.com/upload/201707/1500013249421469.jpg)
**引言**
之前我们介绍过如何在优麒麟和银河麒麟社区版上构建snap/flatpak包传送门,今天我们来更深入的认识下flatpak
**Flatpak**(前世为xdg-app) 是一种用于构建分发安装和运行应用程序的技术。它主要针对的是Linux桌面通过在沙箱中隔离应用程序来提高Linux桌面的安全性允许应用程序安装在任何Linux发行版上。
### 历史:
2013: 在[GNOME Developer Experience hackfest, Brussels](https://wiki.gnome.org/DeveloperExperience/Hackfest2013)大会后萌生在GNOME中使用应用程序容器技术的念头次年开始开发。
2016年5月: 第一个主版本xdg-app发布。
    6月重命名为flatpak。
    8月endless OS 3.0, 第一个默认支持Flatpak的发行版。
   
    11月ClearLinux声明采用flatpak。
2017年2月 最新的flatpak已经可以在Arch, Debian, Fedora, Gentoo, Mageia, openSUSE, Ubuntu等的最新版本上运行。
### 基本概念:
#### 运行时(runtimes)
“运行时”提供应用程序所需的基本依赖。有各种各样的“运行时”,比如“Freedesktop运行时”“GNOME运行时”。“Freedesktop运行时”包含一系列必要的库和服务包括D-Bus, GLib, PulseAudio, X11和Wayland等。“GNOME运行时”基于“FreeDesktop运行时”增加了一些GNOME平台相关的库比如GStreamer, GTK+, GVFS等。必须针对运行时构建每个应用程序并且必须在主机系统上安装此运行时才能运行应用程序。用户可以同时安装多个不同的运行时包括不同版本的同一个运行时。KDE runtime正在开发中。
每一个运行时可以看做一个’/usr 文件系统,当程序运行时,它的运行时挂载在‘/usr上。
#### 捆绑库(Bundled libraries)
当一个程序需要的依赖不在运行时中,使用捆绑库来绑定这些依赖到程序上。
#### SDK软件开发套件
SDK也是一个“运行时”是用于构建应用程序的特殊类型的运行时它包含了构建和打包工具devel parts如头文件编译器和调试器。通常SDK与“运行时”配对由应用程序使用。
#### 扩展Extensions
一个扩展是对于运行时或程序的可选插件一般用于把translations和debug信息从运行时分离出来比如, org.freedesktop.Platform.Locale 可以追加到org.freedesktop.Platform运行时上用来添加翻译。
#### 沙箱Sandbox
使用Flatpak每个应用程序都是在孤立的环境中构建和运行的。默认情况下应用程序只能“查看”自身及其“运行时”,访问用户文件网络graphics sockets总线和设备上的子系统必须明确授予权限访问其他内容如其他进程是不允许的。可以通过Portals机制在沙箱内访问外面系统比如打印截图等
### 原理:
Flatpak主要使用了如下技术
1. [bubblewrap](https://github.com/projectatomic/bubblewrap):依赖它作为沙箱的底层实现, 限制了应用程序访问操作系统或用户数据的能力,并且提供了非特权用户使用容器的能力。
2. Systemd将各个subsystem和cgroup树关联并挂载好为沙箱创建 cgroups。
3. D-Bus, 为应用程序提供高层APIs。
4. 使用Open Container Initiative的OCI格式作为单文件的传输格式方便传输。
5. 使用OSTree系统用于版本化和分发文件系统树。
6. 使用Appstream 元数据使得Flatpak应用程序在软件中心可以完美呈现出来。
而其中最重要的当属bubblewrap它是整个应用沙箱构建的关键主要利用了如下内核特性
#### Namespaces:
命名空间是对全局系统资源的一个封装隔离使得处于不同namespace的进程拥有独立的全局系统资源改变一个namespace中的系统资源只会影响当前namespace里的进程对其他namespace中的进程没有影响。它控制了进程的可见范围例如网络、挂载点、进程等等。同时使得非特权用户可以创建沙箱。它有以下几类
● Mount namespace (CLONE_NEWNS):
用来隔离文件系统的挂载点, 使得不同的mount namespace拥有自己独立的挂载点信息不同的namespace之间不会相互影响这对于构建用户或者容器自己的文件系统目录非常有用。bubblewrap 总是创建一个新的mount namespace, root挂载在tmpfs上用户可以明确指定文件系统的哪个部分在沙盒中是可见的。
● User namespaces (CLONE_NEWUSER):
用来隔离用户权限相关的Linux资源包括用户ID 和组ID 在不同的user namespace中同样一个用户的user ID 和group ID可以不一样换句话说一个用户可以在父user namespace中是普通用户在子user namespace中是超级用户超级用户只相对于子user namespace所拥有的资源无法访问其他user namespace中需要超级用户才能访问资源
● IPC namespaces (CLONE_NEWIPC):
沙箱会得到所有不同形式的IPCs的一份拷贝比如SysV 共享内存和信号量等。
● PID namespaces (CLONE_NEWPID):
用来隔离进程的ID空间沙箱内的程序看不见任何沙箱外的进程此外, bubblewrap 会运行一个pid为1的程序在容器中,用来处理回收子进程的需求。
● Network namespaces (CLONE_NEWNET):
用来隔绝网络在它自己的network namespace中只有一个回环设备。
● UTS namespace (CLONE_NEWUTS):
允许沙箱拥有自己独立的hostname和domain name.
#### Cgroups:
cgroup和namespace类似也是将进程进行分组但它的目的和namespace不一样namespace是为了隔离进程组之间的资源而cgroup是为了对一组进程进行统一的资源监控和限制。
#### Bind Mount:
将一个目录(或文件)中的内容挂载到另一个目录(或文件)上.
#### Seccomp rules
Linux kernel 所支持的一种简洁的sandboxing机制。它能使一个进程进入到一种“安全”运行模式该模式下的进程只能调用4种系统调用system calls即read(), write(), exit()和sigreturn(),否则进程便会被终止。
同时bubblewrap 使用PR_SET_NO_NEW_PRIVS 关闭 setuid 二进制程序。
当一个进程或其子进程设置了PR_SET_NO_NEW_PRIVS 属性,则其不能访问一些无法share的操作,如setuid, 和chroot。
### 实验:
接下来我们通过如下方式进入到一个flatpak创建的沙箱中
安装程序所需的“运行时”和Sdk
$ flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo
$ flatpak install gnome org.gnome.Platform//3.24 org.gnome.Sdk//3.24
安装gedit:
$ flatpak remote-add --from gnome-apps https://sdk.gnome.org/gnome-apps.flatpakrepo
$ flatpak install gnome-apps org.gnome.gedit
创建一个devel sandbox中的shell:
$ flatpak run --devel --command=bash org.gnome.gedit
可以看到此沙箱中有个进程且flatpak-bwrap pid为1。
$ ps
PID TTY TIME CMD
1 ? 00:00:00 flatpak-bwrap
2 ? 00:00:00 bash
5 ? 00:00:00 ps
查看当前进程所属的namespace括号里的数字标识不同的namespace
$ ls -l /proc/&&/ns
total 0
15:48 cgroup -> cgroup:【4026531835】
15:48 ipc -> ipc:【4026531839】
15:48 mnt -> mnt:【4026532241】
15:48 net -> net:【4026532244】
15:48 pid -> pid:【4026532242】
15:48 user -> user:【4026532371】
15:48 uts -> uts:【4026531838】
然后在主机中打开另一个终端查看主机中当前进程的namespace:
$ ls /proc/&&/ns
total 0
15:56 cgroup -> cgroup:【4026531835】
15:56 ipc -> ipc:【4026531839】
15:56 mnt -> mnt:【4026531840】
15:56 net -> net:【4026531957】
15:56 pid -> pid:【4026531836】
15:56 user -> user:【4026531837】
15:56 uts -> uts:【4026531838】
可以看到沙箱中的进程所属的namespace与主机环境下进程的namespace相比它们的mount ,net, pid, user namespace不同这时我们在主机环境下把ping文件拷贝进主目录gedit声明了对/home的访问权限然后在sandbox shell中执行ping 192.168.0.1,会发现报错:
$ ./ping 192.168.0.1
ping: socket: Operation not permitted
因为gedit没有申请网络权限它和主机在不同的network namespaces中。
怎么样是不是很有趣你还能在这个沙箱中做更多有趣的探索行动起来一起来flatpak吧

View File

@ -0,0 +1,300 @@
---
title: 优麒麟团队刘正元浅谈“Linux通用块层之IO合并”
toc: true
date: 2019-06-24 09:02:40
tags:
categories:
---
本文作者**刘正元**,来自天津麒麟(优麒麟开发团队之一), linux 内核爱好者,对内核 IO 子系统和内核调试工具这块比较感兴趣,向上游内核贡献过一些 patch目前在公司负责文件 IO 协议栈的调试调优。在系统开发期间,刘正元也曾在宋宝华“ [Linux阅码场](https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652664651&idx=1&sn=3b908b92b4209fd49bac561814369e5a&chksm=810f35d6b678bcc0353c80e744244ab61ca81b93ae4adf18dfdff28ab35b6f97c0e7635f5f46&mpshare=1&scene=1&srcid=0605uHWZBejaZQ1PEIru1IjU#rd)”微信公众平台发表多篇文章,本文也是出自该处。
![](https://www.ubuntukylin.com/upload/201806/1528256784870902.jpg)
所谓请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO请求合并成单个IO请求一并处理从而提升IO请求的处理效率。在前面有关通用块层介绍的系列文章当中我们或多或少地提及了IO请求合并的概念本篇我们从头集中梳理IO请求在block layer的来龙去脉以此来增强对IO请求合并的理解。
首先来看一张图下面的图展示了IO请求数据由用户进程产生到最终持久化存储到物理存储介质其间在内核空间所经历的数据流以及IO请求合并可能的触发点。
![](https://www.ubuntukylin.com/upload/201806/1528254005961032.png)
从内核的角度而言进程产生的IO路径主要有图中①②③所示的三条
 缓存IO,对应图中的路径①系统中绝大部分IO走的这种形式充分利用filesystem层的page cache所带来的优势 应用程序产生的IO经系统调用落入page cache之后便可以直接返回page cache中的缓存数据由内核回写线程在适当时机负责同步到底层的存储介质之上当然应用程序也可以主动发起回写过程如fsync系统调用来确保数据尽快同步到存储介质上从而避免系统崩溃或者掉电带来的数据不一致性。缓存IO可以带来很多好处首先应用程序将IO丢给page cache之后就直接返回了避免了每次IO都将整个IO协议栈走一遍从而减少了IO的延迟。其次page cache中的缓存最后以页或块为单位进行回写并非应用程序向page cache中提交了几次IO,回写的时候就需要往通用块层提交几次IO,这样在提交时间上不连续但在空间上连续的小块IO请求就可以合并到同一个缓存页中一并处理。再次如果应用程序之前产生的IO已经在page cache中后续又产生了相同的IO那么只需要将后到的IO覆盖page cache中的旧IO这样一来如果应用程序频繁的操作文件的同一个位置我们只需要向底层存储设备提交最后一次IO就可以了。最后应用程序写入到page cache中的缓存数据可以为后续的读操作服务读取数据的时候先搜索page cache如果命中了则直接返回如果没命中则从底层读取并保存到page cache中下次再读的时候便可以从page cache中命中。
 非缓存IO带蓄流对应图中的路径②这种IO绕过文件系统层的cache。用户在打开要读写的文件的时候需要加上“O_DIRECT”标志意为直接IO不让文件系统的page cache介入。从用户角度而言应用程序能直接控制的IO形式除了上面提到的“缓存IO”剩下的IO都走的这种形式就算文件打开时加上了”O_SYNC”标志最终产生的IO也会进入蓄流链表图中的Plug List。如果应用程序在用户空间自己做了缓存那么就可以使用这种IO方式常见的如数据库应用。
 非缓存IO不带蓄流对应图中的路径③内核通用块层的蓄流机制只给内核空间提供了接口来控制IO请求是否蓄流用户空间进程没有办法控制提交的IO请求进入通用块层的时候是否蓄流。严格的说用户空间直接产生的IO都会走蓄流路径哪怕是IO的时候附上了“O_DIRECT”和”O_SYNC”标志可以参考《Linux通用块层介绍part1: bio层》中的蓄流章节用户间接产生的IO如文件系统日志数据、元数据有的不会走蓄流路径而是直接进入调度队列尽快得到调度。注意一点通用块层的蓄流只提供机制和接口而不提供策略至于需不需要蓄流、何时蓄流完全由内核中的IO派发者决定。
应用程序不管使用图中哪条IO路径内核都会想方设法对IO进行合并。内核为促进这种合并在IO协议栈上设置了三个最佳狙击点
* Cache页高速缓存
* Plug List蓄流链表
* Elevator Queue调度队列
### cache 合并
IO处在文件系统层的page cache中时只有IO数据还没有IO请求bio或request,只有page cache在读写的时候才会产生IO请求。本文主要介绍IO请求在通用块层的合并因此对于IO在cache层的合并只做现象分析不深入到内部逻辑和代码细节。
如果是缓存IO,用户进程提交的写数据会积聚在page cache中。cache保存IO数据的基本单位为page,大小一般为4K,因此cache又叫“页高速缓存” 用户进程提交的小块数据可以缓存到cache中的同一个page中最后回写线程将一个page中的数据一次性提交给通用块层处理。以dd程序写一个裸设备为例每次写1K数据连续写16次
  dd if=/dev/zero of=/dev/sdb bs=1k count=16
通过blktrace观测的结果为
  blktrace -d /dev/sdb -o - | blkparse -i -
![](https://www.ubuntukylin.com/upload/201806/1528254017439804.png)
bio请求在通用块层的处理情况主要是通过第六列反映出来的如果对blkparse的输出不太了解可以man一下blktrace。对照每一行的输出来看看应用程序产生的写IO经由page cache之后是如何派发到通用块层的
![](https://www.ubuntukylin.com/upload/201806/1528254026772374.png)
现阶段只关注IO是如何从page cache中派发到通用块层的所以后面的泻流、派发过程没有贴出来。回写线程kworker以8个扇区扇区大小为512B, 8个扇区为4K对应一个page大小为单位将dd程序读写的1K数据块派发给通用块层处理。dd程序写了16次回写线程只写了4次对应四次Qpage cache的缓存功能有效的合并了应用程序直接产生的IO数据。
文件系统层的page cache对读IO也有一定的作用带缓存的读IO会触发文件系统层的预读机制所谓预读有专门的预读算法通过判断用户进程IO趋势提前将存储介质上的数据块读入page cache中下次读操作来时可以直接从page cache中命中而不需要每次都发起对块设备的读请求。还是以dd程序读一个裸设备为例每次读1K数据连续读16次
  dd if=/dev/sdb of=/dev/zero bs=1K count=16
通过blktrace观测的结果为
  blktrace -d /dev/sdb -o - | blkparse -i -
![](https://www.ubuntukylin.com/upload/201806/1528254037273702.png)
同样只关注IO是如何从上层派发到通用块层的不关注IO在通用块层的具体情况先不考虑PIUDC等操作那么上面的输出可以简单解析为
![](https://www.ubuntukylin.com/upload/201806/1528254048278725.png)
读操作是同步的所以触发读请求的是dd进程本身。dd进程发起了16次读操作总共读取16K数据但是预读机制只向底层发送了两次读请求分别为0+32(16K), 32+64(32K)总共预读了16 + 32 = 48K数据并保存到cache中多预读的数据可以为后续的读操作服务。
### plug 合并
linuxer公众号中介绍bio和request的系列文章熟悉IO请求在通用块层的处理以及蓄流(plug)机制的原理和接口。特别推荐宋宝华老师写的《文件读写BIO波澜壮阔的一生》通俗易懂地介绍了一个文件io的生命周期。
每个进程都有一个私有的蓄流链表进程在往通用块层派发IO之前如果开启了蓄流功能那么IO请求在被发送给IO调度器之前都保存在蓄流链表中直到泄流(unplug)的时候才批量交给调度器。蓄流的主要目的就是为了增加请求合并的机会bio在进入蓄流链表之前会尝试与蓄流链表中保存的request进行合并,使用的接口为blk_attempt_plug_merge().本文是基于内核4.17分析的源码来源于4.17-rc1。
blk_attempt_plug_merge:
list_for_each_entry_reverse(rq, plug_list, queuelist) {
......
switch (blk_try_merge(rq, bio)) {
case ELEVATOR_BACK_MERGE:
merged = bio_attempt_back_merge(q, rq, bio);
break;
case ELEVATOR_FRONT_MERGE:
merged = bio_attempt_front_merge(q, rq, bio);
break;
case ELEVATOR_DISCARD_MERGE:
merged = bio_attempt_discard_merge(q, rq, bio);
break;
default:
break;
}
}
代码遍历蓄流链表中的request使用blk_try_merge找到一个能与bio合并的request并判断合并类型蓄流链表中的合并类型有三种ELEVATOR_BACK_MERGEELEVATOR_FRONT_MERGEELEVATOR_DISCARD_MERGE。普通文件IO操作只会进行前两种合并第三种是丢弃操作的合并不是普通的IO的合并故不讨论。
### bio后向合并 (ELEVATOR_BACK_MERGE)
为了验证IO请求在通用块层的各种合并形式准备了以下测试程序该测试程序使用内核原生支持的异步IO引擎可异步地向内核一次提交多个IO请求。为了减少page cache和文件系统的干扰使用O_DIRECT的方式直接向裸设备派发IO。
iotc.c
...
/* dispatch 3 4k-size ios using the io_type specified by user */
define NUM_EVENTS 3
define ALIGN_SIZE 4096
define WR_SIZE 4096
enum io_type {
SEQUENCE_IO,/* dispatch 3 ios: 0-4k(0+8), 4-8k(8+8), 8-12k(16+8) */
REVERSE_IO,/* dispatch 3 ios: 8-12k(16+8), 4-8k(8+8),0-4k(0+8) */
INTERLEAVE_IO, /* dispatch 3 ios: 8-12k(16+8), 0-4k(0+8),4-8k(8+8) */ ,
IO_TYPE_END
};
int io_units[IO_TYPE_END][NUM_EVENTS] = {
{0, 1, 2},/* corresponding to SEQUENCE_IO */
{2, 1, 0},/* corresponding to REVERSE_IO */
{2, 0, 1}/* corresponding to INTERLEAVE_IO */
};
char *io_opt = "srid:";/* acceptable options */
int main(int argc, char *argv[])
{
intfd;
io_context_t ctx;
struct timespec tms;
struct io_event events[NUM_EVENTS];
struct iocb iocbs[NUM_EVENTS],
*iocbp[NUM_EVENTS];
int i, io_flag = -1;;
void *buf;
bool hit = false;
char *dev = NULL, opt;
/* io_flag and dev got set according the options passed by user , dont paste the code of parsing here to shrink space */
fd = open(dev, O_RDWR | __O_DIRECT);
/* we can dispatch 32 IOs at 1 systemcall */
ctx = 0;
io_setup(32, &ctx);
posix_memalign(&buf,ALIGN_SIZE,WR_SIZE);
/* prepare IO request according to io_type */
for (i = 0; i < NUM_EVENTS; iocbp[i] = iocbs + i, ++i)
io_prep_pwrite(&iocbs[i], fd, buf, WR_SIZE, io_units[io_flag][i] * WR_SIZE);
/* submit IOs using io_submit systemcall */
io_submit(ctx, NUM_EVENTS, iocbp);
/* get the IO result with a timeout of 1S*/
tms.tv_sec = 1;
tms.tv_nsec = 0;
io_getevents(ctx, 1, NUM_EVENTS, events, &tms);
return 0;
}
测试程序接收两个参数第一个为作用的设备第二个为IO类型定义了三种IO类型SEQUENCE_IO顺序REVERSE_IO逆序INTERLEAVE_IO交替分别用来验证蓄流阶段的bio后向合并、前向合并和泄流阶段的request合并。为了减少篇幅此处贴出的源码删除了选项解析和容错处理只保留主干原版位于[点击此处](https://github.com/liuzhengyuan/iotc)。
为验证bio在蓄流阶段的后向合并用上面的测试程序iotc顺序派发三个写io:
./iotc-d/dev/sdb-s
-d指定作用的设备sdb-s指定IO方式为SEQUENCE_IO顺序表示顺序发起三个写请求bio0(0 + 8), bio1(8 + 8), bio2(16 + 8)。通过blktrace来观察iotc派发的bio请求在通用块层蓄流链表中的合并情况
blktrace -d /dev/sdb -o - | blkparse -i -
![](https://www.ubuntukylin.com/upload/201806/1528254084160608.png)
上面的输出可以简单解析为:
![](https://www.ubuntukylin.com/upload/201806/1528254095647471.png)
第一个bio(bio0)进入通用块层时此时蓄流链表为空于是申请一个request并用bio0初始化再将request添加进蓄流链表同时告诉blktrace蓄流已正式工作。第二个bio(bio1)到来的时候会走blk_attempt_plug_merge的逻辑尝试调用bio_attempt_back_merge与蓄流链表中的request合并发现正好能合并到第一个bio所在的request尾部于是直接返回。第三个bio(bio2)的处理与第二个同理。通过蓄流合并之后三个IO请求最终合并成了一个request(0 + 24)。用一副图来展示整个合并过程:
![](https://www.ubuntukylin.com/upload/201806/1528254105303637.png)
### bio前向合并 (ELEVATOR_FRONT_MERGE)
为验证bio在蓄流阶段的前向合并使用iotc逆序派发三个写io:
./iotc-d/dev/sdb-r
-r指定IO方式为REVERSE_IO逆序表示逆序发起三个写请求bio0(16 + 8),bio1(8 + 8), bio2(0 + 8)。blktrace的观察结果为
blktrace -d /dev/sdb -o - | blkparse -i -
![](https://www.ubuntukylin.com/upload/201806/1528254118631038.png)
上面的输出可以简单解析为:
![](https://www.ubuntukylin.com/upload/201806/1528254143306219.png)
与前面的后向合并相比唯一的区别是合并方式由之前的”M”变成了现在的”F”即在blk_attempt_plug_merge中走的是bio_attempt_front_merge分支。通过下面的图来展示前向合并过程
![](https://www.ubuntukylin.com/upload/201806/1528254164616153.png)
“plug合并”不会做request与request的进阶合并蓄流链表中的request之间的合并会在泄流的时候做即在下面介绍的“elevator合并”中做。
### elevator 合并
上面讲到的蓄流链表合并是为进程内的IO请求服务的每个进程只往自己的蓄流链表中提交IO请求进程间的蓄流链表相互独立互不干涉。但是多个进程可以同时对一个设备发起IO请求那么通用块层还需要提供一个节点让进程间的IO请求有机会进行合并。一个块设备有且仅有一个请求队列调度队列所有对块设备的IO请求都需要经过这个公共节点因此调度队列Elevator Queue是IO请求合并的另一个节点。
先回顾一下通用块层处理IO请求的核心函数blk_queue_bio(),上层派发的bio请求都会流经该函数或将bio蓄流到Plug List或将bio合并到Elevator Queue,或将bio生成request直接插入到Elevator Queue。blk_queue_bio()的主要处理流程为:
![](https://www.ubuntukylin.com/upload/201806/1528254202385663.png)
其中”A”标识的“合并到蓄流链表的request中”就是上一章介绍的“plug合并”。bio如果不能合并到蓄流链表中接下来会尝试合并到“B”标识的”合并到调度队列的request中”。”合并到调度队列的request中”只是“elevator合并”的第一个点。你可能已经发现了blk_queue_bio()将bio合并到蓄流链表或者将request添加进蓄流链表之后就没管了从路径①可以发现蓄流链表中的request最终都是要交给电梯调度队列的这正是”elevator合并”的第二个点关于泄流的时机请参考我之前写的《Linux通用块层介绍part1: bio层》。下面分别介绍这两个合并点
### bio合并到elevator
先看B表示的代码段
blk_queue_bio:
switch (elv_merge(q, &req, bio)) {
case ELEVATOR_BACK_MERGE:
if (!bio_attempt_back_merge(q, req, bio))
break;
elv_bio_merged(q, req, bio);
free = attempt_back_merge(q, req);
if (free)
__blk_put_request(q, free);
else
elv_merged_request(q, req, ELEVATOR_BACK_MERGE);
goto out_unlock;
case ELEVATOR_FRONT_MERGE:
if (!bio_attempt_front_merge(q, req, bio))
break;
elv_bio_merged(q, req, bio);
free = attempt_front_merge(q, req);
if (free)
__blk_put_request(q, free);
else
elv_merged_request(q, req, ELEVATOR_FRONT_MERGE);
goto out_unlock;
default:
break;
}
合并逻辑基本与”plug合并”相似先调用elv_merge接口判断合并类型然后根据是后向合并或是前向合并分别调用bio_attempt_back_merge和bio_attempt_front_merge进行合并操作由于操作对象从蓄流链表变成了电梯调度队列bio合并完了之后还需额外干几件事
1. 调用elv_bio_merged,该函数会调用电梯调度器注册的elevator_bio_merged_fn接口来通知调度器做相应的处理对于deadline调度器而言该接口为NULL。
2.寻找进阶合并参考我之前写的《Linux通用块层介绍part2: request层》中对进阶合并的描述如果bio产生了后向合并则调用attempt_back_merge试图进行后向进阶合并如果bio产生了前向合并则调用attempt_front_merge企图进行前向进阶合并。deadline的进阶合并接口为deadline_merged_requests 被合并的request会从调度队列中删除。通过下面的图示来展示后向进阶合并过程前向进阶合并同理。
![](https://www.ubuntukylin.com/upload/201806/1528254236803650.png)
3. 如果产生了进阶合并则被合并的request可以释放了参考上图可调用blk_put_request进行回收。如果只产生了bio合并合并后的request的长度和扇区地址都会发生变化需要调用elv_merged_request->elevator_merged_fn来更新合并后的请求在调度队列的位置。deadline对应的接口为deadline_merged_request其相应的操作为将合并的request先从调度队列移出再重新插进去。
“bio合并到elevator”的合并形式只会发生在进程间即只有一个进程在IO的时候不会产生这种合并形式原因在于进程在向调度队列派发IO请求或者试图与将bio与调度队列中的请求合并的时候是持有设备的队列锁得其他进程是不能往调度队列派发请求这也是通用块层单队列通道窄需要发展多队列的主要原因之一只有进程在将调度队列中的request逐个派发给驱动层的时候才会将设备队列锁重新打开即只有当一个进程在将调度队列中request派发给驱动的时候其他进程才有机会将bio合并到还未派发完的request中。所以想通过简单的IO测试程序来捕捉这种形式的合并比较困难这对两个IO进程的IO产生时序有非常高的要求故不演示。有兴趣的可以参考上面的github仓库里面有patch对内核特定的请求派发位置加上延时来改变IO请求本来的时序从而让测试程序人为的达到这种碰撞效果。
request在泄流的时候合并到elevator
通用块层的泄流接口为blk_flush_plug_list() 该接口主要的处理逻辑如下图所示
![](https://www.ubuntukylin.com/upload/201806/1528254245597629.png)
其中请求合并发生的点在__elv_add_request()。blk_flush_plug_list会遍历蓄流链表中的每个request然后将每个request通过_elv_add_request接口添加到调度队列中添加的过程中会尝试与调度队列中已有的request进行合并。
__elv_add_request:
case ELEVATOR_INSERT_SORT_MERGE:
/*
* If we succeed in merging this request with one in the
* queue already, we are done - rq has now been freed,
* so no need to do anything further.
*/
if (elv_attempt_insert_merge(q, rq))
break;
/* fall through */
case ELEVATOR_INSERT_SORT:
BUG_ON(blk_rq_is_passthrough(rq));
rq->rq_flags |= RQF_SORTED;
q->nr_sorted++;
if (rq_mergeable(rq)) {
elv_rqhash_add(q, rq);
if (!q->last_merge)
q->last_merge = rq;
}
q->elevator->type->ops.sq.elevator_add_req_fn(q, rq);
break;
泄流时走的是ELEVATOR_INSERT_SORT_MERGE分支正如注释所说的先让蓄流的request调用elv_attempt_insert_merge尝试与调度队列中的request合并如果不能合并则落入到ELEVATOR_INSERT_SORT分支该分支直接调用电梯调度器注册的elevator_add_req_fn接口将新来的request插入到调度队列合适的位置。其中elv_rqhash_add是将新加入到调度队列的request做hash索引这样做的好处是加快从调度队列寻找可合并的request的索引速度。
在泄流的时候调度队列中既有其他进程产生的request也有当前进程从蓄流链表中派发的requestblk_flush_plug_list是先将所有request派发到调度队列再一次性queue_unplugged而不是派发一个request就queue_unplugged。所以“request在泄流的时候合并到elevator”既是进程内的也可以是进程间的。
elv_attempt_insert_merge的实现只做request间的后向合并即只会将一个request合并到调度队列中的request的尾部。这对于单进程IO而言足够了因为blk_flush_plug_list在泄流的时候已经将蓄流链表中的request进行了list_sort按扇区排序。笔者曾经提交过促进进程间request的前向合并的patch见github但没被接收maintainerJens的解析是这种IO场景很难发生如果产生这种IO场景基本是应用程序设计不合理。通过增加时间和空间来优化一个并不常见的场景并不可取。
最后通过一个例子来验证进程内“request在泄流的时候合并到elevator”进程间的合并同样对请求派发时序有很强的要求在此不演示github中有相应的测试patch和测试方法。iotc使用下面的方式派发三个写io:
./iotc-d/dev/sdb-i
-i指定IO方式为INTERLEAVE_IO交替表示按扇区交替的方式发起三个写请求bio0(16 + 8),bio1(8 + 8), bio2(0 + 8)。blktrace的观察结果为
blktrace -d /dev/sdb -o - | blkparse -i -
![](https://www.ubuntukylin.com/upload/201806/1528254255647107.png)
上面的输出可以简单解析为:
![](https://www.ubuntukylin.com/upload/201806/1528254265486421.png)
bio0(16 + 8)先到达plug listbio1(0+8)到达时发现不能与plug list中的request合并于是申请一个request添加到plug list。bio2(8+8)到达时首先与bio1进行后向合并。之后进程触发泄流泄流接口函数会将plug list中的request排序因此request(0+16)先派发到调度队列此时调度队列为空不能进行合并。然后派发request(16+8),派发时调用elv_attempt_insert_merge接口尝试与调度队列中的其他request进行合并发现可以与request(0+16)进行后向合并于是两个request合并成一个最后向设备驱动派发的只有一个request(0+24)。整个过程可以用下面的图来展示:
![](https://www.ubuntukylin.com/upload/201806/1528254276774034.png)
### 小结
通过cache、plug和elevator自上而下的三层狙击应用程序产生的IO能最大限度的进行合并从而提升IO带宽降低IO延迟延长设备寿命。page cache打头阵既做数据缓存又做IO合并主要是针对小块IO进行合并因为使用内存页做缓存所以合并后的最大IO单元为页大小当然对于大块IO,page cache也会将它拆分成以页为单位下发这不影响最终的效果因为后面还有plug和elevator补刀。plug list竭尽全力合并进程内产生的IO,从设备的角度而言进程内产生的IO相关性更强合并的可能性更大plug list设计位于elevator queue之上而且又是每个进程私有的因此plug list既有利于IO合并又减轻了elevator queue的负担。elevator queue更多的是承担进程间IO的合并用来弥补plug list对进程间合并的不足如果是带缓存的IO这种IO合并基本上不会出现。从实际应用角度出发IO合并更多的是发生在page cache和plug list中。

View File

@ -0,0 +1,52 @@
---
title: '如何对优麒麟的登录界面截图 '
toc: true
date: 2020-06-09 11:50:34
tags:
categories:
---
有时用户需要对登录界面屏幕截图。例如如果用户想写一篇有关如何在优麒麟上安装Cinnamon 的技术文章登陆界面的截图就对初学者有帮助。无论你的原因是什么如果你想知道如何对优麒麟或Linux Mint的登陆界面截图让下面的技巧来告诉你怎么做吧。
对Ubuntu Kylin和Linux Mint的登录界面截图
这里的方法是创建一个可以从命令行界面运行的脚本,不要害怕这个脚本,使用它真的很简单。
第1步获取ImageMagic
打开终端然后使用以下命令安装ImageMagic。
sudo apt-get install imagemagick
第2步准备脚本
创建一个新的文件最好在你的home目录下将它命名为screenshot.sh或任何你喜欢的。在文件中添加以下几行
```
chvt 7;
sleep 5s;
DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0
xwd -root -out ~/screenshot.xwd;
convert ~/screenshot.xwd ~/screenshot.png;
rm ~/screenshot.xwd
```
在上述中chvt 7是虚拟控制台的数量。当你运行这个脚本后需要5秒来截图你可以把它改成任何你想要的数字会发现命名为screenshot.png的截图保存在你的home目录下。
第3步给脚本执行权限
你必须要给脚本执行权限:
sudo chmod +x screenshot.sh
第4步截图
现在当一切准备就绪后退出系统。进入用户登录模式后按Ctrl+Alt+F1输入你的用户认证然后像这样运行截图脚本
sudo ./screenshot.sh
一旦这个脚本运行时它会带你回到登录界面的图形界面chvt 7五秒钟后文件名为screenshot.png的截图将会保存在你的home目录下。
你可以根据自己的需要修改截图脚本。希望这个技巧能帮你对Ubuntu Kylin、Linux Mint或任何其他的Linux发行版的登录界面进行截图。如果你有任何疑问或建议随时欢迎与我们UK团队联系。

View File

@ -0,0 +1,32 @@
---
title: '如何快速设置优麒麟系统更新频率[新手提示] '
toc: true
date: 2020-06-09 11:51:23
tags:
categories:
---
新手们也许都喜欢保持自己的系统是最新的无论是安全更新、系统更新或应用程序更新。并且不喜欢等一个星期。是的在默认情况下Ubuntu Kylin的更新管理器会自动的在每周弹出一次除非它是个安全更新。
如果你也想保持自己的系统更新更频繁,你可以更改**更新设置**。在这个初学者技巧中我们将看到怎样使你的Ubuntu Kylin桌面更加频繁地更新。
在Ubuntu Kylin中更改更新频率
在开始菜单中搜索“更新”或“update”点击“软件更新器”
<img src="https://www.ubuntukylin.com/public/wiki-0610/图片1.png"></img>
在“软件更新器”中,点击“设置”:
<img src="https://www.ubuntukylin.com/public/wiki-0610/2.png"></img>
在“软件和更新”中,进入“更新”选项卡。新手可以看到用于更新系统的设置。比如对于你自己来说,默认设置是每天检查更新,但普通的更新每周只显示一次,然而,如果有 一个安全更新,它会立即通知你。
为获得更频繁的有关更新的通知,你可以更改设置来立即通知任何更新,你可以更改以下设置:
<img src="https://www.ubuntukylin.com/public/wiki-0610/3.png"></img>
当然即使不经常更新你也可以改变更新频率来提示这个选项完全取决于你。考虑到你想保持你的系统是最新的你应该遵循这些技巧来加快Ubuntu Kylin系统更新速度。

View File

@ -0,0 +1,17 @@
---
title: 快速检查电脑是否配备USB 3.0
toc: true
date: 2019-06-29 11:53:54
tags:
categories:
---
越来越多的电脑开始配备USB 3.0端口但是如何知道您的电脑是否带有3.0端口以及哪个端口是3.0呢?方法如下:
打开终端,使用以下命令:
$ lsusb
该命令显示系统中的USB相关信息检查结果如果发现显示“3.0 root hub”字样表明系统带有USB 3.0。
<img src="https://www.ubuntukylin.com/upload/images/usb30.png"></img>
接下来如何识别哪个端口为USB 3.0呢?
通常USB 3.0端口带有SS标记Super Speed的缩写。如果硬件厂商没有标记SS或USB 3则检查端口内部的颜色USB 3.0通常为蓝色。
<img src="https://www.ubuntukylin.com/upload/images/usb3_0port.jpg"></img>

View File

@ -0,0 +1,240 @@
---
title: 键盘快捷键设置
toc: true
date: 2019-05-20 16:41:51
tags:
categories:
---
此页面提供了可以让你更有效地使用桌面和应用程序的键盘快捷键的总览。如果不能使用鼠标或其他指点设备,查看 键盘导航 来获取更多关于只使用键盘浏览用户界面的信息。
## 桌面常用快捷键
* Alt+F4
关闭当前窗口。
* Alt+F2
弹出命令行窗口(永远快速运行命令行)
* Alt+F7
调整当前窗口位置
* Alt+F8
调整当前窗口大小
* Alt+F9
最小化当前窗口
* Alt+F10
最大化当前窗口
* Alt+Tab
在窗口之间快速切换。
* Ctrl+Alt+方向键
在工作区之间切换。
* Ctrl+Alt+Shift+方向键
将当前窗口移至其他工作区。
* Ctrl+Alt+Delete
注销。
* Ctrl+Super+D
隐藏所有窗口并显示桌面。再次按下按钮可以恢复窗口。
* Ctrl+Alt+L
锁定屏幕。
* 在Ubuntu中打开终端的快捷键是Ctrl+Alt+T在终端中打开新的选项卡的快捷键是Ctrl+Shift+T。
* win+D
最小化所有窗口
* win+↑
最大化当前窗口
* win+↓
还原或者最小化窗口
* win+←或→
半最大化当前窗口
* Alt+鼠标左键
移动当前窗口
* Alt+鼠标中键拖拽
调整当前窗口大小
* Ctrl+L
资源管理器中显示当前目录路径
* Ctrl+H
资源管理器中显示所有文件和文件夹(隐藏文件夹)
* Alt+Enter
显示被选中文件或文件夹属性
* Alt+Home
将被选中文件或文件夹放置主目录下
* Ctrl+Alt+L
锁屏
* Ctrl+Alt+方向键
切换工作区
* Ctrl+Alt+shift+方向键
移动窗口到另一个工作区
* Alt+Tab
在栏目间切换
* Alt+鼠标左键
移动当前窗口
* Alt+鼠标中键拖拽
调整当前窗口大小
* Ctrl+L
资源管理器中显示当前目录路径
* Ctrl+H
资源管理器中显示所有文件和文件夹(隐藏文件夹)
* Alt+Enter
显示被选中文件或文件夹属性
* Alt+Home
将被选中文件或文件夹放置主目录下
* Ctrl+Alt+L
锁屏
* Ctrl+Alt+方向键
切换工作区
* Ctrl+Alt+shift+方向键
移动窗口到另一个工作区
* Alt+Tab
在栏目间切换
## 常用编辑快捷方式
* Ctrl+A
在列表中选择所有文本或项目。
* Ctrl+X
剪切(移除)选中文本或项目并将其置于剪贴板。
* Ctrl+C
复制选中文本或项目并将其置于剪贴板。
* Ctrl+V
粘贴剪贴板内的内容。
* Ctrl+Z
撤销最近一次操作。
## 从屏幕捕捉
* Print Screen
获取屏幕截图。
* Alt+Print Screen
获取窗口的截图,自动保存至图片文件夹下。
* Shift+Print Screen
获取屏幕上某个区域的截图。光标变为十字。点击并拖动选择区域,自动保存。

View File

@ -0,0 +1,165 @@
---
title: Linux上的文件类型与默认图标
toc: true
date: 2019-06-24 09:01:53
tags:
categories:
---
## Linux上的文件类型与默认图标
**引言**
也许小伙伴们对 Linux 已经有一定程度的了解,或者已经是一名能够在工作和生活中活用它的 Linux 用户了。随着桌面环境的不断发展Linux 系统已经不再仅仅是一个面向极客和开发者的操作系统了,在 PC 上,上手 Linux 桌面已经可以变得像上手Windows 桌面一样简单。
本篇文章是一篇纯黑的技术软文,讲的是我们平时一般不会在意的东西,而且不会涉及具体编程方面的知识,所以小伙伴们不用担心文章过于晦涩难懂,尽情的一边喝茶一边涨知识吧!
### Windows上的文件类型与默认图标
在Windows上文件类型基于唯一后缀名进行区分比如——文本类型的后缀名是”.txt”而Win32应用程序的后缀名是“.exe”。在win10系统中这些后缀名默认被隐藏在文件管理器的选项中更改设置为显示就能够看到每个文件的后缀名了。
对于每一种文件类型Windows上都有一个默认图标一般exe的图标不是默认的而是应用自己定制的它的默认图标可以由默认打开它的应用决定比如——使用winrar作为默认应用打开”.zip”压缩文件那么所有的”.zip”类型文件默认图标都会变成winrar的图标而使用2345好压作为默认打开应用默认图标又会改变。
### Linux与Windows并不完全相同
在Linux系统上有一些文件没有后缀名比如Linux上的文本文件即使不加txt后缀一样的能够作为文本文件存在并被正确地显示和打开。
我们右键文本文件图标,打开属性窗口,可以看到“类型”:
![](https://www.ubuntukylin.com/upload/201812/1544597804892983.png)
我们可以推测:默认图标的显示是与这个类型属性相关的。
### 让我们做一个实验
为了验证这个结论,我们需要做一个小实验。
* 实验系统Ubuntu Kylin 18.10
* 实验对象doc、docx类型文件
* 实验方法:安装/卸载wps
也许大家没有注意过在安装或者卸载了系统上的wps以后doc和docx等类型文件的默认图标也改变了如果没有刷新或者重启一下
一般从优麒麟官网上下载的增强版自带了wps我们打开一个目录创建一个doc和docx文档
![](https://www.ubuntukylin.com/upload/201812/1544597909746823.png)
打开属性窗口:
![](https://www.ubuntukylin.com/upload/201812/1544600648905345.png)
![](https://www.ubuntukylin.com/upload/201812/1544600648593032.png)
可以看到它们的文件类型那么接下来我们打开终端Ctrl+Alt+T输入
sudo apt remove wps-office
![](https://www.ubuntukylin.com/upload/201812/1544600689772744.png)
![](https://www.ubuntukylin.com/upload/201812/1544600727686021.png)
卸载wps接下来回到刚才创建的doc和docx所在的目录刷新一下
![](https://www.ubuntukylin.com/upload/201812/1544600745317428.png)
这个时候的默认图标类型已经变了,接着再打开属性:
![](https://www.ubuntukylin.com/upload/201812/1544600761749681.png)
![](https://www.ubuntukylin.com/upload/201812/1544600786228952.png)
同样的文件,文件类型改变的同时图标也跟着改变,所以,之前所提出的推论是对的。
那么,我们在安装/卸载wps的时候它究竟做了什么
### MIME-Info database
我们可以看到在卸载wps的时候出现了一些mime相关的配置事实上Linux上的文件类型标准就是这个MIME-Info database所有文件类型相关的配置包括默认图标都是在这个database中定义的。
大家如果有兴趣,可以参考:[点击此处](https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-0.18.html)
/usr/share/mime/packages目录下存放着相关配置文件其中freedesktop.org.xml 是 Linux 默认的文件类型基准。在这里,我们先找到 wps-office-wps.xml并打开
![](https://www.ubuntukylin.com/upload/201812/1544600831986186.png)
其中comment、mime-type就是属性窗口中的文件类型
alias type顾名思义是mime-type的别名所以这些文件类型就被wps-office.doc覆盖了
generic-icon name即文件类型的默认图标名
glob partten如果文件名中有匹配则认为是该类型。
在/usr/share/icons目录下存放着默认图标
![](https://www.ubuntukylin.com/upload/201812/1544600848817269.png)
Linux的判断文件类型的最优先基准往往是通过文件名中的字段如果字段和MIME-database匹配则认为是该文件类型。然而并非所有文件类型都规定了匹配字段它们依旧能够确定类型但是如果重命名后包含了MIME-database的匹配字段则会优先使用对应类型覆盖原有的类型。
实际上在之前举出的本文件创建的例子中不需要后缀名的原因是文本类型的文件在创建的时候已经被赋予了MIME type只要文件名不与其它MIME type的基准冲突这个文本文件就能正常的显示和打开。
### DIY一个文件类型的图标
小伙伴们也许现在还有点一头雾水,没关系,接下来的干货才是重头戏;前面的看不懂?没关系,自己动手做一次,马上就理解了。
![](https://www.ubuntukylin.com/upload/201812/1544600873149787.png)
可以看到,命名为.so的文件的默认图标已经被小编改成了自己的图案那么究竟是怎么做到的呢接下来我们一步一步的完成。
**1、准备图标**
首先我们需要准备自己的文件类型图片一般使用png格式即可文件图标可以在网上下载自己喜欢的也可以使用GIMP自己绘制然后导出小编这里为了方便就自己简单的画了一下。GIMP可以在开始菜单中搜索gimp得到
![](https://www.ubuntukylin.com/upload/201812/1544600900397307.png)
![](https://www.ubuntukylin.com/upload/201812/1544600900866148.png)
关于GIMP的使用小编也是小白所以就不罗嗦了大家有兴趣的话自行百度一下吧。
我们打开/usr/share/icons/ukui-icon-theme目录:
![](https://www.ubuntukylin.com/upload/201812/1544604859921343.png)
我们把准备好的图标放进对应尺寸文件夹的mimetypes目录下比如48x48的png放到/usr/share/icons/ukui-icon-theme/48x48/mimetypes目录下。
由于在/usr/share目录下操作需要管理员权限所以建议以管理员身分运行文件管理器优麒麟18.10上,在终端输入:
sudo peony
就可以以管理员身分运行文件管理器当然小伙伴们也可以使用sudo cp在终端操作。
还有,这里一定要注意,我们不同尺寸目录下的图标文件名必须一样,不然等会儿图片会找不全。
**2、编写自己的配置文件**
就像wps做的那样我们也需要自己写一个.xml文件来覆盖原有的文件类型这同样需要管理员权限。
我们在/usr/share/mime/packages目录下创建一个文本文件命名为XXX.xml这里小编的是sharedlib.xml输入以下内容。
![](https://www.ubuntukylin.com/upload/201812/1544603156648367.png)
最关键的是alias type、generic-icon name和glob pattern三项。保存退出。
![](https://www.ubuntukylin.com/upload/201812/1544601011883301.png)
**3、更新**
现在我们的.so文件还没有变因为我们还需要手动更新它。
依次执行:
sudo gtk-update-icon-cache /usr/share/icons/ukui-icon-theme/
sudo update-mime-database -V /usr/share/mime
第一条命令将我们的自定图片更新到cache中使得文件管理器能够通过cache找到我们的icon
第二条命令将我们对配置的更改更新至MIME-database中这样我们的自定义配置就生效了。
我们刷新一下在看看,.so文件是不是变了打开.so文件的属性发现它的内容和mime-type也已经变成了我们自己写的类型。
也许有小伙伴们会问,为什么只有.so文件变了.so.1.2.3之类的文件没有变呢这就是glob参数的作用了大家有兴趣可以研究一下freedesktop.org.xml文件里面有对于application/x-sharedlib原来glob的标注不光是.so也能够识别类似.so.1.2.3的类型。
不知到大家是否有所收获呢本篇文章虽然没有涉及代码编程但是不同的人看一定会有不同的体会和收获吧在行文中小编凸显了一些细节也略写了一些细节希望大家看完这篇软文以后能够有所精进让我们在Linux的道路上共同进步吧。

View File

@ -0,0 +1,52 @@
---
title: 'Linux中你一定要掌握的网络基本命令! '
toc: true
date: 2019-06-24 09:10:27
tags:
categories:
---
不论你是一个有追求的 Linux 系统管理者,或是 Linux 狂热者,这些基础且重要的 Linux 网络命令你一定要了解!
在学习 Linux 的过程中,大家都会非常注意命令行的运用,想必也看过很多书来进行学习。在今天的文章中,我(注:作者为 Abhishek Prakash给大家总结一下曾让我在计算机网络工程这门课上帮助我拿到高分的网络命令集。欢迎大家拿出小抄赶紧记上希望对你也有用哦。
### 网络连通性
Ping发送一个 ICMP 回声请求消息给主机,一直持续到到你按下 Ctrl+C 。Ping 表示一个包通过 ICMP 从你的机器发送出去然后在IP层得到回应。Ping 可以检测你与另一台主机是否连通。
Telnet host在指定的端口与主机交互。telnet 端口默认是 23。其他比较常用的端口有回送端口7用来发送邮件 SMTP 25用户查询79。使用 Ctrl+] 退出 telnet。
### ARP
ARP 是用来将 IP 地址转换为以太网地址的。Root 用户可以增加/删除 ARP 条目。其中 ARP 的条目都是缓存在内核中的一般在20分钟后会自动删除。但 root 用户可以创建永久性的 ARP 条目。
arp -a打印 ARP 表
arp -s[pub]:增加条目
arp -a -d删除所有条目
### 路由
netstat -r打印路由表。路由表存储在内核中ip 通过它来将包发送到外网。
routed执行动态路由选择的 BSD 守护进程。实现 RIP 路由协议。只能在 root 权限下使用。
gatedgated 是实现 RIP 的另一个路由守护进程。同时使用 OSPF/EGP/RIP 。只能在 root 权限下使用。
traceroute可用来追踪IP数据包经过的路由信息。
netstat -rnf inet可显示 IPv4 的路由表。
sysctl net.inet.ip.forwarding=1使数据包继续传递把一个主机变成路由
routeroute 命令用来在路由表中设置静态路由。所有从 PC 到 IP/SubNet 的信息都要经过指定的网关 IP。这命令还可以用来设定默认路由。
route add|delete [-net|-host]:添加/删除静态路由route add 192.168.20.0/24 192.168.30.4)。
route flush删除所有路由。
route add -net 0.0.0.0 192.168.10.2:增加一个默认路由。
### 重要文件
/etc/hostsIP地址及名字
/etc/networksIP地址及网络名字
/etc/protocols协议号及协议名字
/etc/servicestcp/udp服务名字对应的端口号
### 工具以及网络性能分析
ifconfig[up]:开启接口
ifconfig[down|delete]:停止接口
tcpdump -i -vvv抓取和分析数据包的工具
netstat -w [seconds] -l [interface]:显示网络设置和数据
### 其他
nslookup通过查询 DNS 服务器将 IP 转换成名字,或把名字转换成 IP。比如nslookup ubuntukylin.com 会得到 ubuntukylin.com 的IP地址。
ftp在本地主机和远程主机之间传送文件。
rlogin远程登陆主机。

View File

@ -0,0 +1,231 @@
---
title: Linux命令及Linux终端的20个趣事
toc: true
date: 2019-06-24 09:15:34
tags:
categories:
---
玩Linux其乐无穷哈哈。不相信。记住我的话在文章结尾时你就会相信Linux确实好玩了。
![](https://www.ubuntukylin.com/upload/images/tl0.png)
### 命令sl (蒸汽机车)
你可能了解 ls 命令,并经常使用它来查看文件夹的内容。但是,有些时候你可能会拼写成 sl ,这时我们应该如何获得一些乐趣而不是看见“command not found”呢
安装 sl
![](https://www.ubuntukylin.com/upload/images/tl1.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl2.png)
![](https://www.ubuntukylin.com/upload/images/t13.png)
当你敲入的是LS而不是ls这个命令也会运行。
### 命令telnet
非也非也这可不像它平常那样复杂。你可能很熟悉telnet。Telnet 是一个文本化的双向网络协议。这里不需要安装什么东西。你需要的就是一个Linux系统和一个连通的网络。
![](https://www.ubuntukylin.com/upload/images/t14.png)
![](https://www.ubuntukylin.com/upload/images/tl5.png)
### 命令fortune
试试你未知的运气,终端里有时也有好玩的。
安装 fortune
![](https://www.ubuntukylin.com/upload/images/tl6.png)
### 命令rev翻转
它会把传递给它的的每个字符串都反过来,是不是很好玩。
![](https://www.ubuntukylin.com/upload/images/tl7.png)
### 命令factor
该谈点儿关于Mathematics的了这个命令输出给定数字的所有因子。
![](https://www.ubuntukylin.com/upload/images/tl8.png)
### 命令script
好的,这不是什么命令,而是一个脚本,一个很有趣的脚本。
![](https://www.ubuntukylin.com/upload/images/tl9.png)
### 命令Cowsay
一个在终端用ASCII码组成的小牛这个小牛会说出你想要它说的话。
安装Cowsay
![](https://www.ubuntukylin.com/upload/images/tl10.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl11.png)
如果用管道将fortune command命令重定向到cowsay会怎样呢
root@tecmint:~# fortune | cowsay
![](https://www.ubuntukylin.com/upload/images/tl12.png)
提示:‘|是管道命令符。通常它是将一个命令的输出作为下一个命令的输入。在上面的例子中fortune的输出作为cowsay命令的输出。管道命令会经常用在脚本和程序编写中。
xcowsay是一个图形界面程序。它与cowsay类似只是以一种图形的方式来表达可以说是X版本的cowsay。
![](https://www.ubuntukylin.com/upload/images/tl13.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl14.png)
![](https://www.ubuntukylin.com/upload/images/tl15.png)
cowthink是另一个命令。运行“cowthink Linux is sooo funny ”看看它与cowsay的不同吧。
![](https://www.ubuntukylin.com/upload/images/tl16.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl17.png)
### 命令yes
yes 是一个非常有趣又有用的命令,尤其对于脚本编写和系统管理员来说,它可以自动地生成预先定义的响应或者将其传到终端。
![](https://www.ubuntukylin.com/upload/images/tl18.png)
提示: (直到你按下ctrl+c才停止)
### 命令: toilet
什么?你在开玩笑吗! 当然没有,但肯定的是这个命令的名字太搞了,我也不知道这个命令的名字从何而来。
安装toilet
![](https://www.ubuntukylin.com/upload/images/tl19.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl20.png)
这个命令甚至提供了一些颜色和字体格式。
![](https://www.ubuntukylin.com/upload/images/tl21.png)
提示Figlet 是另外一个与toilet产生的效果类似的命令。
### 命令cmatrix
你可能看多好莱坞的电影黑客帝国并陶醉于被赋予Neo的能看到在矩阵中任何事物的能力或者你会想到一幅类似于Hacker的桌面的生动画面。
安装 cmatrix
![](https://www.ubuntukylin.com/upload/images/tl23.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl24.png)
### 命令: oneko
可能你坚信Linux的鼠标指针永远是同样的黑色或白色一点儿也不生动那你就错了。“oneko”是一个会让一个“Jerry”你的鼠标指针附着到你鼠标上的一个软件包。
安装 oneko
![](https://www.ubuntukylin.com/upload/images/tl25(1).png)
输出
![](https://www.ubuntukylin.com/upload/images/tl26.png)
![](https://www.ubuntukylin.com/upload/images/tl27.png)
提示关闭运行着oneko的终端时Jerry也会随之消失重新启动终端时也不会再出项。你可以将这个程序添加到启动选项中然后继续使用它。
### Fork炸弹
这是一段非常欠抽的代码。运行这个命令的后果自己负责。这个命令其实是一个fork炸弹它会以指数级的自乘直到所有的系统资源都被利用了或者系统挂起想要见识这个命令的威力你可以试一次这个命令但是后果自负记得在运行它之前关掉并保存其它所有程序和文件
![](https://www.ubuntukylin.com/upload/images/tl28.png)
### 命令while
下面的”while“命令是一个脚本这个脚本可以为你提供彩色的日期和文件直到你按下中断键ctrl+c。复制粘贴这个命令到你的终端。
![](https://www.ubuntukylin.com/upload/images/tl29.png)
![](https://www.ubuntukylin.com/upload/images/tl30.png)
提示:以上脚本通过下面的修改也会产生类似的输出但是还是有点不同的,在你的终端试试吧。
![](https://www.ubuntukylin.com/upload/images/tl31.png)
### 命令: espeak
将你的多媒体音箱的音量调到最大,然后在将这个命令复制到你的终端,来看看你听到上帝的声音时的反应吧。
安装 espeak
![](https://www.ubuntukylin.com/upload/images/tl32.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl33.png)
### 命令: aafire
在你的终端放一把火如何。把这个“aafire”敲到你的终端不需要什么引号看看这神奇的一幕吧。按下任意键中指该程序。
安装 aafire
![](https://www.ubuntukylin.com/upload/images/tl34.png)
输出
![](https://www.ubuntukylin.com/upload/images/tl35.png)
![](https://www.ubuntukylin.com/upload/images/tl36.png)
### 命令: bb
首先安装“apt-get install bb”,然后敲入“bb”看看会发生什么吧。
![](https://www.ubuntukylin.com/upload/images/tl37.png)
![](https://www.ubuntukylin.com/upload/images/tl38.png)
### 命令: url
如果在你的朋友面前用命令行来改变你的 twitter status 会不会很酷呢。用你的用户名密码和你想要的状态分别替换username, password 和“your status message“就可以了。
![](https://www.ubuntukylin.com/upload/images/tl39.png)
### ASCIIquarium
想要在终端弄一个水族馆该,怎么办?
![](https://www.ubuntukylin.com/upload/images/tl40.png)
### 安装 ASCIIquarium
下载并安装ASCIIquarium。
![](https://www.ubuntukylin.com/upload/images/tl41.png)
最后在终端运行“asciiquarium”或者“/usr/local/bin/asciiquarium”记得不要加引号神奇的一幕将在你眼前展现。
![](https://www.ubuntukylin.com/upload/images/tl42.png)
![](https://www.ubuntukylin.com/upload/images/tl43.png)
### 命令: funny manpages
首先安装“apt-get install funnymanpages”然后运行下面命令的man手册。其中一些
![](https://www.ubuntukylin.com/upload/images/tl44.png)
### Linux Tweaks
该到了做一些优化的时候了
![](https://www.ubuntukylin.com/upload/images/tl45.png)
Linux总是sexywho | grep -i blonde | date; cd ~; unzip; touch; strip; finger; mount; gasp; yes; uptime; umount; sleep如果你知道我的意思
还有一些其它的命令只是这些命令并不能在所有的系统上运行所以本文没有涉及到。比如说dog , filter, banner
使用愉快,你可以稍后再对我说谢谢:)

View File

@ -0,0 +1,84 @@
---
title: Linux新手大礼包学习Linux你必须知道的那些事儿
toc: true
date: 2019-06-24 14:31:49
tags:
categories:
---
 
  欢迎加入 Linux 的大家庭!对你来说,这可能还是一个陌生的领域,不过相信随着逐步深入的了解,你会喜欢上 Linux喜欢上开源的首先让我们来看一下Linux新手应该注意和了解哪些事情吧
### 1. 认识几个大牛
Linus Torvalds
生于1969年12月28日的芬兰赫尔辛基市拥有美国国籍。他是 Linux 内核的最早作者,随后发起了这个开源项目,担任 Linux 内核的首席架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了 Git 这个开源项目,并为主要的开发者。
Richard Matthew Stallman
简称 RMS生于1953年3月16日美国自由软件运动的精神领袖、GNU 计划 以及自由软件基金会的创立者。作为一个著名的黑客他的主要成就包括Emacs及后来的 GNU EmacsGNU C 编译器及GDB调试器。他所写作的GNU通用公共许可证是世上最广为采用的自由软件许可证为Copyleft观念开拓出一条崭新的道路。
Eric Steven Raymond
生于1957年12月4日程序员《大教堂与市集》的作者、《新黑客词 典》("Jargon File"的维护人、著名黑客。作为《新黑客词典》的主要编撰人以及维护者雷蒙很早就被认为是黑客文化的历史学家以及人类学家。但是在1997年以 后,雷蒙被广泛公认为是开放源代码运动的主要领导者之一,并且是最为大众所知道(并最具争议性)的黑客。
### 2. 了解Linux家族的明星成员
  **Red Hat Enterprise Linux**Red Hat Enterprise Linux 是 Red Hat 公司的 Linux 发行版,面向商业市场,包括大型机。红帽公司从 Red Hat Enterprise Linux 5 开始对企业版 LINUX 的每个版本提供10年的支持Red Hat Enterprise Linux 常简作 RHEL。Red Hat Enterprise Linux 大约3年发布一个新版本。
  **Fedora Linux**Fedora Linux 是较具知名度的 Linux 发行版之一。它是一套功能完备、更新快速的免费操作系统。而对赞助者 Red Hat 公司而言,它是许多新技术的测试平台,被认为可用的技术最终会加入到 Red Hat Enterprise Linux 中。
  **Centos**CentOS 全名为“社区企业操作系统”Community Enterprise Operating System是Linux发布版之一它是来自于 Red Hat Enterprise Linux 依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码因此有些要求高度稳定性的服务器以CentOS替代商业版的 Red Hat Enterprise Linux 使用。两者的不同,在于 CentOS 并不包含封闭源代码软件。CentOS 对上游代码的主要修改是为了卸载不能自由使用的商标。
  **Ubuntu**Ubuntu 是一个以桌面应用为主的 GNU/Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ Ubuntu ”一词,意思是“人性”。 Ubuntu 基于 Debian 发行版,与 Debian 的不同在于它每6个月会发布一个新版本。
  **SUSE Linux**SUSE 是 Linux 操作系统其中一个发布版也是德国的一个发布版。SUSE Linux 目前专注于企业市场。
  **openSUSE**openSUSE 是一个开放社区的计划,号称“最美丽的 Linux 发行版”。
  **Debian**Debian 是一种自由操作系统,全称 Debian GNU/Linux由Debian计划Debian Project组织维护Debian 是一个纯粹由自由软件所组合而成的操作环境。
  **Archlinux**Arch Linux(或称Arch)是一种以轻量简洁为设计理念的Linux发行版。其开发团队秉承简洁、优雅、正确和代码最小化的设计宗旨。Arch Linux 项目受 CRUX 启发,由 Judd Vinet 于2002年启动。
更多Linux版本请看这里 [Linux系统家族族谱](https://code.csdn.net/groups/7587/discources/935281)
### 3. 初学者必读的Linux基础书籍  
  要想学好Linux你至少需要一本好入门教材、一本linux指令参考手册、linux系统管理手册、讲解linux系统原理的书。这里我们推荐几部公认的好书
[《 鸟哥的Linux私房菜 基础学习篇》](https://book.douban.com/subject/4889838/) 鸟哥 著;人民邮电出版社
[《 鸟哥的Linux私房菜 服务器架设篇》](https://book.douban.com/subject/10794788/) 鸟哥 著;机械工业出版社
[《 Linux命令、编辑器与Shell编程》](https://book.douban.com/subject/25750712/) [美]索贝尔(Sobell·M.G.) 著; 清华大学出版社
[《 Linux设备驱动程序》](https://book.douban.com/subject/1723151/) 科波特 著; 中国电力出版社
[《 深入理解Linux内核》](https://book.douban.com/subject/2287506/) (美)博韦,西斯特 著; 中国电力出版社
[《 UNIX环境高级编程》](https://book.douban.com/subject/1788421/) W.Richard Stevens / Stephen A.Rago 著;人民邮电出版社
### 4. 熟悉Linux常用命令
* man 任何时候你觉得对一个命令行不是很确定都可以通过输入“man + 命令”来了解这个命令能确切是做什么的。
* ls :列出目录内容。
* pwd :在终端中显示当前工作目录的全路径。
* cd :要变更你当前所在的目录。
* mkdir :创建一个新的目录。
* cp :复制文件/重命名文件。
* mv :移动文件。
* find 和 locate搜索文件。
* kill :快速关闭一个进程。
* passwd :更改密码。
* md5sum 计算和检验MD5信息签名
* history :查询历史记录命令。
* sudo (super user do)命令允许授权用户执行超级用户或者其它用户的命令。
* touch :创建一个新文件,或者将文件的访问和修改时间更新为当前时间。
* chmod :修改文件的访问权限。
* chown :改变文件拥有者和所在用户组。
* apt APT是一个为Debian系列系统UbuntuKubuntu等等开发的高级包管理器在Gnu/Linux系统上它会为包自动智能地搜索、安装、升级以及解决依赖问题。
### 5. 小心新手常犯的几个错误 
 **不要以根用户登录**这是使用Unix的惯例除非必须那么不要轻易在根用户下运行任何东西。 
 **文件命名混乱**:避免使用美元符($),括弧和百分号(%等特殊字符这些字符对于shell有着特殊意义可能会引起冲突。避免使用空格不要使用无效字符“/”是根目录专用的。 
 **所有文件都混在一起**将Home目录放在一个独立的分区上可以在你重装系统甚至升级你的整个版本而不会丢失你的数据和个人设置。 
 **试图点击运行.exe文件**除非你安装了WINE双击那些.exe文件毫无用处。新用户需要知道无论是Linux还是Windows都只会运行针对自身系统开发的应用程序。  
 **以默认格式向微软Office用户发送OpenOffice文档**微软产品对其它操作系统和其它应用程序的友好性并不强许多新Linux用户在共享文件给朋友时往往会遇到麻烦因为对方无法阅读他们共享的文件格式因此新Linux用户要注意存储文件的格式确保它们能够被微软类似应用所打开。
 **忽视更新**新的更新可以为一些新的漏洞打上补丁。维持更新可以在一个易受损的系统与一个安全的系统之间构造分水岭。Linux的安全来自于不断地维护。    
 以上是一些操作习惯方面的错误,还有一些技术类型的错误,你可以查看《 避免UNIX和Linux中的常见错误》
### 6. 常去逛逛一些Linux社区和网站
国内的专业Linux网站
  [ChinaUnix](https://www.chinaunix.net/) 创办于2001年是一个以讨论Linux/Unix类操作系统技术、软件开发技术、数据库技术和网络应用技术等为主的开源技术社区网站。
  [LinuxCN](https://linux.cn/)Linux中国是专注于中文Linux技术、资讯的社区在这里你可以获得一手的Linux资讯和技术知识。
国外著名Linux网站
  [Linux Online](https://www.linux.org/) 最权威的Linux网站文章讨论无所不包软件硬件应有尽有。
  [Linux国际协会(Linux International)](https://li.org/)有大量的Linux资源列表。
  [Linux](https://www.linux.com/)学习Linux的最好网站也是Linux使用经验的汇聚地。
  [Linuxforums](https://www.linuxforums.org/) 提供Linux的软件资源Linux论坛Linux服务器发行版的信息LINUX文章教程等信息的综合性网站。

View File

@ -0,0 +1,210 @@
---
title: 优麒麟目录结构
toc: true
date: 2019-10-21 14:58:27
tags:
categories:
---
对于Linux爱好者来说深入了解Linux文件目录结构的标准和每个目录的详细功能对于我们用好Linux系统至关重要下面就由小编给大家介绍下优麒麟系统的目录结构PS: 同样适用于其他Linux发行版。
查看系统的全部目录:
* 在终端中进入 / 执行命令ls。
* 在文件浏览器中通过左侧导航中的“文件系统”进入根目录。如图1所示。
![图1 系统根目录](https://www.ubuntukylin.com/upload/201908/1564643220763676.png)
### 1 系统目录概述
Linux目录类似一棵树以根目录出发含有多个子目录或文件子目录中又可含有更下级的子目录或者文件分层衍生出多个分叉。如图2所示。
优麒麟Ubuntu Kylin
![图2 目录结构](https://www.ubuntukylin.com/upload/201908/1564644154149997.png)
一般来说根目录下只存放目录除了vmlinuz和initrd.img两个链接文件。其中vmliuz是Linux内核的镜像文件initrd.img是RAM disk的镜像文件都是用于启动Linux系统。
下面将对每一个目录的用途及内容进行介绍。
### 2 目录详解
2.1 /bin、/sbin、/usr/bin、/usr/sbin
表1 bin与sbin
文件目录|说明
:-:|:-:
/bin|放置一些系统必备的可执行文件比如bash、cat、chmod、cp、ls、mv等普通用户和root用户都可以使用。
/sbin|放置一些系统管理必备的可执行文件比如e2fsck、ethtool、fdisk、mount等只有root用户才能使用。
/usr/bin|放置一些必备应用软件的可执行文件比如vim、ssh、file、c++等。
/usr/sbin|放置一些系统管理必备软件的可执行文件比如gparted、cron、tcpdump等只有root用户使用。
可以理解为:如果是用户和管理员必备的命令,则会放在/bin如果是系统管理员必备的命令则会放在/sbin。同理/usr/bin和/usr/sbin对应的是系统额外的应用软件。
![图3 /bin目录](https://www.ubuntukylin.com/upload/201908/1564646117554742.png)
2.2 /boot
存放的是系统的内核文件、引导加载程序文件和grub开机管理。根目录下的两个链接vmlinuz和initrd.img就是指向/boot目录下对应的文件。在系统安装时会为boot单独创建一个分区。
![图4 /boot目录](https://www.ubuntukylin.com/upload/201908/1564646196175428.png)
![图5 根目录下的启动链接文件](https://www.ubuntukylin.com/upload/201908/1564646196175428.png)
2.3 /dev
在Linux系统中任何设备都是以文件的形态存在于/dev目录中。访问该目录下某个文件相当于访问某个设备。比较重要及常用的文件说明如表 2所示。
表2 /dev子目录介绍
文件目录|说明
:-:|:-:
/dev/sd*|SCSI磁盘sd后面的字母表示第几块磁盘数字表示该磁盘的第几分区。比如sda1表示第一块磁盘的第一个分区。一般来说系统盘为sda后续外接的磁盘则从b开始递增。
/dev/tty*|TTY终端设备。比如tty0表示当前虚拟终端ttyS0表示当前UART串口当串口为USB外接的时候则会有ttyUSB0表示当前USB串口。
/dev/loop*|回环设备通常被用于光盘或是磁盘镜像以循环挂载的方式来挂载包含文件系统的文件使得在这个文件系统中的内容得以被访问。比如loop0表示第一个回环设备。
/dev/null|空设备。它会丢弃一切写入其中的数据,并且没有任何可以读取的内容。可当作垃圾站,清除文件中的内容。
/dev/zero|零流源。与/dev/null相似任何写入都将被直接丢弃读取会得到无限多的二进制零流。通常用于创建一个指定长度大小、用于初始化的空文件。
/dev/random /dev/urandom|随机数设备,提供永不为空的随机字节数据流。差别在于:/dev/random依赖于系统中断产生的速度比较慢有时候还会出现较大的停顿数据随机性更高/dev/urandom不依赖系统的中断产生速度很快相比而言数据随机性低。
2.4 /etc
用于存放配置文件包含系统配置和应用软件的配置。该目录下的文件由root用户使用普通用户大都只有读取的权限。比较重要的文件说明如表3所示。
表3 /etc子目录介绍
文件目录|说明
:-:|:-:
/etc/hosts| 域名解析文件即ip地址与域名的对应关系网络访问时可快速解析。
/etc/passwd| 用户数据库,存放了系统中所有的用户信息,包括系统或服务正常运行所必需的用户(系统用户)。 文件中每一行各字段的含义为—— 用户名:密码:UID:GID:用户信息:用户主目录:Shell 其中用户名在同一系统中是唯一的限制在8个字符(字长度之内并且区分大小写UID是用户标识也是用于区分用户常用于系统内部管理进程GID是组标识一个用户可以存在多个组Shell是指用户登录系统时运行的程序名称通常是一个Shell程序的全路径名。 密码在passwd文件中一般以一个“x”符号来代替shadow文件为真正的密码文件只有root用户才有读取的权限。
/etc/shadow| 真正的密码文件。文件中每一行各字段的含义为——用户名:加密后的密码:最近改动日期:不可更改天数:需要重设天数:过期提醒天数:过期后的宽限时间:账号失效日期 其中密码最近的改动日期是从1970年1月1日算起的天数不可更改的天数为0表示没有限制需要重设天数为99999表示没有限制失效日期也是从1970年1月1日算起的天数。
/etc/group| 系统用户的分组信息。文件中每一行各字段的含义为——组名:组密码:组ID:包含的用户与passwd相似组密码以“x”代替gshadow文件为真正的组密码文件组ID与passwd中的GID是对应的。
/etc/gshadow| 真正的组密码文件。文件中每一行各字段的含义为——组名:组密码:组管理员:组成员组密码字段为空或是“!”号,表示没有密码;若有多个组管理员、组成员,用“,”分隔。
/etc/init.d| 存放系统各种服务的启动和停止脚本。使用该目录下的脚本需要有root权限。比如需要重启网络可以使用命令——/etc/init.d/networking restart
/etc/init| 存放系统各种服务和应用的配置文件。
/etc/rc.d| 这些目录中包含了控制进程进行的脚本。以K开头的脚本存放在*为0-6的目录下运行在以S开头的脚本存放在rcS.d目录下之前。脚本放置的地方决定开始运行的层级。
/etc/rc.local|在系统初始化级别脚本运行之后(即系统启动之后)再执行的脚本。
/etc/fstab|在开机引导时,自动挂载的文件系统。文件中每一行对应一个分区,含义为——实际位置挂载点格式挂载状态 DUMP功能开机检查其中挂载状态比如是ro只读、rw读写DUMP功能指在系统DUMP时是否需要BACKUP默认为0开机检查除了root除了有必要为1其余可根据需要调整默认为0。
/etc/issue|getty在登录提示符前的输出信息通常包括系统的一段短说明或欢迎信息。
/etc/profile|设置系统的全局变量。比如——PATH预设可执行文件或命令的搜索路径USER用户登录时使用的用户名HOSTNAME所使用的主机名。
/etc/profild.d|存放的是一些应用程序所需的启动脚本,包括一些命令的附加设置。
/etc/X11|X_Window系统的配置文件。
/etc/skel|新建用户时,把该目录下的内容拷贝到用户的家目录下。
2.5 /home
用户主目录的位置,每创建一个用户,该目录下就会生成名字为该用户的文件夹,用于存放用户的各种文件、数据。
2.6 /lib
库文件目录,包含了所有对系统有用的库文件。在/bin或/sbin目录中的命令的动态库文件就在此目录中内核模块同样也在这里。
文件目录|说明
:-:|:-:
/lib32 /lib64|这两个目录与/lib是一样的包含的是特殊架构的库文件。
/lib/firmware|包含硬件、固件代码。硬件运行在系统中分为两个部分:固件(加载到实际硬件的代码)和驱动程序(用于固件和内核之间的通讯)。
/lib/modules|包含所有可加载的内核模块,如果有多个内核,则该目录下会有代表每个内核的目录。
/lib/modprobe.d|modprobe命令的配置。该命令的作用是在linux内核中添加或删除模块。
/lib/hdparm|包含 SATA/IDE 硬盘正确运行的参数。
/lib/udev|udev是一种工具能够根据系统中硬件设备的状态动态更新设备文件创建删除和刷新。该目录存放了所有的 udev 相关的文件和文件夹比如rules.d就设定了udev规范。
2.7 /media、/mnt
/media ——可移除的外置设备比如U盘、光盘等自动挂载的位置。
/mnt ——文件系统挂载点。当进行手动挂载移动介质、其它文件系统的分区、可安装文件系统时,挂载点的优先选择。
2.8 /opt
存放系统额外软件安装的文件和程序一般是大型第三方软件比如WPS办公Firefox等。
2.9 /proc
一个虚拟文件系统,是正在运行的内核信息映射,也是内核和内核模块用来向进程发送消息的机制。它可以让用户和内核内部数据结构进行交互,获取有关进程的信息,并且可以在运行中改变设置。
/proc运行在内存之中不占用外部存储空间以文件的形式向用户空间提供了访问接口。主要包含了进程信息、内存资源信息、磁盘分区信息等。
2.10 /root
系统管理员root的主目录。
2.11 /run
进入/run目录后执行命令“df -k .”可以看到它被识别为“tmpfs”即临时文件系统。与/var/run相同该目录下是程序或者服务启动后的PID重启后会重/srv新生成对应的目录数据。
2.12 /srv
主要用来存储本机或本服务器提供的服务或数据(用户主动产生的数据、对外提供的服务)。
2.13 /sys
/sys是sysfs的挂载点。sysfs是一个虚拟的、基于内存的文件系统它与/proc相似可以查看和设定内核参数并且还能以更好的方式导出内核数据。
文件目录|说明
:-:|:-:
/sys/devices|所有在总线上被发现的物理设备比如网卡、显卡、ACPI、虚拟设备tty、bonding等是内核对系统中所有设备的分层次表达模型。
/sys/dev|字符设备(block)和块设备(char)里面均是以主次设备号major:minor命名的链接文件指向/sys/devices。
/sys/class|包含所有注册在kernel里面的设备类型每个设备类型表达具有一种功能的设备。每个设备类型子目录下是链接文件指向/sys/devices/目录下的具体设备。
/sys/bus|按总线类型分类设备。其中每个子目录下都包含devices和drivers两个子目录devices ——该总线类型下的所有设备,均为链接文件,指向(/sys/devices/drivers ——该总线类型下的驱动,参数可查看和修改。
/sys/modules|所有被载入内核的模块,包括编译到内核中的模块,和编译为.ko文件的外模块。
/sys/fs|描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点(一些传统虚拟文件系统控制参数仍然在/proc/sys/fs中
/sys/kernel|内核中所有可调整的参数(一些传统内核可调整参数仍然位于/proc/sys/kernel中
/sys/firmware|对固件对象和属性进行操作和观察的接口,即系统加载固件机制时对用户空间的接口。
/sys/power|存在一些属性文件,用于控制整个机器的电源状态。
2.14 /tmp
用户和程序的临时目录。该目录中的内容会被系统定时自动清空。
2.15 /usr
/usr目录下放置的是系统中软件的资源而不是用户数据usr≠user所有系统默认的软件都会放置到/usr。
文件目录|说明
:-:|:-:
/usr/bin /usr/sbin|参考2.1的内容。
/usr/include|开发和编译应用程序所需要的头文件。编译时,可以通过头文件来使用某些库函数。
/usr/lib|目标库文件(包括动态连接库),以及通常不是直接调用的可执行文件。
/usr/local|安装本地程序的默认路径。当下载一个程序源代码进行编译安装时,如果不特别指定安装路径,那么程序相关的文件将会默认放置到这个目录对应的子目录下。
/usr/share|存放了同一个操作系统在不同构架下工作时,特定应用程序的共享数据,比如背景图、程序文档信息、语言设置等。
/usr/src|Linux内核源码。
2.16 /var
常态性变动的文件,包括缓存、日志信息以及某些运作所产生的文件。
文件目录|说明
:-:|:-:
/var/cache|应用程序运行过程中产生的缓存。
/var/lib|应用程序运行过程中,需要使用到的文件。
/var/local|存放/usr/local中安装的程序的可变数据。
/var/lock|锁定文件。比如,某些资源一次只能被一个应用程序使用时,如果同时被两个及以上程序使用,就会产生错误,于是,就需要对该资源进行锁定操作。
/var/log|有关于系统的各种日志信息:
alternatives.log|系统的更新替代信息。
auth.log|系统授权信息,包括用户登录和使用的权限机制等。
boot.log|系统在启动引导过程中的日志信息。
bootstrap.log|构建最小系统的日志信息。
btmp wtmp|btmp记录所有失败登录信息wtmp记录了谁正在登录进入系统使用命令显示这个文件信息等。
dmesg|包含启动时的内核缓冲,以及与硬件有关的信息。
dpkg.log|使用dpkg安装或卸载软件的日志。
faillog|记载用户登录失败的信息,以及错误登录命令。
syslog|格式说明:日期主机名进程名[PID]: 具体信息其中日期格式为MM dd hh:mm:ss进程的PID通常是一个数字也可以为空。syslog是Linux系统默认的日志守护进程任何希望生成日志信息的程序都可以通过syslog提供的接口在该文件中生成信息。它对于系统、软件调试定位问题有很大作用。
Xorg.*.log|X显示的日志信息。
/var/run|存放某些程序或者服务启动后的PID。
/var/spool|放置一些队列数据,即排队等待其他程序使用的数据。这些数据被使用后,通常都会被删除。比如系统收到新邮件会放置到/var/spool/mail/中,当用户收下后,该邮件就会被删除。除了邮件以外,还有打印队列、周期执行任务队列等。
2.17 /lostfound
在系统修复过程中,恢复的文件所在目录。

View File

@ -0,0 +1,32 @@
---
title: 有趣的Linux彩蛋——用sudo来冒犯用户
toc: true
date: 2019-06-24 14:26:59
tags:
categories:
---
人们可以配置 sudo用来给命令授权的来冒犯那些输错密码的用户。一起来看看吧
首先,打开终端,输入以下命令:
**sudo visudo**
强烈推荐使用 visudo 编辑 /etc/sudoers 配置文件。之所以使用 visudo 有两个原因一是它能够防止两个用户同时修改它二是它可以帮助校验修改是否正确。visudo不会擅自保存带有语法错误的配置文件它会提示你出现的问题并询问该如何处理。visudo 默认的是在vi里打开配置文件而在 Ubuntu Kylin 中visudo 默认在 nano 中打开 /etc/sudoers。
然后,在文件顶部,加上这么一行:
**Defaults insults**
如图所示:  
![](https://www.ubuntukylin.com/upload/201602/1456191668463393.jpg)
接下来保存并且关闭文件。如果您使用的是nano按Ctrl+X退出它会提示您是否想要保存更改。请按Y保存更改。
然后终端输入sudo -k清空密码的缓存。最后在sudo命令里输入错的密码
![](https://www.ubuntukylin.com/upload/201602/1456192456272768.jpg)
看看它还对我不耐烦呢。现在你也可以向朋友哭诉自家的sudo欺负你了^_^。