1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
linux入门2.md 29.40 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2023-04-24 01:00 . xdg 工具介绍

linux入门2

前言

这是另一编linux入门文章,采用不一样的风格来讲解linux入门。

背景

linux 是一个操作系统,和windows类似。操作系统是软件,相对于硬件(看得见摸得着的设备)而言,软件是指定和数据的有机结合。操作系统是软件,而且是特殊的软件,它提供一个平台,应用软件使用这个平台提供的软硬件资源,从而让应用软件开发人员以更便利的方式开发软件。

平时我们使用的QQ,迅雷就是应用软件,它不能脱离操作系统独自运行。

那么操作系统具体提供什么功能给用户?大体可以分为以下几个方面:

  1. 文件管理
  2. 设备管理
  3. 用户界面
  4. 后台服务

任何数据,包括应用程序本身,都是以文件的形式被用户认识的。如何有效的管理文件,这个是操作系统基本的功能。

设备是指硬件,比如音箱为什么能够发出声音,显示器为什么能显示图像,这背后都是设备的驱动在控制。

用户界面指的是用户能够观察系统所产生的变化,并且可以施加控制的界面。比如移动鼠标,点击按钮,这些是建立在图形用户界面之上的操作。除了图形界面,还可以通过输入命令(即单词短语),来控制系统,这个分类为命令行界面,他们的总称就是用户界面。

之后,操作系统后台运行着大量的监控进程,什么时候该做什么,接受命令要执行怎样的事务,这些也是操作系统的重要组成部分。

从普通linux用户的视角来观察linux

作为一个linux的普通用户,我以自己的视角来带领你去认识linux,它究竟有什么作用,和我平时都拿它来干点什么。

首先我觉得第一步是要理解文件系统。一个文件是一组数据,这组数据具体是什么?可以是图像,声音,可执行程序,或者他们的有机结合。 为什么图像什么的要被归结成一个文件,那是为了便于管理。各种数据,它的表现形式有着非常大的区别,但是它们有一个共通点,就是数据量的大小,他们在电脑中都是一组数据而已。

声音之所以能发出来,是因为这组数据通过设备识别了,然后驱动了喇叭发生震动。图像之所以能显示出来,是因为这组数据通过显卡设备识别了,然后驱动显示器的发光元器件显示出来。但是他们存储的形态完全是一致的,都是有容量的一组数据,分别只是具体内容和内容的大小。我们将一个图片保存在一个文件中,就可以复制,移动,通过编辑软件打开,分享给他人,可以将文件命名。总的来说对用户来说就是可以管理。反之,不采用文件的形式,别人给你分享一首歌只能拿它的手机外放给你听,难以操控。

因此理解文件和具体的图像,音频,甚至是可执行的应用之间的这种关系,就能明白为何文件管理对操作系统来说如此重要。

操作系统在文件管理这块很类似,linux和windows差不了多少。在windows中,首先在具体的硬盘存储设备中格式化,分区,有一个分区的标识,如C盘,D盘之类的,然后打开C盘,里面有一堆文件夹,文件夹里面有一堆文件,文件有各种类型,图标也不一样。

在linux中,也是类似的,只是linux没有分区标识,任何分区都外挂在以根文件夹为目录的子目录中。具体举例如下:

  1. / : 整个linux只有一个根文件夹,它的名字就叫/
  2. /home : 表示/下面的子文件夹home,名字叫home
  3. /home/htqx : 表示/home下面的子文件夹,名字叫htqx

这是一种很规范化的层级结构,linux中的分区可以外挂在其中某个层级的某个子文件夹中。比如我将硬盘分3个区,代称a,b,c。 其中我把a绑定到/,然后把b绑定到/mnt/b,然后把c绑定到/mnt/c。 这样操作之后,我想把文件存储到b分区,只要把文件复制或者移动到/mnt/b目录下即可。

