[TOC]
按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别
Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本
前者以著名的 Redhat(RHEL)为代表,后者以 Debian 为代表。
从 Linux 发行版,衍生出来的几大主要分支:
Debian
RedHat
SlackWare
Android
Alpine Linux
FreeBSD
Centoo
Arch Linux
ZeroShell
Puppy
LFS
其中,字体加粗的是目前主流的分支,主流的发行版都从这极大分支衍生出来。
后面几个分支,各有其特点。
Debian
Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。
Debian最早由 Ian Murdock 于1993年创建,分为三个版本分支(branch):
stable:最新的测试版本,其中包括最新的软件包,但是也有相对较多的 bug,适合桌面用户
testing:经过 stable 中的测试,相对较为稳定,也支持了不少新技术
unstable:一般只用于服务器,上面的软件包大部分都比较过时,但是稳定和安全性都非常的高
Debian 本身就是一个发行版,然后基于这个分支衍生的主要发行版,根据官方记录有以下几个:
-
Ubuntu:基于 Debian 的 unstable 版本加强而来,Debian 的衍生产品,旨在普及和完善 Linux。
这个系统更新迭代很快,使用 Linux 内核版本也随着其快速迭代。
所以,现在很多开发者、公司都纷纷采用这个发行版作为服务器系统,因为有些技术是基于较高版本的 Linux 内核实现。并且,它除了单纯作为服务器之外,还有优美、简洁的桌面版。
-
桌面版特点是界面非常友好,容易上手,对硬件的支持非常全面,是最适合做桌面系统的Linux发行版本,桌面版有三个:
基于 Gnome 的 Ubuntu
基于 KDE 的 Kubuntu
基于 Xfc 的 Xubuntu
-
Grml:面向系统管理员的 live 系统
基于 Debian 的可启动实时系统 (Live-CD), Grml 包括一组 GNU/Linux 软件,特别是供系统管理员使用,用户不必在固定存储上安装任何东西。 Grml 特别适用于安装、部署和系统救援等管理任务。
Kali Linux:安全审计和渗透测试
Purism PureOS:滚动发行版,专注于隐私、安全和便捷
Tails:保护隐私和保持匿名
......
RedHat
应该称为 Redhat 系列,包括:
RHEL:Red Hat Enterprise Linux,是用于企业生产,可以简单理解为收费版
CentOS:社区版,即免费版,它并不是全新的Linux发行版,而是 RHEL 收费版的克隆版本。
Fedora Core (由原来的 Redhat 桌面版本发展而来,免费版本)
Redhat 应该说是在国内使用人群最多的 Linux 版本,这个版本的特点就是使用人群数量大,资料非常多,言下之意就是如果你有什么不明白的地方,很容易找到人来问,而且网上的一般 Linux 教程都是以 Redhat 为例来讲解的。
Redhat 系列的包管理方式采用的是基于 RPM 包的 YUM 包管理方式,包分发方式是编译好的二进制文件。
稳定性方面 RHEL 和 CentOS 的稳定性非常好,适合于服务器使用,但是 Fedora Core 的稳定性较差,最好只用于桌面应用。
SlackWare
由 Patrick Volkerding 开发的 GNU/Linux 发行版。
与很多其他的发行版不同,它坚持保持简单和直接(KISS,Keep It Simple Stupid)的原则,就是说没有任何配置系统的图形界面工具。
一开始,配置系统会有一些困难,但是更有经验的用户会喜欢这种方式的透明性和灵活性。
Slackware Linux 的另一个突出的特性也符合 KISS 原则:Slackware 没有如 RPM 之类的成熟的软件包管理器。
Slackware 的软件包都是通常的 tgz(tar/gzip) 格式文件再加上安装脚本。
Tgz 对于有经验的用户来说,比 RPM 更为强大,并避免了RPM 之类管理器的依赖性问题。
Slackware 与其他的发行版本(Red Hat、Debian、Gentoo、SuSE、 Mandriva、Ubuntu等)不同的道路,它力图成为 “UNIX 风格” 的 Linux 发行版本。只吸收稳定版本的应用程序,并且缺少其他 Linux 版本中那些为发行版本定制的配置工具。
Android
是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。
中国大陆地区较多人使用 “安卓” 或 “安致”。
Android 操作系统最初由 Andy Rubin 开发,主要支持手机。
2005年8月由 Google 收购注资。
2007年11月,Google 与 84 家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。
随后 Google 以 Apache 开源许可证的授权方式,发布了 Android 的源代码。
第一部 Android 智能手机发布于 2008 年 10 月。
Android 逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。
Alpine Linux
Alpine Linux 是一个独立的、非商业的、通用的 Linux 发行版,专为欣赏安全性、简单性和资源效率的高级用户而设计。
这个发行版的最大特点就是:小而美。
Alpine Linux 是围绕 musl libc 和 busybox 构建的。这使得它比传统的 GNU/Linux 发行版更小,资源效率更高。一个容器需要不超过 8 MB 的空间,最小安装到磁盘需要大约 130 MB 的存储空间。二进制包被精简和拆分,可以更好地控制安装的内容,从而使的环境尽可能小而高效。
Alpine Linux 是一个非常简单的发行版,它使用自己的名为 apk 的包管理器、OpenRC 初始化系统、脚本驱动的设置。提供了一个简单、清晰的 Linux 环境,然后,可以在此基础上添加项目所需的软件包,因此无论是构建家庭 PVR、iSCSI 存储控制器、超薄邮件服务器容器还是嵌入式交换机,其他任何东西都不会挡道。
Alpine Linux 的设计考虑了安全性,所有用户态二进制文件都被编译为具有堆栈粉碎保护的位置独立可执行文件 (PIE),这些主动安全功能可防止利用整类零日漏洞和其他漏洞。
这个发行版最要用途,在于虚拟化,作为基础环境使用。
FreeBSD
是一个自由的、免费的类 UNIX 操作系统 (Unix-like),经由 BSD UNIX 由 AT&T UNIX 衍生而来,FreeBSD 由于法律原因不能称为 UNIX,但由于直接衍生于 BSD UNIX,并且一些原来 BSD UNIX 的开发者后来转到FreeBSD的开发,使得 FreeBSD 在内部结构和系统 API 上与 UNIX 有很大的兼容性。由于 FreeBSD 宽松的法律条款,其代码被好多其他系统借鉴包括苹果公司的 MacOS X,正因此由于 MacOS X 的 UNIX 兼容性,使得 MacOS X 获得了 UNIX 商标认证。
它并不是一个 Linux 系统!但 FreeBSD 与 Linux 的用户群有相当一部分是重合的,二者支持的硬件环境也比较一致,所采用的软件也比较类似,所以可以将FreeBSD 视为一个Linux版本来比较。
FreeBSD拥有两个分支:
stable
current
顾名思义,stable 是稳定版,而 current 则是添加了新技术的测试版。
FreeBSD 采用 Ports 包管理系统,与 Gentoo 类似,基于源代码分发,必须在本地机器编后后才能运行,但是 Ports 系统没有 Portage 系统使用简便,使用起来稍微复杂一些。
FreeBSD 的最大特点就是稳定和高效,是作为服务器操作系统的最佳选 择,但对硬件的支持没有 Linux 完备,所以并不适合作为桌面系统。
Centoo
Gentoo 最初由 Daniel Robbins(FreeBSD 的开发者之一)创建,首个稳定版本发布于2002年。
由于开发者对 FreeBSD 的熟识,所以 Gentoo 拥有媲美 FreeBSD 的广受美誉的 ports 系统 —— Portage 包管理系统。
不同于 APT 和 YUM 等二进制文件分发的包管理系统,Portage 是基于源代码分发的,必须编译后才能运行,对于大型软件而言比较慢,不过正因为所有软件都是在本地机器编译的,在经过各种定制的编译参数优化后,能将机器的硬件性能发挥到极致。
Gentoo 是所有 Linux 发行版本里安装最复杂的,但是又是安装完成后最便于管理的版本,也是在相同硬件环境下运行最快的版本。
LFS
Linux from Scratch,就是一种从网上直接下载源码,从头编译 Linux 的安装方式。
LFS 并不是一个发行版,但是它可以作为制作初级发行版的良好练习。
它提供具体的步骤、特定的补丁、必须的脚本,从而提供一个简便的创建 Linux 发行版的途径。
LFS 构建 可以帮助理解 Linux 系统如何在内部工作 构建 LFS 会帮助自己理解 Linux 相关的所有知识,以及 Linux 操作系统内部如何协同工作并相互依赖,最重要的是,如何根据自己的口味和需求对其进行定制。
构建 LFS 产生了一个非常紧凑的 Linux 系统 当您安装常规发行版时,通常最终会安装许多您可能永远不会使用的程序。他们只是坐在那里占用(宝贵的)磁盘空间。将 LFS 系统安装到 100 MB 以下并不难。这听起来还是很多吗?我们中的一些人一直致力于创建一个非常小的嵌入式 LFS 系统。我们安装了一个足以运行 Apache Web 服务器的系统;总磁盘空间使用量约为 8 MB。通过进一步剥离,可以减少到 5 MB 或更少。尝试使用常规发行版。
LFS 非常灵活 建筑 LFS 可以比作一栋完工的房子。 LFS 将提供房屋的骨架,但由自己来安装管道、电源插座、厨房、浴室、墙纸等。自己可以将其变成需要的任何类型的系统,完全定制为自己。
LFS 提供更高的安全性 将从源代码编译整个系统,从而允许审核所有内容,并应用想要或需要应用的所有安全补丁。不必等待其他人提供(希望)修复安全漏洞的新二进制包。通常,除非自己动手,否则永远不会真正知道安全漏洞是否已修复。
总结
个人感觉目前,RedHat 系列的 CentOS 和 Debian 系列的 Ubuntu 使用用人群最广泛,免费是最大特点,同时这两个发行版也非常的优秀,健全的社区生态。
它们两者的区别:
CentOS 更加稳定,Ubuntu 对新技术支持度更好
CentOS
优点:
CentOS 更稳定些,支持时间也比较长,比较适合稳定线上环境。
从各种配置文档和使用数量来说也是 CentOS 比较有优势,当各种操作出问题,寻找资料时候 CentOS 比较有优势。
很多软件都也都会提供 CentOS 的二进制源,通过 yum 安装配置也非常省事。
缺点:
- CentOS 缺点也是其稳定点,由于追求稳定性,所以内核版本往往比较旧,一些新功能的支持也跟不上,CentOS 对运维更加友好一点。
Ubuntu
优点:
Ubuntu 功能更新,图形桌面支持更好,对开发和个人用更友好。
追求最新功能,内核版本版本较新,新的功能能及时推出同步。
Ubuntu 桌面功能 XWindow 更好,比较适合个人使用,很多开发和个人使用的都是首选 Ubuntu。
缺点:
- 但是在服务器应用方面较 CentOS 少一点。
随着 Docker 崛起,这种差异也在逐渐较少,由于 Ubuntu 内核版本更新,而 Docker 容器对 Linux 内核新功能要求比较高,所以使用 Ubuntu 作为 Docker 容器的宿主机更加友好一点,而且很多项目 Docker 配置时候也仅仅支持了针对 Ubuntu 的 Dockerfile 配置,所以容器化方面 Ubuntu 比较优势。
Ubuntu适合初学者,CentOS更适合公司服务器
两个平台都属于当今最流行的 Linux 平台。 Ubuntu 对于初学者来说是更好的选择,有一个很大的社区平台, 为我们提供丰富的文档和经验,可以图形化界面都适合大部分人的习惯,如果是初学者,没有任何特殊的要求,那就使用 Ubuntu 服务器吧。
CentOS 更适合公司生产环境的使用,CentOS 更新频率不高,只有稳定的版本才会发布,网上的项目教程有很多是基于Centos。
Ubuntu 适合初学者,CentOS 更适合公司服务器
安装 Centos7.6 操作系统,创建一个自己名字的用户名,并可以正常登录,将主要步骤截图
安装选项
在安装好虚拟机配置之后,就可以启动系统,进入安装步骤。
首次将进入会有三个选项:
第一个是直接进入安装流程
第二个是测试媒体,然后进入安装流程
第三个是调试
第一次安装的 ISO 可以选择二,先测试看看下载 ISO 镜像是否存在问题。
设置系统语言
假设无论是排除第三项,在「回车」选择某一项的时候,会进入到如下界面,选择接下来系统所使用的语言:
建议使用英文,因为未来会一直接触英文,除非我们自己开发了中文计算机。
安装初始界面
「语言」界面下一步就进入了系统的主题了,所有的初始化设置都在这界面进行,例如设置时区、安装源、分区、网络等;
设置时区
中国是处于「东 8 区」,选择上海位置就行了。
选择图中的红色框框这一选项,DATE & TIME,很明显这就是日期和时间的意思。
进入如下界面,按照图中的步骤,选择亚洲时区,然后选择城市,最后点击 Done 完成设置。
设置网络
在「初始安装界面」找到图中标注的选项「NETWORK & HOST NAME」,意思是网络与主机名称。
进入「NETWORK & HOST NAME」界面之后,同样按照图中标注的顺序,进行设置。当然,其中有一点,就是「Host name」完全按照意愿设置,因为这不是强制要求的,不影响接下来的使用。
设置分区
第一次分区,简单一点,分区方案就按照下面的规划:
/:100GB
/boot:1GB
/data:50GB
swap:根据内存 2 倍数,4GB
以上方案,特别注意 swap 不是强制按照内存倍数比例来分配的。
4 个分区,只有 /data 不是系统默认的,是自定义的分区。
老样子,找到分区入口选项「INSTALLATION DESTINATION」
进入如下界面,之后按照图中标注的顺序选择,记住一定要选择「I will configure partitioning」,我们要自定义分区。
好了,来到了分配界面了,有三个重要的地方需要知道的,我就按照顺序标注来说了。
-
「标注1」这里有四个选项,我们选择「Standard Partition」即可,分别是:
Standard Partition:标准分区
Btrfs
LVM
LVM Thin Provisioning
「标注2」显示的我们当前有多少空间容量可以分配
「标注3」则是我们最大的空间容量
介绍完成界面之后,接下来就是进入分配阶段了。
按照我们开始的规划,需要分区 4 个,4 个分区都选择「Standard Partition」标准分区就行。
然后点击左下角的加号,表示新增「Standard Partition」分区方案,就会弹出如下的小弹窗:
「小弹窗」第一个输入框是挂载点,第二个是分区容量,单位是容量单位,例如:GB、MB。
之后,点击「Add mount point」添加挂载点按钮。
4 个分区的步骤重复执行之后,就会出现最终的列表,如图:
注意看,左下角粉色框,容量已经剩下 55GB 左右了,之所以不一次性分配完成,是留有余地,保证后续需要可以继续扩展分区容量。
点击「Done」之后,需要再次确认分区方案,点击「Accept changes」同意修改就行。
[图片上传失败...(image-2c2415-1622562279459)]
关闭奔溃记录报告
学习环境就不需要这个选项了,浪费内存。我们可以把它关闭了,进入界面找到「Enable kdump」把复选勾去掉。
安装软件方案
一般来说只需要保持默认「Minimal Install」最小安装就行了,因为服务器不需要界面,软件也不需要系统自带安装的,我们需要都是自定义安装,这样保证软件如我们预期可靠,可控。
但是对于初学者来说,有一个可视化桌面是一个良好的过渡方案。
进入「SOFTWARE SELECTION」选项,找到「Server with GUI」勾选上就行,右边不要勾选,保持默认。
除了这个基础桌面之外,还有别的,例如「GNOME Desktop」也是桌面版的。
安装源
这个保持默认就行了,之后有需要在通过命令行方式修改。
开始安装
在完成以上所有设置之后,点击「Begin Installation」开始安装系统。
最后需要设置「root」用户密码,和创建一个普通用户来日常使用。这是因为使用「root」用户操作太危险,使用普通用户可以避免操作失误带来的巨大损失。
学的话可以尽量简单易记一些,方便我们记忆。
当然,生产的服务器为了保证密钥安全性,需要我们要对密码设置上,多复杂就设置多复杂,这完全的是两个极端的。
之后,若是一切顺序,自此整个系统的初始化安装,需要用户设置就到此告一段落了,等待系统安装完成就可以体验 Linux 的极致性能。
「Reboot」重启系统之后,进入同意许可协议,然后就完成初始化安装了。
记得把虚拟机建立快照哦,这是快速恢复操作系统的重要手段之一,也是虚拟机特有的一种方案。
当然,云服务器也有,那个另说。
配置环境变量,实现执行 history 的时候可以看到执行命令的时间
history 命令有一个变量,可以设置查看时候的格式。既然是格式,就是属于动态内容,可以使用一些变量,特殊符号等等动态信息。
范例:
[22:34:05 main@centos8-huasio ~]$ #18 HISTTIMEFORMAT="$(echo -e "\e[1;36m")%F %T $(echo -e "\e[0;37m")"
上面命令的作用就是增加了日期和时间两个动态数据,其他 echo 就是标注颜色。
- %F:日期
- %T:时间
结果如下:
[22:34:12 main@centos8-huasio ~]$ #19 history
1 2021-06-06 22:11:09 ll
2 2021-06-06 22:11:09 who
3 2021-06-06 22:11:09 tty
4 2021-06-06 22:11:09 free
5 2021-06-06 22:11:09 free -h
6 2021-06-06 22:11:09 ll
7 2021-06-06 22:11:09 ip address
8 2021-06-06 22:11:09 hostname -I
9 2021-06-06 22:11:09 runlevel
10 2021-06-06 22:11:09 init 3
11 2021-06-06 22:11:09 init sudo init 3
12 2021-06-06 22:11:09 su
其实日期和时间是有颜色的,知识 md 无法解析。
持久化设置格式
上面那种直接修改变量是临时的,暂时保存在内存中,并没有持久化到磁盘中,只要本次会话结束,就会恢复原样。
持久化很简单,将变量的修改写入到下面其中一个文件就行。
- /etc/profile
- ~/.bash_profile
范例:
将这行命令,写入到文件中底部,保存就行。
export HISTTIMEFORMAT="$(echo -e "\e[1;36m")%F %T $(echo -e "\e[0;37m")"
总结 Linux哲学思想
一切都是一个文件(包括硬件)
小型,单一用途的程序
链接程序,共同完成复杂的任务
避免令人困惑的用户界面
配置数据存储在文本中
怎么理解一切皆是文件?
首先,明确一点,Linux 受 Unix 的影响,采用了 Unix 优秀的设计思想,UNIX 系统明确了一系列统一的概念和创想,其中就包含这个 「一切皆文件」 的说法。
「一切皆文件」设计原则是提供一个访问大范围输入/输出资源(包括文件、文件夹、硬盘、CD-ROM、调制解调器、键盘、打印机、显示器、终端机甚至跨进程和网络通讯)的统一的范例。窍门是提供一个所有这些资源的抽象对象,UNIX 之父把这个对象叫做「文件」。因为每个「文件」都由同一个 API 暴露,所以你可以用同一套命令来读写/操作磁盘、键盘、文件或网络设备。
相当于使用文件的操作指令,来操作其他任何资源。
这个基本概念有两种含义:
-
在 UNIX 中,一切都是字节流
- 文件其实和一系列可读写的字节没什么区别,如果有一个文件的索引(称之为「文件描述符」),那么 UNIX 的 I/O 通道就已经准备好了,它们有着同样的一套操作和 API —— 无论设备的类型如何、底层硬件是什么。
-
在 UNIX 中,文件系统被用作通用的命名空间
- 文件不仅仅是有一致 API 的字节流,而且可以被统一的方式索引:文件系统有着通用命名空间
如同 Unix,Linux 中所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(socket)、网络通信等资源也都是文件。
小型,单一用途的程序
程序和可执行文件不要太复杂,这样才能保证了linux内核的高效运行
链接程序,共同完成复杂的任务
复杂的任务可以通过连接多个简单的程序实现复杂的功能。
对于复杂的功能,Linux 通过许多简单程序的组合等方式实现,在保证简单功能的高效性的同时,复杂的程序也必然是高效性的。
这个设计思想非常棒,一个庞大的功能,注定难以管控。若是,以小功能组成,那么只需要对小功能管理,哪里有问题处理哪里。同时,这些小功能组合复杂多样,可以无限搭配各种功能,而不仅仅一种用途。
我想这就是:好聚好散,再聚不难;
避免令人困惑的用户界面
如 Windows 那样出了问题一般人选择的会是重启,实在是不行的话就是重新安装系统了,因为对于 Windows 那样不是开源的,并且用户界面比较复杂,操作系统出了问题,一般的人是根本没有办法解决的。
但是 Linux 就不一样了,Linux 是开源的,无论什么问题都可以通过简洁的命令行实现排错,修改系统的配置,更彻底的直接翻代码,理解底层如何运作,避免出现为何出现这种问题的疑惑。
所以,Linux 一切都是简洁明了为基础。
配置数据存储在文本中
Linux 所有的配置文件都存放在文本配置文件当中,无论什么程序,只需修改其配置文件即可。
配置文件是文本形式的,只需任意一款文本编辑器都能修改,而不是类似于 Windows 那样将保存在注册表中,并且 Windows 的注册表需要专门的二进制或十六进制的编辑器才可编辑,修改比较复杂。
总结 Linux 常用命令使用格式,并用实例说明
常用命令:
-
echo
- 将跟随的字符序列进行解析打印,显示在命令终端。
- echo "my hostname is $HOSTNAME":my hostname is centos8-huasio.com
-
ps:查看系统活动进程信息
- ps:默认显示与当前用户 EUID 相同的,并与调用者相关联的所有进程信息
- ps aux:BSD 风格选项,u 表示进程归属什么用户,a 表示列出带有 tty 终端标识的所有进程,加上 x 表示列出所有进程
-
id:显示用户和组对象的属性
- id,默认打印当前用户:uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- id root,打印 root 用户:uid=0(root) gid=0(root) groups=0(root)
-
date:可以查看、修改Linux 系统时间
- date 010203042021,将 Linux 的时间修改为 2021-01-02 03:04
- date +%F,格式化显示当前 Linux 系统日期为:年月日,例如:2021-01-02
-
ls:列出当前工作目录或指定路径下所有子目录及其文件信息
- ll,是一个别名,可以查看完整的文件元数据属性信息,同时针对不同类型的文件显示不同颜色,这里的文件指的是广义上文件,目录也是文件。
- ls -ahl:以人可读的方式和长格式打印当前工作目录下所有文件元数据,包括隐藏文件
-
cat:查看文本文件数据
- cat file.txt:显示文本数据
- cat -n 100 file.txt:显示文本数据,并且显示行号
- cat -b file.txt:非空显示文本数据,并且显示行号,-b 是重写 -n 的选项
-
cd:切换工作目录
- cd ~:回到家目录
- cd /:切换到根目录
- cd ..:切换到父目录
-
mv:移动到指定目标位置
- mv /home/main/123.txt /home/main/test/123.txt
-
mkdir:创建空目录
- mkdir test:创建目录
- mkdir -p /home/mian/test/not/logs:递归式创建目录
-
rm:删除文件、目录
- rm -i:删除前提示
- rm -rf:递归式强制删除指定目录下所有数据,包含自身,这个命令很危险
-
cp:复制文件
- cp file1.txt file2.txt:复制 file1.txt,并且重命名为 file2.txt
- cp -r /home/main/a /home/mian/b:递归式复制 a 目录到 b 目录下,复制目录需要加 -r 选项
-
kill:杀掉进程
- kill 1010:kill 掉 id 为 1010 的进程
-
which:搜索显示 alias、非 shell 函数
which echo:/usr/bin/echo
-
which ll:alias ll='ls -l --color=auto':显示别名以及命令位置
/usr/bin/ls
whereis:搜索非 shell 命令的外建命令,显示命令全路径、源文件、文档的位置
bc:Linux 上面的计算器,ibase=8,obase=2,表示输入是8进制,输出是2进制
exit:退出终端,可以跟随一个状态码,一般这种状态码可以用于 shell 脚本文件上下文处理。
.........
描述Linux发行版的系统目录名称命名规则以及用途
文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了 Linux 操作系统中的主要目录及目录内容。
FHS 由 Linux 基金会维护, 当前版本为 3.0 版,于 2015 年发布官方标准文档。
规范定义:
1、遵循FHS(Filesystem Hierarchy Standard)标准
2、严格区分大小写
3、目录也是文件,同一路径下,不能存在相同的文件名
4、可以使用除了 /
以外的任意字符
5、文件最长字符不能超过 225 个
Linux文件类型
使用 ls -l 命令或者 ll 命令显示文件类型:
- -:普通文件
- d:目录文件
- b:块设备
- c:字符设备
- l:符号链接文件
- p:管道文件 pipe
- s:套接字文件 socket
Linux发行版基本目录架构及用途
/ #linux文件系统中/目录为顶级目录,一切都从/开始
/bin #所有用户可用的基本命令程序文件位置
/boot #引导加载器必须用到的各种静态文件:kernel、initramfs(initrd)、grub等
/dev #存储特殊文件或设备文件,设备有两种类型:
c:character device 字符设备(线性设备)
b:block device 块设备(随机设备)
/etc #系统程序的配置文件,只能为静态
/etc/rc.d #系统启动的配置文件和脚本
/etc/fstab #指定启动时需要挂载的文件系统列表
/etc/passwd #用户数据库,记录了用户名、用户id、组id、家目录和shell等信息
/etc/shadow #用户的真实账号和密码存放文件,通常以加密的形式存在
/etc/group #记录了用户组的各种信息
/etc/inittab #init的配置文件
/etc/issue #用户登陆提示符前的提示信息,通常包括系统的说明或欢迎信息,内容由管理员设定。
/home #普通用户的家目录的位置:每个普通用户的家目录是这个目录下的同名目录。/home/USERNAME
/lib #为系统启动或根文件系统上的应用程序(/bin, /sbin)提供共享库,以及为内核提供内核模块。
libc.so.* #动态链接的C库
ld* #运行时链接器/加载器
modules #用于存储内核模块的目录
/lib64 #64位系统特有的存放共享库的路径
/media #便携式设备挂载点,cdrom,floppy等
/mnt #其它文件系统的临时挂载点
/opt #附加应用程序的安装位置,可选路径。插件的安装位置 Add-on application,第三方应用程序
/proc #基于内存的虚拟文件系统,内核和进程存储其相关信息,他们多为内核参数,例如:net.ipv4.ip_forward, 虚拟为net/ipv4/ip_forward,存储于/proc/sys/下,因此完整路径为/proc/sys/net/ipv4/ip_forward
/root #超级管理员的家目录
/run #各种运行数据的所在位置
/sbin #提供系统管理使用的工具程序
/srv #当前主机为服务提供的数据,不具有通用性。主要用来存储本机或本服务器提供的服务或数据
/sys #sysfs虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径。比/proc更新,更灵活。为管理Linux设备提供了一种同一模型的接口,管理硬件信息
/tmp #临时文件,几乎所有程序都会用到的目录,可供所有用户执行写入操作,有特殊权限
/usr #全局共享的只读数据路径
/usr/bin #存放应用程序
/usr/sbin #超级用户的一些管理程序
/usr/lib #常用的动态链接库和软件包的配置文件
/usr/include#C程序头文件
/usr/share #命令手册页和自带文档等架构特有的的文件的存储路径位置
/usr/local #另一个层级目录,让系统管理员安装本地应用程序,也通常用于安装第三方程序
/usr/X11R6 #X-Window程序的安装目录
/usr/src #程序源码文件的存储位置
/var #存储常发生变化的数据的目录
/var/cache #应用程序缓存数据目录
/var/lib #应用程序状态信息数据
/var/local #专用于/usr/local下的应用程序存储可变数据
/var/lock #锁文件
/var/log #日志目录及文件
/var/opt #专用于/opt下的应用程序存储可变数据
/var/run #运行中的进程相关的数据,通常用于存储进程的pid文件
/var/spool #应用程序的数据池
/var/tmp #保存系统两次重启之间产生的临时数据
描述文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息?
使用 ls 命令可以查看文件、目录元数据信息:
[20:36:41 main@centos8-huasio:~ $] #58 ls -ahl
total 44K
drwx------. 15 main main 4.0K Jun 13 19:00 .
drwxr-xr-x. 3 root root 18 Jun 2 20:56 ..
-rw-------. 1 main main 3.5K Jun 13 20:34 .bash_history
-rw-r--r--. 1 main main 18 Jul 21 2020 .bash_logout
-rw-r--r--. 1 main main 141 Jul 21 2020 .bash_profile
-rw-r--r--. 1 main main 436 Jun 11 20:18 .bashrc
drwx------. 9 main main 220 Jun 2 21:02 .cache
drwx------. 10 main main 171 Jun 2 21:02 .config
drwxr-xr-x. 2 main main 6 Jun 2 21:02 Desktop
drwxr-xr-x. 2 main main 6 Jun 2 21:02 Documents
drwxr-xr-x. 2 main main 6 Jun 2 21:02 Downloads
-rw-------. 1 main main 16 Jun 2 21:02 .esd_auth
-rw-rw-r--. 1 main main 0 Jun 13 20:33 file
-rw-rw-r--. 1 main main 72 Jun 13 17:14 file2.log
-rw-rw-r--. 1 main main 24 Jun 13 18:46 file.log
# 省略文件
......
可以看到,列出的信息种有好几列,例如第一行记录,信息解析分别如下:
- drwx------.:第一列信息,第一个字符表示文件类型,d 表示目录,后面 9 个字符与权限有关
- 15:这个是硬链接引用计数,也就是相同的 inode number 有 15 个文件。
- main:这是当前文件归属的所有者
- main:这是当前文件归属的用户组
- 4.0K:该文件的大小
- Jun 13 19:00:默认显示的修改时间,文件的时间戳有三种
- mtime:文件内容修改时间,这是默认显示的时间戳
- atime:文件的访问时间
- ctime:文件元数据变更时间,只要文件的元数据发生改变,改时间戳就会更新
- .:最后一列就是文件名称,这 . 符号表示当前目录
除了 ls 命令,还有一个命令可以查看具体文件的状态:
[20:36:45 main@centos8-huasio:~ $] #59 stat file
File: file
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 202502260 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ main) Gid: ( 1000/ main)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-06-13 20:33:51.784583983 +0800
Modify: 2021-06-13 20:33:49.391584122 +0800
Change: 2021-06-13 20:33:49.391584122 +0800
Birth: -
文件的时间除了常用文件操作会发生变化,还有一个命令可以更新时间戳。
touch 命令是创建一个空文件,若是文件存在,则更新三种时间。
[20:45:50 main@centos8-huasio:~ $] #61 touch file
[20:45:52 main@centos8-huasio:~ $] #62 ll file
-rw-rw-r--. 1 main main 0 Jun 13 20:45 file
更新修改时间:
[20:47:59 main@centos8-huasio:~ $] #73 stat file
File: file
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 202502260 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ main) Gid: ( 1000/ main)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-06-13 20:47:59.718534860 +0800 # 访问时间
Modify: 2021-06-13 20:47:59.718534860 +0800 # 内容修改时间
Change: 2021-06-13 20:47:59.718534860 +0800 # 元数据修改时间
Birth: -
[20:48:01 main@centos8-huasio:~ $] #74 touch -m file
[20:48:47 main@centos8-huasio:~ $] #75 stat file
File: file
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 202502260 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ main) Gid: ( 1000/ main)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-06-13 20:47:59.718534860 +0800 # 访问时间
Modify: 2021-06-13 20:48:47.877532070 +0800 # 内容修改时间
Change: 2021-06-13 20:48:47.877532070 +0800 # 元数据修改时间
Birth: -
同样的,更新访问时间,使用 touch 命令加上 -a 选项即可。
touch -a file
使用这种方式也是等同于简写命令:
touch --time=atime file
--time 选项有效参数如下:
- 更新访问时间:atime、access、use
- 更细修改时间:mtime、modify
总结软连接和硬连接区别,并用实例操作说明
硬链接
对某一个文件进行硬链接操作,会创建一个文件,这个新文件在本质上还是同一个文件,没有任何区别。针对某一个文件创建出来所有硬链接,本质上还是同一个文件,它们拥有相同的 INode Number。
硬链接特性:
- 创建硬链接会在相应的目录中增加一个目录项,以引用文件,文件还是和 INode Number 关联。
- 基于相同文件创建的硬链接,它们对应同一文件系统上一个物理文件。
- 每创建一个硬链接,链接数量递增
- 删除文件时候,会递减一个链接数量。针对链接数为 1 的文件,删除则真是删除,而不是递减链接数。
- 创建硬链接不能跨分区
- 硬链接的本质是一个文件多个名称,在相同分区下,都使用一个 inode number,在磁盘只有一份物理数据。
- 分区与分区的 Inode 表是不同,每个分区都有一个属于分区自身的 Inode 表,分区之间 inode 数据是不互通的,没办法跨分区找 inode 中的文件元数据。
- 不支持对目录创建硬链接,可能会进入无限循环中。
创建硬链接:
ln source_filename target_filename
[20:55:02 main@centos8-huasio:~ $] #83 ln file file2
软链接
也叫符号链接(symbolic),一个符号文件执行另一个文件,有点像 Windows 的快捷方式。
创建的软链接文件与源文本是两个文件,它们的 INode Number 是不一样。
软链接的特性:
- 一个符号链接的内容是引用文件的文件名称,包含路径的。
- 可以对目录创建软链接
- 可以跨分区创建软链接
- 软件链接文件指向物理文件的路径,其大小为路径的长度,不会增加和减少目标文件的 INode 引用计数。
- 软链接若是使用相对路径,目标文件相对于软链接文件,软链接文件相对于当前目录。
- 软链接文件依赖于源文件,源文件删除了,软链接就不能用了。
创建软链接:
ln -s source_filename target_filename
[20:55:11 main@centos8-huasio:~ $] #85 ln -s file file3
硬链接与软链接的区别:
硬链接 | 软链接 | |
---|---|---|
文件本质 | 硬链接文件与源文件本上是同一个文件; | 软链接文件与源文件是不同文件 |
是否支持跨设备 | 否 | 是 |
是否相同 Inode Number | 是 | 否 |
是否改变链接引用计数 | 是 | 否 |
是否支持对目录创建链接 | 否 | 是 |
使用相对路径差异 | 硬链接本质是创建一个相同文件,而非引用,所以相对于当前目录是可行的 | 软链接是创建一个引用链接,相对于路径有些差异。<br />目标文件相对于软链接文件,软链接文件相对于当前目录 |
删除差异 | 当前文件文件链接计数大于 1 时候,会递减计数,否则真正删除该文件 | 删除源文件则软链接无法解析路径,也就是不能访问 |
文件类型 | 与源文件相同 | 是一个链接类型的文件 |