同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
这是另一编linux入门文章,采用不一样的风格来讲解linux入门。
linux 是一个操作系统,和windows类似。操作系统是软件,相对于硬件(看得见摸得着的设备)而言,软件是指定和数据的有机结合。操作系统是软件,而且是特殊的软件,它提供一个平台,应用软件使用这个平台提供的软硬件资源,从而让应用软件开发人员以更便利的方式开发软件。
平时我们使用的QQ,迅雷就是应用软件,它不能脱离操作系统独自运行。
那么操作系统具体提供什么功能给用户?大体可以分为以下几个方面:
任何数据,包括应用程序本身,都是以文件的形式被用户认识的。如何有效的管理文件,这个是操作系统基本的功能。
设备是指硬件,比如音箱为什么能够发出声音,显示器为什么能显示图像,这背后都是设备的驱动在控制。
用户界面指的是用户能够观察系统所产生的变化,并且可以施加控制的界面。比如移动鼠标,点击按钮,这些是建立在图形用户界面之上的操作。除了图形界面,还可以通过输入命令(即单词短语),来控制系统,这个分类为命令行界面,他们的总称就是用户界面。
之后,操作系统后台运行着大量的监控进程,什么时候该做什么,接受命令要执行怎样的事务,这些也是操作系统的重要组成部分。
作为一个linux的普通用户,我以自己的视角来带领你去认识linux,它究竟有什么作用,和我平时都拿它来干点什么。
首先我觉得第一步是要理解文件系统。一个文件是一组数据,这组数据具体是什么?可以是图像,声音,可执行程序,或者他们的有机结合。 为什么图像什么的要被归结成一个文件,那是为了便于管理。各种数据,它的表现形式有着非常大的区别,但是它们有一个共通点,就是数据量的大小,他们在电脑中都是一组数据而已。
声音之所以能发出来,是因为这组数据通过设备识别了,然后驱动了喇叭发生震动。图像之所以能显示出来,是因为这组数据通过显卡设备识别了,然后驱动显示器的发光元器件显示出来。但是他们存储的形态完全是一致的,都是有容量的一组数据,分别只是具体内容和内容的大小。我们将一个图片保存在一个文件中,就可以复制,移动,通过编辑软件打开,分享给他人,可以将文件命名。总的来说对用户来说就是可以管理。反之,不采用文件的形式,别人给你分享一首歌只能拿它的手机外放给你听,难以操控。
因此理解文件和具体的图像,音频,甚至是可执行的应用之间的这种关系,就能明白为何文件管理对操作系统来说如此重要。
操作系统在文件管理这块很类似,linux和windows差不了多少。在windows中,首先在具体的硬盘存储设备中格式化,分区,有一个分区的标识,如C盘,D盘之类的,然后打开C盘,里面有一堆文件夹,文件夹里面有一堆文件,文件有各种类型,图标也不一样。
在linux中,也是类似的,只是linux没有分区标识,任何分区都外挂在以根文件夹为目录的子目录中。具体举例如下:
这是一种很规范化的层级结构,linux中的分区可以外挂在其中某个层级的某个子文件夹中。比如我将硬盘分3个区,代称a,b,c。 其中我把a绑定到/
,然后把b绑定到/mnt/b
,然后把c绑定到/mnt/c
。 这样操作之后,我想把文件存储到b分区,只要把文件复制或者移动到/mnt/b
目录下即可。
其中最关键的是/绑定的分区,它是第一步,有它才能接下来创建子文件夹,子文件夹才能绑定更多的分区。
linux对文件夹有规范,新手入门要理解这个规范,才能知道应该去哪个目录找到那类资料:
总体来说,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用户那样,百度,在不知名的某网站下载应用,然后安装。应用的安装包有几种:
.deb
结尾的debian系安装包,使用的发行版有:debian, ubuntu, deepin, mint.rpm
: redhat系统安装包,centos,fedora等。.run
/.bundle
/.bin
: 扩展名不确定,但是这类安装包会自动检测linux发行版本的类型,然后执行安装脚本.tar.*
: 严格来说这是个压缩包,但是有些系统能够识别里面的安装脚本linux中有个特性,它不是根据扩展名来识别可执行程序的,也就是没有.exe代表可执行程序这种设定。一个文件能否执行,是它的权限属性决定的,而不是扩展名。
# 显示某个文件的权限
stat -c %A /bin/ls
# 显示:
-rwxr-xr-x
输出的每个字符和位置都有其含义,从左到右:
-
表示普通文件rwx
表示当前用户有r读,w写,x执行权限。r-x
表示当前用户组有有读,执行权限,但没有写权限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那么友好。
因此,驱动是linux中比较高难度的功课,但是一个系统没有驱动不可能正常运行,所以它又是一个入门需要做的功课,这就很矛盾了。
建议新人避免去解决这个问题,而选择更换发行版比较实在。
linux发行版中,可以考虑manjaro,arch这些更新比较勤快的发行版,这样遇到硬件驱动问题的机率会少很多。或者选择用虚拟机安装,虚拟机的虚拟硬件都是通用的,受到linux系统良好的支持。
图形界面是不需要学习的。很少有教程会指导图形界面的操作,这就是图形界面的优势。但是图形界面有个劣势,就是复杂和不稳定,这个不稳定不是说运行不稳定,而是界面不稳定。
应用程序作者心血来潮,改一下界面布局,以前的方案基本就乱套了。
一般较小或者复杂的程序,都会结合命令行来解决问题。命令行有着稳定的界面,有着高效的执行效率,极低的资源占用,较低的开发难度,实际上优势很大。但是有一明显的缺陷,就是有较高的学习成本。
图形界面可见可得,基本是自解释的,而命令行需要查看帮助,获取每个指令的用途,记忆指令的短语拼写,包括各种参数的组合。
这对一般非专业的用户来说都是多余的成本。因此命令行在windows中就没有多大的市场。但是linux用户专业性比较高,使用命令行的人数会比较多。
命令行对linux用户来说有几个用途:
文件管理:
文件查看:
字符串处理:
sort -u
字符串的处理是 bash 脚本编程中最重要的一项工作,如果对命令行做自动化处理有较高的期望,应该学习一下 linux 世界中的字符串处理三剑客(grep、sed、awk)。在此基础上,就能将命令变得程序化,自动处理复杂的任务。
文本文件编辑器:
很多专业的程序员,擅长使用 vim。但一般人可以学习 nano,较为简单。因为命令行并非一般人的主要用户界面,临时编辑文档用 nano 也足够。图形界面有很多优秀的编辑器,比如 vscode。
安装包管理:
系统信息:
当然获取信息,还可以在linux虚拟的文件系统中查找,比如/proc
, /sys
目录中。或者在系统配置中查看配置内容,如/etc
目录。或者查看当前运行的一些信息/var/log
日志,/run
等。
系统管理:
图形界面命令:
高级技巧:
[abc]
: 替换 abc 中的一个[0-9]
: 替换 0 到 9 中的一个[^abc]
: 替换不是 abc 的一个字符clear
命令也可在linux中,终端命令行是一个重要的存在,因为系统很多启动过程,都要经过shell脚本来处理。你可以把它理解为系统的一个组件,理解它的运行机理,也理解了部分系统的运行原理。
环境变量,说的就是shell变量,定义方式是“变量名=值”,程序可以获取这个值,然后进行相应的执行行为。因此也可以理解为程序配置的一部分。
环境变量的配置文件:
对于linux来说,一个比较隐秘但是有时候却会影响整个系统的地方就是链接器。linux的程序大多数都是通过动态链接器来加载相应的库文件。如果链接时出现状况,比如找不到库文件,或者链接器本身有什么问题,那么所有程序都变为不可用状态。
后台运行的服务,实际上有多种管理器,而最为流行是systemd,使用systemctl 命令来管理,journalctl 来查看日志。
linux系统实际上内核和整体是分离,一个系统可以存在多个内核,只是一次只能选择启动其中一个内核。而内核模块是分离出去的部分内核组件。linux内核除了定义核心的功能,还包含了驱动。因此哪怕你不是内核专家,也应该理解这个运行机制,因为更新驱动是用户日常管理内容。
要更新驱动,首先要找到对应的内核版本,有些驱动在内核源代码包里面,只是默认没有配置编译,可以通过内核源代码包编译这部分驱动。有些没有被收集到内核,可单独编译这部分模块(但也依赖内核头文件等源码),安装到/lib/modules文件夹下。有部分驱动是要安装配套固件的。
为啥时间这个不起眼的项目那么关键,比如安装的时候特别要设置时间和时区这些貌似无关要紧的东西。这是因为网络时代很多时候需要依赖时间来同步信息。时间不准确,系统有时会出现一些莫名其妙的错误。
systemd 管理的时间服务:
linux中任何东西都是文件,因此要备份系统,就是备份文件。大多数配置文件都是文本形式,因此很方便编辑修改。
假设你备份一个系统,然后到另一台电脑上恢复,有几个是需要注意的点:
linux的显示系统是比较复杂的。
如何理解这些部件相互的关系,首先从技术上讲,xorg是底层,其他图形技术是建立在器上面,按功能分类,登录,会话,窗口管理各司其职,而桌面环境就把所有的这些,有机的整合在一起。
linux系统可以同时安装多个桌面环境(当然不保证不发生兼容性问题),登录管理器可以选择登录到其中一套桌面,这点是很灵活的。用户不需要一定要选择某个发行版,才能体验到它自带的桌面。比如dde这个桌面环境,已经被fedora,arch,manjaro等发行版支持了,选择安装即可。
用户也可以自由替换掉某个组件,构建自己喜欢的桌面环境。
xdg 是一个桌面标准组织开发的相关工具。linux 的桌面有多种,比如 gnome、kde 等等,因此为了统一相关的标准,就诞生了 freedesktop 这类组织。
其中 xdg-utils 是一套工具,帮助用户轻松管理桌面环境。
# 使用系统关联的图形程序打开图片
xdg-open ~/Pictures/2b.jpg
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。