其中最关键的是/绑定的分区,它是第一步,有它才能接下来创建子文件夹,子文件夹才能绑定更多的分区。

linux对文件夹有规范,新手入门要理解这个规范,才能知道应该去哪个目录找到那类资料:

  1. /boot : 引导启动系统相关的
  2. /bin : 引导时需要用到的命令程序
  3. /sbin : 管理员指令
  4. /root : 管理员的用户目录
  5. /dev : 设备文件(动态生成)
  6. /etc : 配置文件
  7. /home : 普通用户的用户目录
  8. /lib : 程序库
  9. /media : 移动设备
  10. /mnt : 挂载目录
  11. /opt : 可选程序
  12. /proc : 进程信息(动态生成)
  13. /run : 运行信息(动态生成)
  14. /srv : 服务
  15. /sys : 系统信息(动态生成)
  16. /tmp : 临时文件
  17. /var : 动态数据
  18. /usr : 和启动时无关的下一层级
    1. bin : 程序
    2. games: 游戏
    3. include : c/c++程序的头文件
    4. lib : 库
    5. sbin : 管理程序
    6. share : 程序共享的数据
    7. src : 源代码
    8. local: 保存用户自己安装工具的下一层级
      1. bin : 程序
      2. etc : 配置
      3. man : 帮助文档

总体来说,linux 目录规范中有三个层级, /层表示系统启动时需要的程序和工具,/opt 包含附加的应用。/usr 表示系统自动给你安装的工具。/usr/local 表示用户自己安装的工具。大体如此,但并不是很严格的。

还有一个比较关键的目录/home/xxx,其中xxx代指当前普通用户的名字。这是用户目录。用户目录下面也会包含程序的配置,和大量的用户数据,比如图片,mp3之类的。因此建议将/home绑定到一个独立的分区,重装系统的时候是需要格式化/根分区的,但并不需要格式化/home分区,这样你就能保留大量的数据和配置。

能不能将程序安装到用户目录?事实上是可以的,程序可以安装到任何地方,比较规范的建议是:~/.local/bin。 在linux中~可以代表/home/xxx,即当前用户目录,而.local是一个文件夹的名字,特殊的.开头表示默认的时候隐藏起来,目录会显得比较整洁。

程序可以安装到任何目录,当你输入一个程序的文件名,它就会搜索环境变量$PATH指定的路径,找到就性质。因此你可以安装到任何目录,但是应该让$PATH包含你的目录,否则你只能输入完整的路径来执行程序,即类似/bin/ls,表示根下面的bin文件夹下的ls文件是可执行文件,执行它。

# 完整路径
/bin/ls
# 名称
ls
# 打印当前的搜索路径
echo $PATH
# 我的输出:
/home/htqx/bin:/home/htqx/.local/bin:/home/htqx/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin

$PATH 环境变量是一组路径,每个路径用冒号分隔。

我并不想具体讲解怎么改变环境变量,包含你想要搜索的目录。这不是现在需要关心的细节。首先带大家认识相关的概念是我的目的。

安装程序

没有人专门只用系统自带的命令和工具,很多时候我们需要安装新的程序。有一点linux做得非常好,linux的应用比较少,但是管理很规范,很科学。linux一般带一个应用仓库,它连接到远程的服务器。安装程序就是从软件仓库下载程序,然后自动安装。你不需要百度,你不需要从某些奇奇怪怪的网站上下载,你只要知道名字即可,其他都不需要你管。

不过具体而言,linux包含很多发行版本,有多种不同的软件仓库管理工具,有不同的仓库,仓库包含的软件数量也各不相同,仓库也不可能包含所有可用的linux应用。这就是linux软件安装会面临的一些复杂性。

