初步复制wiki内容
This commit is contained in:
parent
48ac4bf98b
commit
df4521914a
|
@ -0,0 +1,66 @@
|
|||
---
|
||||
title: Ubuntu软件源格式解析
|
||||
toc: true
|
||||
date: 2021-02-20 14:08:43
|
||||
tags:
|
||||
categories:
|
||||
---
|
||||
1. Ubuntu的包管理工具是apt,由于官方的软件源一般都在国外所以有时候源会很慢,所以有时候会替换成国内的镜像站,但是需要我们修改软件仓库的配置。Ubuntu的软件软分为两部分官方源和ppa,ppa其实是一个网站,即-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)
|
||||
|
|
@ -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,一部分是client,client就是我们上边用的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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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文件系统C,D,E等。
|
||||
|
||||
正如您所看到的,这有三个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团队提出任何问题或建议。
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
title: 如何在grub添加启动参数
|
||||
toc: true
|
||||
date: 2020-08-28 19:26:55
|
||||
tags:
|
||||
categories:
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 如何在grub添加启动参数
|
||||
对于grub2,ubuntu给了一个官方的配置文件/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的配置文件
|
||||
|
||||
即可。
|
|
@ -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)
|
||||
|
||||
|
|
@ -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应用以沙箱的方式运行。系统通过一些机制限制应用访问资源的权限来实现其安全特性,比如通过对内核安全机制AppArmor,Seccomp等的配置实现的沙箱和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发行版更突出的优势。
|
|
@ -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)
|
|
@ -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
|
||||
|
||||
可以看到此沙箱中有3个进程,且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吧!
|
|
@ -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次(对应四次Q),page 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在通用块层的具体情况,先不考虑P,I,U,D,C等操作,那么上面的输出可以简单解析为:
|
||||
|
||||
![](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_MERGE,ELEVATOR_FRONT_MERGE,ELEVATOR_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 , don’t 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,也有当前进程从蓄流链表中派发的request(blk_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),但没被接收,maintainer–Jens的解析是这种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 list,bio1(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中。
|
|
@ -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团队联系。
|
|
@ -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系统更新速度。
|
|
@ -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>
|
|
@ -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
|
||||
|
||||
|
||||
获取屏幕上某个区域的截图。光标变为十字。点击并拖动选择区域,自动保存。
|
|
@ -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的道路上共同进步吧。
|
|
@ -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 权限下使用。
|
||||
gated:gated 是实现 RIP 的另一个路由守护进程。同时使用 OSPF/EGP/RIP 。只能在 root 权限下使用。
|
||||
traceroute:可用来追踪IP数据包经过的路由信息。
|
||||
netstat -rnf inet:可显示 IPv4 的路由表。
|
||||
sysctl net.inet.ip.forwarding=1:使数据包继续传递(把一个主机变成路由)。
|
||||
route:route 命令用来在路由表中设置静态路由。所有从 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/hosts:IP地址及名字
|
||||
/etc/networks:IP地址及网络名字
|
||||
/etc/protocols:协议号及协议名字
|
||||
/etc/services:tcp/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:远程登陆主机。
|
|
@ -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 funny-manpages”然后运行下面命令的man手册。其中一些
|
||||
|
||||
![](https://www.ubuntukylin.com/upload/images/tl44.png)
|
||||
|
||||
### Linux Tweaks
|
||||
该到了做一些优化的时候了
|
||||
|
||||
![](https://www.ubuntukylin.com/upload/images/tl45.png)
|
||||
|
||||
Linux总是sexy:who | grep -i blonde | date; cd ~; unzip; touch; strip; finger; mount; gasp; yes; uptime; umount; sleep(如果你知道我的意思,汗!)
|
||||
|
||||
还有一些其它的命令,只是这些命令并不能在所有的系统上运行,所以本文没有涉及到。比如说dog , filter, banner
|
||||
|
||||
使用愉快,你可以稍后再对我说谢谢:)
|
||||
|
|
@ -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 Emacs,GNU 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系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在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文章教程等信息的综合性网站。
|
||||
|
|
@ -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 /lost+found
|
||||
|
||||
在系统修复过程中,恢复的文件所在目录。
|
||||
|
|
@ -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欺负你了^_^。
|
Loading…
Reference in New Issue