如果仓库没有,那么你就要类似windows用户那样,百度,在不知名的某网站下载应用,然后安装。应用的安装包有几种:

  1. .deb结尾的debian系安装包,使用的发行版有:debian, ubuntu, deepin, mint
  2. .rpm: redhat系统安装包,centos,fedora等。
  3. .run/.bundle/.bin: 扩展名不确定,但是这类安装包会自动检测linux发行版本的类型,然后执行安装脚本
  4. .tar.*: 严格来说这是个压缩包,但是有些系统能够识别里面的安装脚本

linux中有个特性,它不是根据扩展名来识别可执行程序的,也就是没有.exe代表可执行程序这种设定。一个文件能否执行,是它的权限属性决定的,而不是扩展名。

# 显示某个文件的权限
stat -c %A /bin/ls
# 显示:
-rwxr-xr-x

输出的每个字符和位置都有其含义,从左到右:

  1. -表示普通文件
  2. rwx表示当前用户有r读,w写,x执行权限。
  3. r-x表示当前用户组有有读,执行权限,但没有写权限
  4. r-x表示其他用户有读,执行权限,但没有写权限

言归正传,要么你下载的是一个指定的安装包,要么是一个可执行可自动安装的程序,要么是一个被系统识别内部有可执行脚本的压缩包。

如果都不是,那么就是源代码。linux用户并非都是程序员,但是往往也要接触到一些编译程序的任务。意思是你下载源代码,自己编译出可执行的程序,然后将其安装到系统里面。这里面复杂性要高一点,但大多情况并没有你想象中那么麻烦,只是下载,解压缩,运行两到三条编译命令,它就自动完成所有操作。

为什么linux的应用程序员喜欢分发源代码?有两个原因,第一个是源代码开放是linux的自由精神,第二个,构建程序要结合你当前的系统配置环境而定,别人编译好的,往往没有那么契合你的系统。还有一个可能就是程序员比较懒。

以deepin为例子,日常使用中,可以通过图形界面点开应用商店,里面包含一部分比较大型的应用。缺少的小工具,或者编程相关的编译器,类库之类的,可以用apt命令,通过命令行来安装。

极少情况,需要去官网下载安装包,或者源代码,自己编译安装。自己编译默认会一般会安装到/usr/local目录下,也有可能在/usr目录或/opt目录,这个不同的应用有它自己的考量。

很多时候你并不清楚安装到哪里,但是他会产生一个启动器到启动菜单,你点击可以运行。通过任务管理器你可以获知可执行程序的路径。如果是安装包,比如deb,系统会记录这个包安装的所有文件的路径信息,通过路径可以查询和反向查询包名:

# 反向查询某程序在哪个包
dpkg -S /bin/ls
# 显示,即coreutils包
coreutils: /bin/ls

# 查询某包安装了哪些文件
dpkg -L coreutils
# 输出:
/.
/bin
/bin/cat
/bin/chgrp
/bin/chmod
/bin/chown
/bin/cp
/bin/date
/bin/dd
/bin/df
/bin/dir
/bin/echo
...等

最好的建议,当然是从软件仓库下载本发行版支持的安装包,这样卸载比较方便。如果是编译安装,卸载是比较麻烦的,因为你不知道它究竟都干了些什么,安装了什么,还要仔细研究。

设备管理

在linux中,硬件设备会对应一种特殊的文件,叫设备文件。当然设备文件无法通过复制来产生一个新的设备,毕竟设备是实实在在的物理硬件,不会凭空拷贝出来。对设备文件的操作,一般是读写。如果是存储设备,比如硬盘,还能格式化和挂载。

linux既有硬件设备,也有虚拟的设备,比如/dev/zero,可以不停的读取\0/dev/null设备可以写入任何数据而不会装满。

设备需要驱动,linux中的驱动大部分是通过系统内核自带的,包括内嵌到内核,和作为内核模块文件独立存放在/lib/modules目录下。

而驱动有些又需要固件,所谓固件是硬件可识别的一段命令或数据,它往往和系统无关,在多个系统中共享的那一部分内容,这部分保存在/lib/firmware目录下。

你可以安装一个设备的多个驱动,但是应该保证同时只运行其中一个。这可以通过/etc/modprobe.d/目录来配置。

linux安装和配置驱动是一件比较有难度的事情,它并没有windows那么友好。

  1. 首先驱动和系统内核紧密相关,linux系统可以同时存在多个版本的内核,但一次只能启动其中一个。有些内核有的驱动不保证另一些内核也有。
  2. 驱动和内核版本又密切相关。找到某个版本的驱动未必适合当前内核。
  3. 内核默认并没有配置安装所有支持的驱动,因为数量会很庞大,这时候就要重新配置内核,同时需要内核的源代码,内核源代码一次编译耗费大半天。
  4. 可能需要编译硬件驱动的源代码。首先找到对应的内核版本的驱动源代码,不同内核版本并不保证能编译通过。
  5. 就算官方打包好了,不同的linux发行版打包好的驱动未必能通用。
  6. 就算所有都备齐,驱动和硬件的实际兼容性也并不能保证不会出故障。

因此,驱动是linux中比较高难度的功课,但是一个系统没有驱动不可能正常运行,所以它又是一个入门需要做的功课,这就很矛盾了。

建议新人避免去解决这个问题,而选择更换发行版比较实在。

linux发行版中,可以考虑manjaro,arch这些更新比较勤快的发行版,这样遇到硬件驱动问题的机率会少很多。或者选择用虚拟机安装,虚拟机的虚拟硬件都是通用的,受到linux系统良好的支持。

命令行

图形界面是不需要学习的。很少有教程会指导图形界面的操作,这就是图形界面的优势。但是图形界面有个劣势,就是复杂和不稳定,这个不稳定不是说运行不稳定,而是界面不稳定。

应用程序作者心血来潮,改一下界面布局,以前的方案基本就乱套了。

一般较小或者复杂的程序,都会结合命令行来解决问题。命令行有着稳定的界面,有着高效的执行效率,极低的资源占用,较低的开发难度,实际上优势很大。但是有一明显的缺陷,就是有较高的学习成本。

图形界面可见可得,基本是自解释的,而命令行需要查看帮助,获取每个指令的用途,记忆指令的短语拼写,包括各种参数的组合。

这对一般非专业的用户来说都是多余的成本。因此命令行在windows中就没有多大的市场。但是linux用户专业性比较高,使用命令行的人数会比较多。

命令行对linux用户来说有几个用途:

  1. 系统崩溃了可以进入命令行下自救
  2. 编译构建软件
  3. 使用大量的实用小工具
  4. 配置系统运行模式
  5. 编写自动化处理(脚本)

文件管理:

  1. cd : 进入目录
  2. tree : 打印目录树
  3. ls : 打印文件列表
  4. du : 统计目录大小
  5. find : 查找文件
  6. mv : 移动或者改名文件
  7. mkdir: 创建目录
  8. cp : 复制
  9. rm : 删除
  10. install : 安装复制
  11. dd : 读写文件
  12. tar : 打包压缩文件
  13. chmod : 改变文件权限
    1. umask : 新建文件默认权限掩码
  14. chowm : 改变文件拥有者
  15. setfacl : 设置ACL扩展权限
    1. getfacl : 获取ACL扩展权限
  16. touch : 修改访问时间属性或创建空文件
  17. ln : 创建链接文件
    1. mkfifo : 创建管道文件
    2. mknod:创建设备文件

文件查看:

  1. cat : 显示文件内容
  2. more : 分页显示
  3. less : 更高级的分页显示
  4. head : 显示文件开头
  5. tail : 显示文件结尾
  6. iconv : 转换文字编码
  7. od: 显示二进制编码

字符串处理:

  1. cut : 分割
  2. tr : 替换
  3. wc : 统计行数、字数、字节数
  4. diff: 比较文本差异
    1. patch : 差异补丁
  5. awk : 擅长分割取列
  6. sort : 排序
    1. uniq: 去重,相当于sort -u
  7. xargs: 替换命令参数
    1. eval : 再次执行 bash 替换
  8. seq : 产生序列
  9. printf : 格式化文本
  10. sed : 擅长取行和替换
  11. grep: 搜索匹配
  12. 正则表达式 : 很多字符串命令支持正则表达式

字符串的处理是 bash 脚本编程中最重要的一项工作,如果对命令行做自动化处理有较高的期望,应该学习一下 linux 世界中的字符串处理三剑客(grep、sed、awk)。在此基础上,就能将命令变得程序化,自动处理复杂的任务。

文本文件编辑器:

  1. nano :直观的编辑器
  2. vim : 强大的编辑器

很多专业的程序员,擅长使用 vim。但一般人可以学习 nano,较为简单。因为命令行并非一般人的主要用户界面,临时编辑文档用 nano 也足够。图形界面有很多优秀的编辑器,比如 vscode。

安装包管理:

  1. apt : 通过远程仓库安装应用程序
  2. dpkg : 通过包文件安装程序
  3. make: 通过编译安装程序

系统信息:

  1. neofetch : 流行的显示当前系统信息的工具
  2. lspci : 显示pci设备信息
  3. lsusb : 显示usb设备信息
  4. lsblk : 显示磁盘信息
  5. blkid : 显示磁盘id
  6. df : 显示空间占用情况
  7. findmnt : 显示挂载情况
  8. mount : 显示挂载情况
  9. dmesg : 显示内核日志
  10. systemctl : 显示后台服务信息
  11. journal : 显示日志
  12. ps : 显示进程信息
  13. ip : 显示网络信息
    1. ss : 端口
  14. top : 显示任务管理器
  15. env: 环境变量
    1. set
  16. lsmod : 显示加载的内核模块
    1. modinfo
    2. systool
  17. hwinfo : 硬件信息

当然获取信息,还可以在linux虚拟的文件系统中查找,比如/proc, /sys目录中。或者在系统配置中查看配置内容,如/etc目录。或者查看当前运行的一些信息/var/log日志,/run等。

系统管理:

  1. sudo : 提权
    1. su
  2. killall: 强制关闭程序
  3. systemctl: 后台服务管理
  4. journalctl: 日志管理
  5. localectl : 设置语言
  6. timedatectl: 设置时间
  7. modprobe: 内核模块管理
    1. depmod : 输出模块依赖文件
    2. insmod : 加载模块
    3. rmmod : 移除模块
  8. mkinitramfs: 内核引导映像制作工具
    1. mkinitcpio
  9. poweroff : 关机
    1. reboot: 重启
    2. halt: 关闭系统(不断电)
    3. suspend: 待机
    4. hibernate: 休眠

图形界面命令:

  1. xinit : 启动Xorg显示服务。
    1. startx: xinit前端包装
    2. 通常启动DM显示管理器,然后启动Xorg,并读取xprofile配置

高级技巧:

  1. tab 键 :补全拼写,命令,路径,或参数等
  2. x{a,b} : 得"xa xb"
    1. x{,b} : 得“x xb”
    2. x{1..3}: 得"x1 x2 x3"
  3. a|b : a 执行完毕输出信息给 b 作为输入,| 管道符
    1. a <(b) : b 命令的输出作为a命令的输入
  4. a;b : 分隔 ab 两条命令
  5. a && b : a 执行成功才执行 b
    1. a || b : a 执行失败才执行 b
  6. : 用在参数上,可替代为 n 个任意字符。 等是通配符
    1. ? : 替换任意一个
    2. [abc]: 替换 abc 中的一个
    3. [0-9]: 替换 0 到 9 中的一个
    4. [^abc]: 替换不是 abc 的一个字符
  7. "str": 引号内是字符串,也可用于避免通配符替换
  8. a& : 后台执行a命令
    1. fg : 将后台任务移到前台
    2. jobs: 查看后台任务
    3. ctrl+z 键:挂起当前命令到后台
  9. a > f.txt : a 命令执行完毕的输出保存到 f.txt 文件中。> 数据重定向
    1. a < f.txt: a 读取f.txt文件作为输入
  10. a >> f.txt : 类似 > , 但在 f.txt 文件末尾添加数据。
  11. ctrl+c 键: 中断当前命令
  12. ctrl+d 键: 当前输入完毕
    1. ctrl+s 键: 挂起终端,停止输入输出(没什么用,但提醒防止误触)
    2. ctrl+q 键: 恢复
  13. ctrl+l 键: 清屏,或输入clear命令也可
  14. history : 查看命令输入的历史
    1. 上箭头 : 上一命令
    2. 下箭头 : 下一命令
    3. !111 : 执行历史记录中第111条命令
    4. ctrl+r : 搜索历史中匹配的命令
  15. pushd :保存当前目录,并进入指定目录。堆栈式跳转目录
    1. popd:回到栈顶保存的目录,并弹出栈顶数据。
    2. dirs: 显示目录栈内容
  16. ctrl+k 键: 剪切光标之后的字符(含光标位置)
    1. ctrl+u : 剪切光标之前的字符
    2. ctrl+y : 粘贴字符
    3. ctrl+w : 剪切光标前一个单词
    4. alt+. : 取上一个命令最后的参数
      1. alt+1 alt+. :取上一个命令第一个参数
  17. help: 内置命令的帮助
    1. man: 外部命令的帮助
    2. info: 类似,另一种帮助文档
    3. whatis: 简要帮助说明
    4. apropos: 搜索帮助说明查找相关命令

shell

在linux中,终端命令行是一个重要的存在,因为系统很多启动过程,都要经过shell脚本来处理。你可以把它理解为系统的一个组件,理解它的运行机理,也理解了部分系统的运行原理。

环境变量,说的就是shell变量,定义方式是“变量名=值”,程序可以获取这个值,然后进行相应的执行行为。因此也可以理解为程序配置的一部分。

环境变量的配置文件:

  1. /etc/profile: 登录型shell读取该文件
  2. /etc/bash.bashrc: 交互型shell
  3. /etc/environment: 严格来说设置给PAM-env模块读取的,但shell也会读取
  4. ~/.bashrc: 账户私有的shell配置
  5. ~/.profile: 同理,账户私有
  6. ~/.pam_environment:同理
  7. ~/.xintrc: X窗口系统使用的环境变量
    1. DE = “xfce” : 这个环境变量将配置xdg-open 使用xfce桌面的工具
    2. DESKTOP_SESSION: 同上
    3. PATH: 输入命令的名字,将由这个环境变量给出的路径中搜索程序文件来执行。
    4. LANG: 这个控制程序的输出语言和本地化
    5. GTK_IM_MODULE=fcitx: 设置输入法
    6. QT_IM_MODULE=fcitx:同上
    7. XMODIFIERS=@im=fcitx:同上

链接器

对于linux来说,一个比较隐秘但是有时候却会影响整个系统的地方就是链接器。linux的程序大多数都是通过动态链接器来加载相应的库文件。如果链接时出现状况,比如找不到库文件,或者链接器本身有什么问题,那么所有程序都变为不可用状态。

  1. /lib/ld-linux-x86-64.so.2 : 动态链接器的名字(或者叫其他名字),这实际上是一个可执行文件
  2. /etc/ld.so.cache : 配置搜索的路径
  3. /lib/libc.so : 标准c库的ld脚本,标准c库是linux大厦的基础
  4. /lib/libc.so.6: 标准c库的动态链接版本
  5. /lib/lic.a: 静态链接版本
  6. /lib/libc_nonshared.a: 动态版本的静态链接部分
  7. pkg-config: 标准化各种库的构建配置

systemd

后台运行的服务,实际上有多种管理器,而最为流行是systemd,使用systemctl 命令来管理,journalctl 来查看日志。

内核和内核模块

linux系统实际上内核和整体是分离,一个系统可以存在多个内核,只是一次只能选择启动其中一个内核。而内核模块是分离出去的部分内核组件。linux内核除了定义核心的功能,还包含了驱动。因此哪怕你不是内核专家,也应该理解这个运行机制,因为更新驱动是用户日常管理内容。

  1. /boot/vmlinuz-linux : 内核(名字一般带vmlinuz)
  2. /boot/initramfs-linux.img: 引导映像(包含一组脱离系统所在磁盘就可以使用的工具和环境)
    1. mkinitpcio : 构建工具
    2. mkinitramfs : 同上
  3. /lib/modules/版本/: 内核模块
    1. /etc/modules-load.d/ : 配置默认加载的模块
    2. /etc/modprobe.d/ : 其他配置
  4. /lib/firmware/: 驱动相关固件
  5. /sys/firmware/acpi/tables/DSDT : acpi(高级配置和电源接口)固件
  6. DKMS(Dynamic Kernel Module Support):动态内核模块支持,这工具能够帮助你更新内核时,自动构建相关模块
    1. linux-headers: linux的头文件,内核模块编译依赖这个
    2. /usr/src/包名-版本: 模块源码
  7. /proc/config.gz : 当前内核的构建配置
    1. /boot/config-版本

要更新驱动,首先要找到对应的内核版本,有些驱动在内核源代码包里面,只是默认没有配置编译,可以通过内核源代码包编译这部分驱动。有些没有被收集到内核,可单独编译这部分模块(但也依赖内核头文件等源码),安装到/lib/modules文件夹下。有部分驱动是要安装配套固件的。

时间

为啥时间这个不起眼的项目那么关键,比如安装的时候特别要设置时间和时区这些貌似无关要紧的东西。这是因为网络时代很多时候需要依赖时间来同步信息。时间不准确,系统有时会出现一些莫名其妙的错误。

  1. timedatectl:控制工具
    1. tzdata : 时区包
    2. /etc/localtime : 本地时区
    3. /usr/share/zoneinfo/ : 时区列表
  2. UTC : 全球统一时间
  3. CST : 本地时间,中国是选择上海或者重庆,都是一样的由统一时间+8小时
  4. RTC : 硬件时钟,电脑关机后,主板上用电池供电的计时模块。开机后读取这个时间,之后就由系统根据时钟终端独立计时。时间久了这两个时间可能会出现误差。RTC是UTC还是CST是由系统决定的。windows系统将RTC视为CST,linux视为UTC,所以要人工干预,让各个系统设置统一。
    1. hwclock : 设置硬件时钟
  5. NTP : 网络时间服务器,用来自动调整本地时间。国内服务器有阿里巴巴的:ntp1.aliyun.com等。

systemd 管理的时间服务:

  1. systemd-timesyncd.service: 和NTP同步的一个后台服务
    1. /etc/systemd/timesyncd.conf : 配置同步的NTP服务器

备份

linux中任何东西都是文件,因此要备份系统,就是备份文件。大多数配置文件都是文本形式,因此很方便编辑修改。

假设你备份一个系统,然后到另一台电脑上恢复,有几个是需要注意的点:

  1. 引导菜单的磁盘UUID变化了
  2. /etc/fstab : 定义了磁盘和挂载点,也变化了。
  3. 动态生成的目录是不需要备份的:
    1. /proc
    2. /dev
    3. /sys
    4. /run
  4. 临时文件存放的地方也不需要备份
    1. /tmp
  5. 工具,只需要注意一点,linux的文件是有权限的,必须要能保存权限的工具
    1. rsync
    2. tar
    3. cp
    4. timeshift
  6. 支持快照的文件系统:
    1. btrfs
    2. lvm
    3. squashfs

图形系统

linux的显示系统是比较复杂的。

  1. DM(display manager): 登录(桌面)管理器
    1. nodm
    2. gdm: gnome桌面默认登录管理器
    3. lightdm: deepin系统默认登录管理器
    4. lxdm
    5. sddm: kde桌面默认
    6. xdm
  2. 会话管理
    1. loginctl : 显示会话状态
    2. /etc/share/xsessions/ : 会话配置
    3. /etc/xprofile
    4. ~/.xprofile
    5. /etc/X11/xinit/xinitrc.d/
  3. WM(window manager): 窗口管理器
    1. 堆叠式:即传统的windows样式,窗口可以重叠
      1. kwin : kde桌面默认
      2. openbox: 轻量
    2. 平铺式:窗口被整齐划分到不同区域,不重叠
      1. dwm
      2. i3
      3. sway: 基于wayland
  4. Xorg : X窗口系统,linux流行的图形界面系统(当前主流)
    1. wayland : 另一套界面系统(未来)
    2. KMS(Kernel mode setting) : 内核模式设置
    3. Xlib: X系统的底层库
    4. XCB: 同上(新版)
    5. Xephyr: 嵌套X11服务器
    6. xrestop: 资源监视器
    7. xsettings: 配置设置
    8. xwininfo: 窗口信息
    9. DRM:linux内核图形子系统
    10. xkeyboard-config: 配置XKB键盘布局
    11. libinput: 输入设备
      1. libevdev:内核事件
    12. 字体处理:
      1. fontconfig : 字体配置
      2. freetype: 字形渲染
        1. Xft
      3. pango:字体布局
      4. harfbuzz: 同上
      5. 图形库:
        1. cairo : 2d图形
        2. mesa: 3d图形
        3. 图形控件库:
          1. qt:跨平台的图形工具包
          2. gtk:linux另一个主流工具包
  5. DE(desktop environment): 桌面环境,就是打包好的一堆图形桌面工具
    1. KDE(plasma):主流
    2. GNOME:主流
    3. dde: deepin系统官方桌面环境
    4. lxqt
    5. cinnamon
    6. mate

如何理解这些部件相互的关系,首先从技术上讲,xorg是底层,其他图形技术是建立在器上面,按功能分类,登录,会话,窗口管理各司其职,而桌面环境就把所有的这些,有机的整合在一起。

linux系统可以同时安装多个桌面环境(当然不保证不发生兼容性问题),登录管理器可以选择登录到其中一套桌面,这点是很灵活的。用户不需要一定要选择某个发行版,才能体验到它自带的桌面。比如dde这个桌面环境,已经被fedora,arch,manjaro等发行版支持了,选择安装即可。

用户也可以自由替换掉某个组件,构建自己喜欢的桌面环境。

xdg

xdg 是一个桌面标准组织开发的相关工具。linux 的桌面有多种,比如 gnome、kde 等等,因此为了统一相关的标准,就诞生了 freedesktop 这类组织。

其中 xdg-utils 是一套工具,帮助用户轻松管理桌面环境。

  1. xdg-open: 利用文件默认的关联程序打开文件
  2. xdg-mime: 查询和设置文件的关联程序
  3. xdg-screensaver:屏幕保护设置
  4. xdg-settings:设置相关的 url 的默认处理程序
  5. xdg-icon-resource: 安装图标
  6. xdg-email: 调用默认程序发邮件
  7. xdg-desktop-icon: 桌面图标
  8. xdg-desktop-memu: 任务栏主菜单
# 使用系统关联的图形程序打开图片
xdg-open ~/Pictures/2b.jpg

参考

  1. Linux三剑客(grep、sed、awk): https://blog.csdn.net/sj349781478/article/details/82930982
  2. arch 时间配置: https://wiki.archlinux.org/index.php/System_time_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  3. arch 桌面环境: https://wiki.archlinux.org/index.php/Desktop_environment_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  4. freedesktop 自由桌面相关项目:https://www.freedesktop.org/wiki/Software/
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助