初识Linux(一)------ 什么是Linux、磁盘分区与简单指令介绍

前言

  最近遇到的项目需要在Linux上进行开发测试,作为萌新宝宝的我是一点不懂,还以为和Windows操作差不多,结果在Linux上屡屡四处碰壁,举步维艰。无奈只能祭出我本科大一就买的却一页未看的宝书,从零开始学Linux,亡羊补牢。

  这个系列博客不知道能不能坚持的下去记录完,我写博客经常就是半途而废,中道崩殂,O(∩_∩)O哈哈~。

  基本上全文参考或摘抄自《鸟哥的Linux私房菜------基础学习篇》,向鸟哥致敬。

  那么言归正传,正式开始学习吧,(*╹▽╹*)。

1.计算机概论

  不管是什么用途的软件都得在一定的硬件基础上才能得以运行,那么在认识Linux之前,就得先大致了解一下计算机硬件,如果是计算机相关专业的同学一定都学过《计算机组成原理》。我还有些印象,那么这个部分我就暂时跳过了,(#^.^#)。

2.Linux是什么

  这个问题我没学前我也会,操作系统嘛。

  Linux的诞生还有一段有趣的历史,这里略过不谈。

  Linux的内核原型是1991年由林纳斯·托瓦兹(Linus  Torvalds)编写的,由于其开源免费兼容等特性,受到了当时计算机从业者的青睐,并自发地给Linux添加功能,最终形成完善的Linux操作系统。

  Linux核心网站:http://www.kernel.org

  Linux的吉祥物是企鹅,据说是因为他小时候去动物园被企鹅咬了一口,此后念念不忘。(离谱)

2.1 Linux的核心版本

  Linux的核心版本编号有点类似如下的样子:

  3.10.0-123.el7.x86_64
  主版本.次版本.释出版本-修改版本

奇数、偶数版本分类(现在弃用了)

  在 2.6.x 版本以前,托瓦兹将核心的发展趋势分为两股,并根据这两股核心的发展分别给予不同的核心编号,那就是:

  • 主、次版本为奇数:发展中版本(development)

  如2.5.xx,这种核心版本主要用在测试与发展新功能,所以通常这种版本仅有核心开发工程师会使用。 如果有新增的核心程序码,会加到这种版本当中,等到众多工程师测试没问题后,才加入下一版的稳定核心中;

  • 主、次版本为偶数:稳定版本(stable)

  如2.6.xx,等到核心功能发展成熟后会加到这类的版本中,主要用在一般家用计算机以及企业版本中。 重点在于提供使用者一个相对稳定的Linux作业环境平台。
  至于释出版本则是在主、次版本架构不变的情况下,新增的功能累积到一定的程度后所新释出的核心版本。 而由于Linux核心是使用GPL的授权,因此大家都能够进行核心程序码的修改。因此,如果你有针对某个版本的核心修改过部分的程序码, 那么那个被修改过的新的核心版本就可以加上所谓的修改版本了。

 主线版本、长期维护版本(longterm version)

从 Linux kernel 3.0 开始,已经舍弃奇数、偶数的核心版本规划,新的规划使用主线版本 (MainLine) 为依据, 并提供长期支持版本 (longterm) 来加强某些功能的持续维护

查看Linux核心版本:

uname -a

当然还有更为详细的查看方式:https://blog.csdn.net/weixin_46944519/article/details/123840157

2.2 Linux的完整发布套件

   Kernel + Softwares + Tools + 可完整安装程序”,我们称之为Linux distribution。

 

 

   这些开发商们根据软件的安装方式主要分为两类:一种是使用rpm方式安装的,一种是使用Debian的dpkg方式安装的。

 

2.3 Linux的使用场景

  • 关键任务应用,比如金融界的数据库;
  • 高性能运算任务;
  • 个人PC操作系统;
  • 手机,Pad啥的,Android其实就是Linux核心的一支;
  • 嵌入式系统;
  • 云服务;
  • 网络服务器,继承了Unix高稳定的良好传统;

3.主机规划与磁盘分区

3.1 主机规划

  根据需求配置好硬件,按需分配。

3.2  磁盘分区

  在Linux系统中,每个设备都被当成一个文件来对待。

  比如,SATA接口的硬盘的文件名为 /dev/sd[a-d]。

  可能现在不大一样了,我没验证,反正差不多。

 3.3  磁盘连接的方式与设备文件名的关系

  个人计算机常见的磁盘接口有两种, 分别是SATA与SAS接口,目前(2015)的主流是SATA接口。

  以SATA接口来说,由于SATA/USB/SAS等磁盘接口都是使用SCSI模块来驱动的, 因此这些接口的磁盘设备文件名都是/dev/sd[a-p]的格式。 所以SATA/USB接口的磁盘根本就没有一定的顺序,那如何决定他的设备文件名呢? 这个时候就得要根据Linux核心侦测到磁盘的顺序了!

例如:

如果你的PC上面有两个SATA磁盘以及一个USB磁盘,而主板上面有六个SATA的插槽。这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上, 请问这三个磁盘在Linux中的设备文件名为何?
答:
由于是使用侦测到的顺序来决定设备文件名,并非与实际插槽代号有关,因此设备的文件名如下:
1. SATA1插槽上的文件名:/dev/sda
2. SATA5插槽上的文件名:/dev/sdb
3. USB磁盘(开机完成后才被系统捉到):/dev/sdc

  这本书里介绍时都是拿机械硬盘举例,至于现在的固态硬盘是不是这样,我就不知道了。

  磁盘的组成主要有盘片、机械手臂、磁头与主轴马达所组成, 而数据的写入其实是在盘片上面。

  盘片上面又可细分出扇区(Sector)与磁道(Track)两种单位, 其中扇区的物理量设计有两种大小,分别是 512Bytes 与 4KBytes。假设磁盘只有一个盘片,那么盘片有点像下面这样:

   整颗磁盘的第一个扇区特别的重要,因为他记录了整颗磁盘的重要信息! 早期磁盘第一个扇区里面含有的重要信息我们称为MBR (Master Boot Record) 格式,但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于 2TB 以上的磁盘分区已经让某些操作系统无法存取。因此后来又多了一个新的磁盘分区格式,称为 GPT (GUID partition table)!

  如果想有效使用硬盘。还得将硬盘进行分区,从而产生分区表。

  通常磁盘可能有多个盘片,所有盘片的同一个磁道我们称为柱面 (Cylinder), 通常那是文件系统的最小单位,也就是分区的最小单位。

3.4 MSDOS(MBR) 与 GPT 磁盘分区表(partition table)

3.4.1 MSDOS (MBR) 分区表格式与限制

  早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机记录区) 的方式来处理开机管理程序与分区表。而开机管理程序记录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大小 (旧的磁盘扇区都是 512Bytes !),所以说,第一个扇区 512Bytes 会有这两个数据:

  • 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446 Bytes;
  • 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes。

  由于分区表所在区块仅有64 Bytes容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码。 若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64 Bytes的记录区段有点像下面的图示:

 

 

   假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名如下所示, 重点在于文件名后面会再接一个数字,这个数字与该分区所在的位置有关:

  • P1:/dev/sda1
  • P2:/dev/sda2
  • P3:/dev/sda3
  • P4:/dev/sda4

  上图中我们假设硬盘只有400个柱面,共分区成为四个分区,第四个分区所在为第301到400号柱面的范围。 当你的操作系统为Windows时,那么第一到第四个分区的代号应该就是C, D, E, F。当你有数据要写入F盘时, 你的数据会被写入这颗磁盘的301~400号柱面之间的意思。

  由于分区表就只有64 Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或延伸(Extended)分区。 根据上面的图示与说明,我们可以得到几个重点信息:

  • 其实所谓的“分区”只是针对那个64 Bytes的分区表进行设置而已!
  • 硬盘默认的分区表仅能写入四组分区信息
  • 这四组分区信息我们称为主要(Primary)或延伸(Extended)分区
  • 分区的最小单位“通常”为柱面(cylinder)
  • 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理

为什么非要分区?

  • 数据安全,就比如你在Windows要重装系统盘C时,不会影响其他盘的数据;
  • 系统性能,数据集中存放,可以提高数据读取速度;

既然分区表只有记录四组数据的空间,那么是否代表一颗硬盘最多只能分区出四个分区?

  当然不是,可以通过延伸分区(Extended)的方式来处理。

  延伸分区的想法是: 既然第一个扇区所在的分区表只能记录四笔数据, 那我可否利用额外的扇区来记录更多的分区信息?实际上图示有点像下面这样:

 

 

   实际上延伸分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记载分区信息的。

  由延伸分区继续切出来的分区,就被称为逻辑分区(logical partition)。

  上述的分区在Linux系统中的设备文件名分别如下:

  • P1:/dev/sda1
  • P2:/dev/sda2
  • L1:/dev/sda5
  • L2:/dev/sda6
  • L3:/dev/sda7
  • L4:/dev/sda8
  • L5:/dev/sda9

  仔细看看,怎么设备文件名没有/dev/sda3与/dev/sda4呢?因为前面四个号码都是保留给Primary或Extended用的。所以逻辑分区的设备名称号码就由5号开始了!这在 MBR 方式的分区表中是个很重要的特性。

  • 主要分区与延伸分区最多可以有四笔(硬盘的限制)
  • 延伸分区最多只能有一个(操作系统的限制)
  • 逻辑分区是由延伸分区持续切割出来的分区;
  • 能够被格式化后,作为数据存取的分区为主要分区与逻辑分区。延伸分区无法格式化;
  • 逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的分区限制;

  逻辑分区间可以整合成一个分区,但逻辑分区和主分区不能整合。

  由于第一个扇区所记录的分区表与MBR是这么的重要,几乎只要读取硬盘都会先由这个扇区先读起。 因此,如果整颗硬盘的第一个扇区(就是MBR与partition table所在的扇区)物理实体坏掉了,那这个硬盘大概就没有用了。

  MBR 分区表除了上述的主分区、延伸分区、逻辑分区需要注意之外,由于每组分区表仅有 16Bytes 而已,因此可记录的信息真的是相当有限的! 所以,在过去 MBR 分区表的限制中经常可以发现如下的问题:

  • 操作系统无法抓取到 2.2T 以上的磁盘容量!
  • MBR 仅有一个区块,若被破坏后,经常无法或很难救援。
  • MBR 内的存放开机管理程序的区块仅 446Bytes,无法容纳较多的程序码。

3.4.2 GUID partition table, GPT 磁盘分区表

  因为过去一个扇区大小就是 512Bytes 而已,不过目前已经有 4K 的扇区设计出现。为了相容于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块位址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(默认为 512Bytes ) 来规划,而第一个 LBA 称为 LBA0 (从 0 开始编号)。

  与 MBR 仅使用第一个 512Bytes 区块来记录不同, GPT 使用了 34 个 LBA 区块来记录分区信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份。

 

上述图示的解释说明如下:

  • LBA0 (MBR 相容区块)

  与 MBR 模式相似的,这个相容区块也分为两个部份,一个就是跟之前 446 Bytes 相似的区块,储存了第一阶段的开机管理程序。而在原本的分区表的记录区内,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的磁盘管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护了此磁盘。

  • LBA1 (GPT 表头记录)

  这个部份记录了分区表本身的位置与大小,同时记录了备份用的 GPT 分区 (就是前面谈到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以通过这个记录区来取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运行。

  • LBA2-33 (实际记录分区信息处)

  从 LBA2 区块开始,每个 LBA 都可以记录 4 笔分区记录,所以在默认的情况下,总共可以有 4*32 = 128 笔分区记录。因为每个 LBA 有 512Bytes,因此每笔记录用到 128 Bytes 的空间,除了每笔记录所需要的识别码与相关的记录之外,GPT 在每笔记录中分别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对於单一分区来说, 他的最大容量限制就会在“ 264 * 512Bytes = 263 * 1KBytes = 233*TB = 8 ZB ”,要注意 1ZB = 230TB 。

  现在 GPT 分区默认可以提供多达 128 笔记录,而在 Linux 本身的核心设备记录中,针对单一磁盘来说,虽然过去最多只能到达 15 个分区,不过由于 Linux kernel 通过 udev 等方式的处理,现在 Linux 也已经没有这个限制在了! 此外,GPT 分区已经没有所谓的主、延伸、逻辑分区的概念,既然每笔记录都可以独立存在, 当然每个都可以视为是主分区!每一个分区都可以拿来格式化使用。

   在磁盘管理工具上面, fdisk 这个老牌的软件并不认识 GPT 。要使用 GPT 的话,得要操作类似 gdisk 或者是 parted 指令。 另外,开机管理程序方面, grub 第一版并不认识 GPT,得要 grub2 以后才行。

3.5 开机流程中的 BIOS 与 UEFI 开机检测程序

   基本上,目前的主机系统在载入硬件驱动方面的程序,主要有早期的 BIOS 与新的 UEFI 两种机制。

3.5.1 BIOS 搭配 MBR/GPT 的开机流程

   在计算机组成原理里,学到过BIOS与CMOS两个东西, CMOS是记录各项硬件参数且嵌入在主板上面的储存器,BIOS则是一个写入到主板上的一个固件(再次说明, 固件就是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,计算机系统会主动执行的第一个程序了。

   BIOS会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS会依据使用者的设置去取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的MBR位置。 MBR这个仅有446 Bytes的硬盘容量里面会放置最基本的开机管理程序, 此时BIOS就功成圆满,而接下来就是MBR内的开机管理程序的工作了。

  简单的说,整个开机流程到操作系统之前的动作应该是这样的:

  • BIOS:开机主动执行的固件,会认识第一个可开机的设备;
  • MBR:第一个可开机设备的第一个扇区内的主要开机记录区块,内含开机管理程序;
  • 开机管理程序(boot loader):一个可读取核心文件来执行的软件;
  • 核心文件:开始操作系统的功能...

   如果你的开机管理程序能够认识 GPT 的话,那么使用 BIOS 同样可以读取到正确的操作系统核心,但是如果像Windows XP那种环境就不行。

  由于 LBA0 仅提供第一阶段的开机管理程序码,因此如果使用类似 grub 的开机管理程序的话,那么就得要额外分区出一个“ BIOS boot 的分区, 这个分区才能够放置其他开机过程所需的程序码。

  BIOS与MBR都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR上面的一套软件了。由于MBR仅有446 Bytes而已,因此这个开机管理程序是非常小而美的。 这个boot loader的主要任务有下面这些项目:

  • 提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  • 转交其他loader:将开机管理功能转交给其他loader负责(多系统时)。

 

  如果要安装多系统, 最好先安装Windows再安装Linux,这是因为:

  Linux在安装的时候,你可以选择将开机管理程序安装在MBR或各别分区的开机扇区, 而且Linux的loader可以手动设置菜单(就是上图的M1, M2...),所以你可以在Linux的boot loader里面加入Windows开机的选项;

  Windows在安装的时候,他的安装程序会主动的覆盖掉MBR以及自己所在分区的开机扇区,你没有选择的机会, 而且他没有让我们自己选择菜单的功能。
  因此,如果先安装Linux再安装Windows的话,那MBR的开机管理程序就只会有Windows的项目,而不会有Linux的项目。

3.5.2 UEFI BIOS 搭配 GPT 开机的流程

   GPT 可以提供到 64bit 的寻址,然后也能够使用较大的区块来处理开机管理程序。但是 BIOS 其实不懂 GPT ,还得要通过 GPT 提供相容模式才能够读写这个磁盘设备,而且 BIOS 仅为 16 位的程序,在与现阶段新的操作系统接轨方面有点弱。为了解决这个问题,因此就有了 UEFI (Unified Extensible Firmware Interface) 这个统一可延伸固件界面的产生。

  UEFI 主要是想要取代 BIOS 这个固件界面,因此我们也称 UEFI 为 UEFI BIOS 。UEFI 使用 C 程序语言,比起使用组合语言的传统 BIOS 要更容易开发。

 

  此外,由于过去 cracker 经常借由 BIOS 开机阶段来破坏系统,并取得系统的控制权,因此 UEFI 加入了一个所谓的安全启动 (secure boot) 机制, 这个机制代表着即将开机的操作系统必须要被 UEFI 所验证,否则就无法顺利开机。微软用了很多这样的机制来管理硬件。 不过加入这个机制后,许多的操作系统,包括 Linux ,就很有可能无法顺利开机。所以,某些时刻,你可能得要将 UEFI 的 secure boot 功能关闭, 才能够顺利的进入 Linux。(我没遇到)

   另外,与 BIOS 模式相比,虽然 UEFI 可以直接取得 GPT 的分区表,不过最好依旧拥有 BIOS boot 的分区支持, 同时,为了与 windows 相容,并且提供其他第三方厂商所使用的 UEFI 应用程序储存的空间,你必须要格式化一个 vfat 的文件系统, 大约提供 512MB 到 1G 左右的容量,以让其他 UEFI 执行较为方便。(更没用到,是不是过时了?)

3.6 Linux安装模式下,磁盘分区的选择

目录树结构 (directory tree)

  所谓的目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构。 所以,整个目录树架构最重要的就是那个根目录(root directory),这个根目录的表示方法为一条斜线“/”, 所有的文件都与目录树有关。目录树的呈现方式如下图所示:

 

  如上图所示,所有的文件都是由根目录(/)衍生来的,而次目录之下还能够有其他的数据存在。上图中长方形为目录, 波浪形则为文件。那当我们想要取得mydata那个文件时,系统就得由根目录开始找,然后找到home接下来找到dmtsai, 最终的文件名为:/home/dmtsai/mydata的意思。

 文件系统与目录树的关系(挂载)

  所谓的“挂载”就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下; 也就是说,进入该目录就可以读取该分区的意思。这个动作我们称为“挂载”,那个进入点的目录我们称为“挂载点”。 由于整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区的。 至于其他的目录则可依使用者自己的需求来给予挂载到不同的分区。我们以下图来作为一个说明:

 

  至于具体安装时,建议参考别的博客。

4. 安装Linux

  这里面坑还蛮多的,尤其是安装双系统时,Linux安装成功与否还和使用制作镜像的工具有关。最好用 rufus 来制作镜像。

  当然,虚拟机更方便,一键安装,不需要考虑分区。

   我不想写了,已经有很多文章来介绍了。

5. 终端模式的切换与指令介绍

5.1 介绍

  Linux上的图形化界面一般是GNOME,GNOME 是一个完全由自由软件组成的桌面环境。X Window代表窗口管理员环境,纯命令行的环境称为文字模式,代表为终端机接口, terminal 或 console。

  Linux默认的情况下会提供六个Terminal来让使用者登陆, 切换的方式为使用:[Ctrl] + [Alt] + [F1]~[F6]的组合按钮。

  系统将[F1] ~ [F6]命名为tty1 ~ tty6的操作接口环境。当你按下[crtl] + [Alt] + [F1]这三个组合按钮时 (按着[ctrl]与[Alt]不放,再按下[F1]功能键), 就会进入到tty1的terminal接口中了。

登陆的环境如下:

  • [Ctrl] + [Alt] + [F2] ~ [F6] :命令行登陆 tty2 ~ tty6 终端机;
  • [Ctrl] + [Alt] + [F1] :图形接口桌面。

  由于系统默认的登陆界面不同,因此你想要进入 X 的终端机名称也可能会有些许差异。以 CentOS 7 为例,默认是启动图形界面的,因此这个 X 窗口将会出现在 tty1 界面中。如果你的 Linux 默认使用纯命令行,那么 tty1~tty6 就会被文字界面占用。

  若你在纯文本环境中启动 X 窗口,那么图形界面就会出现在当时的那个 tty 上面。

# 纯命令行下 (不能有 X 存在) 启动窗口界面的作法
[dmtsai@study ~]$ startx

  要让startx生效至少需要下面这几件事情的配合:

  • 并没有其他的 X window 被启用;
  • 必须已经安装了X Window system,并且X server是能够顺利启动的;
  • 最好要有窗口管理员,例如GNOME/KDE等;

  其实,所谓的窗口环境,就是:“文字界面加上 X 窗口软件”的组合!因此,文字界面是一定会存在的,只是窗口界面软件就看你要不要启动而已。 所以,我们才有办法在纯文本环境下启动一个个人化的 X 窗口。因为这个 startx 是任何人都可以执行的,并不一定需要管理员身份的。 所以,是否默认要使用图形界面,只要在后续管理服务的程序中,将“ graphical.target ”这个目标服务设置为默认,就能够默认使用图形界面。

5.2 在终端接口登陆linux与指令

  在文本模式下登录,会显示如下情况:

CentOS Linux 7 (Core)
Kernel 3.10.0-229.el7.x86_64 on an x86_64

study login: dmtsai
Password: <==这里输入你的密码
Last login: Fri May 29 11:55:05 on tty1 <==上次登陆的情况
[dmtsai@study ~]$ _ <==光标闪烁,等待你的指令输入

 

5.3 指令下达

[dmtsai@study ~]$ command  [-options]  parameter1  parameter2 ...
                     指令     选项        参数(1)     参数(2)

上述指令详细说明如下:

  1. 一行指令中第一个输入的部分绝对是“指令(command)”或“可可执行文件案(例如批次脚本,script)”
  2. command 为指令的名称,例如变换工作目录的指令为 cd 等等;
  3. 中刮号[]并不存在于实际的指令中,而加入选项设置时,通常选项前会带 - 号,例如 -h;有时候会使用选项的完整全名,则选项前带有 -- 符号,例如 --help;
  4. parameter1 parameter2.. 为依附在选项后面的参数,或者是 command 的参数;
  5. 指令, 选项, 参数等这几个中间以空格来区分,不论空几格 shell 都视为一格。所以空格是很重要的特殊字符!;
  6. 按下[Enter]按键后,该指令就立即执行。[Enter]按键代表着一行指令的开始启动。
  7. 指令太长的时候,可以使用反斜线 (\) 来转义[Enter]符号,使指令连续到下一行。注意!反斜线后就立刻接特殊字符,才能转义!
  8. 其他:
    在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。
    更多的介绍等到 bash 时,再来详述。

5.4 简单指令

  • 显示日期与时间的指令: date
  • 显示日历的指令: cal
  • 简单好用的计算器: bc

1. date

[dmtsai@study ~]$ date
Fri May 29 14:32:01 CST 2015

[dmtsai@study ~]$ date +%Y/%m/%d
2015/05/29

[dmtsai@study ~]$ date +%H:%M
14:33

2. cal

[dmtsai@study ~]$ cal [month] [year]

[dmtsai@study ~]$ cal
      May 2015
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

[dmtsai@study ~]$ cal 2015
                               2015

       January               February                 March
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7    1  2  3  4  5  6  7
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    8  9 10 11 12 13 14
11 12 13 14 15 16 17   15 16 17 18 19 20 21   15 16 17 18 19 20 21
18 19 20 21 22 23 24   22 23 24 25 26 27 28   22 23 24 25 26 27 28
25 26 27 28 29 30 31                          29 30 31

        April                   May                   June
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
          1  2  3  4                   1  2       1  2  3  4  5  6
 5  6  7  8  9 10 11    3  4  5  6  7  8  9    7  8  9 10 11 12 13
12 13 14 15 16 17 18   10 11 12 13 14 15 16   14 15 16 17 18 19 20
19 20 21 22 23 24 25   17 18 19 20 21 22 23   21 22 23 24 25 26 27
26 27 28 29 30         24 25 26 27 28 29 30   28 29 30
                       31
....(以下省略)....

3. bc

[dmtsai@study ~]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
_ <==这个时候,光标会停留在这里等待你的输入
1+2+3+4  <==只有加法时
10
7-8+3
2
10*52
520
10%3     <==计算“余数”
1
10^2
100
10/100   <==这个最奇怪!不是应该是 0.1 吗?
0
quit     <==离开 bc 这个计算器

5.5 重要热键

1. [Tab]按键

  具有“命令补全”与“文件补齐”的功能。

  • [Tab] 接在一串指令的第一个字的后面,则为“命令补全”;
  • [Tab] 接在一串指令的第二个字以后时,则为“文件补齐”!
  • 若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行“选项/参数的补齐”功能!

2. [Ctrl]-c 按键

  可以中断目前程序。

3. [Ctrl]-d 按键

  代表:“键盘输入结束(End Of File, EOF 或 End Of Input)”的意思!

4. [shift]+{[PageUP]|[Page Down]}按键

  用于翻页。

5.6 求助man page与info page

5.6.1 指令的 --help 求助说明

  事实上,几乎 Linux 上面的指令,在开发的时候,开发者就将可以使用的指令语法与参数写入指令操作过程中了。你只要使用“ --help ”这个选项, 就能够将该指令的用法作一个大致的理解。

5.6.2 man page

  man是manual(操作说明)的简写。

  进入man指令的功能后,你可以按下“空白键”往下翻页,可以按下“ q ”按键来离开man的环境。

  date --help 没有告诉你 STRING 是什么?只要下达:“man date” 马上就会有清楚的说明出现在你面前。

[dmtsai@study ~]$ man date
DATE(1)                          User Commands                         DATE(1)
# 请注意上面这个括号内的数字
NAME  <==这个指令的完整全名,如下所示为date且说明简单用途为设置与显示日期/时间
       date - print or set the system date and time

SYNOPSIS  <==这个指令的基本语法如下所示
       date [OPTION]... [+FORMAT]                            <==第一种单纯显示的用法
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]   <==这种可以设置系统时间的用法

DESCRIPTION  <==详细说明刚刚语法谈到的选项与参数的用法
       Display the current time in the given FORMAT, or set the system date.

       Mandatory arguments to long options are mandatory for short options too.

       -d, --date=STRING  <==左边-d为短选项名称,右边--date为完整选项名称
              display time described by STRING, not 'now'

       -f, --file=DATEFILE
              like --date once for each line of DATEFILE

       -I[TIMESPEC], --iso-8601[=TIMESPEC]
              output  date/time  in  ISO  8601  format.   TIMESPEC='date' for date only (the
              default), 'hours', 'minutes', 'seconds', or 'ns' for  date  and  time  to  the
              indicated precision.
....(中间省略)....
       # 找到了!下面就是格式化输出的详细数据!
       FORMAT controls the output.  Interpreted sequences are:

       %%     a literal %

       %a     locale's abbreviated weekday name (e.g., Sun)

       %A     locale's full weekday name (e.g., Sunday)
....(中间省略)....
ENVIRONMENT  <==与这个指令相关的环境参数有如下的说明
       TZ     Specifies the timezone, unless overridden by command line parameters.  
              If neither is specified, the setting from /etc/localtime is used.

EXAMPLES     <==一堆可用的范本
       Convert seconds since the epoch (1970-01-01 UTC) to a date

              $ date --date='@2147483647'
....(中间省略)....

DATE STRING  <==上面曾提到的 --date 的格式说明!
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29
       Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next  Thursday".   A  date
       string  may  contain  items  indicating calendar date, time of day, time zone, day of

AUTHOR  <==这个指令的作者啦!
       Written by David MacKenzie.

COPYRIGHT  <==受到著作权法的保护!用的就是 GPL 了!
       Copyright © 2013 Free Software Foundation, Inc.  License GPLv3+: GNU GPL version 3 or
       later <http://gnu.org/licenses/gpl.html>.
       This  is free software: you are free to change and redistribute it.  There is NO WAR‐
       RANTY, to the extent permitted by law.

SEE ALSO  <==这个重要,你还可以从哪里查到与date相关的说明文档之意
       The full documentation for date is maintained as a Texinfo manual.  If the  info  and
       date programs are properly installed at your site, the command

              info coreutils 'date invocation'

       should give you access to the complete manual.

GNU coreutils 8.22                        June 2014                                  DATE(1)

  在上面代码的第一行,你可以看到的是:“DATE(1)”,DATE我们知道是指令的名称, 那么(1)代表什么呢?他代表的是“一般使用者可使用的指令”的意思。

常见的几个数字的意义是这样的:

  基本上,man page大致分成下面这几个部分:

  man page常用的按键:

5.6.3 info page

  在所有的Unix Like系统当中,都可以利用 man 来查询指令或者是相关文件的用法; 但是,在Linux里面则又额外提供了一种求助的方法,那就是利用info。

  基本上,info与man的用途其实差不多,都是用来查询指令的用法或者是文件的格式。但是与man page一口气输出一堆信息不同的是,info page则是将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的“超链接”来跳到各不同的页面中,每个独立的页面也被称为一个节点(node)。 所以,你可以将info page想成是文字模式的网页显示数据。

  不过你要查询的目标数据的说明文档必须要以info的格式来写成才能够使用info的特殊功能(例如超链接)。 而这个支持info指令的文件默认是放置在/usr/share/info/这个目录当中的。 

  举例来说,info这个指令的说明文档有写成info格式,所以,你使用“ info info ”可以得到如下的画面:

[dmtsai@study ~]$ info info
File: info.info,  Node: Top,  Next: Getting Started,  Up: (dir)

Info: An Introduction
*********************

The GNU Project distributes most of its on-line manuals in the "Info
format", which you read using an "Info reader".  You are probably using
an Info reader to read this now.
....(中间省略)....

   If you are new to the Info reader and want to learn how to use it,
type the command 'h' now.  It brings you to a programmed instruction
sequence. # 这一段在说明,按下 h 可以有简易的指令说明!很好用!
....(中间省略)....

* Menu:

* Getting Started::             Getting started using an Info reader.
* Advanced::                    Advanced Info commands.
* Expert Info::                 Info commands for experts.
* Index::                       An index of topics, commands, and variables.

--zz-Info: (info.info.gz)Top, 52 lines --Bot------------------------------------------

  第一行里面的数据意义为:

  • File:代表这个info page的数据是来自info.info文件所提供的;
  • Node:代表目前的这个页面是属于Top节点。 意思是info.info内含有很多信息,而Top仅是info.info文件内的一个节点内容而已;
  • Next:下一个节点的名称为Getting Started,你也可以按“N”到下个节点去;
  • Up:回到上一层的节点总览画面,你也可以按下“U”回到上一层;
  • Prev:前一个节点。但由于Top是info.info的第一个节点,所以上面没有前一个节点的信息。

  从第一行你可以知道这个节点的内容、来源与相关链接的信息。更有用的信息是,你可以通过直接按下N, P, U来去到下一个、上一个与上一层的节点(node)。

  另外,如论你在任何一个页面,只要不知道怎么使用 info 了,直接按下 h 系统就能够提供一些基本按键功能的介绍。

  你也会看到有“Menu”,下面共分为四小节,分别是Getting Started等等的,我们可以使用上下左右按键来将光标移动到该文字或者“ * ”上面,按下Enter, 就可以前往该小节了!另外,也可以按下[Tab]按键,就可以快速的将光标在上表的画面中的node间移动,如果将info.info内的各个节点串在一起并绘制成图表的话,情况有点像下面这样:

5.7 关机命令

  • 将数据同步写入硬盘中的指令: sync
  • 惯用的关机指令: shutdown
  • 重新开机,关机: reboot, halt, poweroff

5.7.1 sync

  所有的数据都得要被读入内存后才能够被CPU所处理,但是数据又常常需要由内存写回硬盘当中(例如储存的动作)。 由于硬盘的速度太慢(相对于内存来说),如果常常让数据在内存与硬盘中来回写入/读出,系统的性能就不会太好。

  因此在Linux系统中,为了加快数据的读取速度,所以在默认的情况中, 某些已经载入内存中的数据将不会直接被写回硬盘,而是先暂存在内存当中,如此一来, 如果一个数据被你重复的改写,那么由于他尚未被写入硬盘中,因此可以直接由内存当中读取出来, 在速度上快上很多。

  不过,如此一来也造成些许的困扰,那就是万一你的系统因为某些特殊情况造成不正常关机 (例如停电或者是不小心踢到power)时,由于数据尚未被写入硬盘当中,所以就会造成数据的更新不正常。那要怎么办呢?这个时候就需要sync这个指令来进行数据的写入动作啦! 直接在命令行下输入sync,那么在内存中尚未被更新的数据,就会被写入硬盘中。所以,这个指令在系统关机或重新开机之前, 很重要,最好多执行几次。

  不过现在的关机指令在运行前都会自动调用 sync 这个命令。

  事实上sync也可以被一般帐号使用。只不过一般帐号使用者所更新的硬盘数据就仅有自己的数据,不像root可以更新整个系统中的数据了。

5.7.2 shutdown

[root@study ~]# /sbin/shutdown [-krhc] [时间] [警告讯息]
选项与参数:
-k     : 不要真的关机,只是发送警告讯息出去!
-r     : 在将系统的服务停掉之后就重新开机(常用)
-h     : 将系统的服务停掉后,立即关机。 (常用)
-c     : 取消已经在进行的 shutdown 指令内容。
时间   : 指定系统关机的时间!时间的范例下面会说明。若没有这个项目,则默认 1 分钟后自动进行。
[root@study ~]# shutdown -h now
立刻关机,其中 now 相当于时间为 0 的状态
[root@study ~]# shutdown -h 20:25
系统在今天的 20:25 分会关机,若在21:25才下达此指令,则隔天才关机
[root@study ~]# shutdown -h +10
系统再过十分钟后自动关机
[root@study ~]# shutdown -r now
系统立刻重新开机
[root@study ~]# shutdown -r +30 'The system will reboot' 
再过三十分钟系统会重新开机,并显示后面的讯息给所有在线上的使用者
[root@study ~]# shutdown -k now 'This system will reboot' 
仅发出警告信件的参数!系统并不会关机啦!吓唬人!

5.7.3 reboot, halt, poweroff

  还有三个指令可以进行重新开机与关机的任务,那就是reboot, halt, poweroff。 其实这三个指令调用的函数库都差不多,所以当你使用“man reboot”时,会同时出现三个指令的用法给你看。基本上,在默认的情况下, 这几个指令都会完成一样的工作,所以,只要记得其中一个就好。


实际使用管理工具 systemctl 关机

  之前是使用init 的指令,这个指令可以切换不同的执行等级~ 执行等级共有 0~6 七个,其中 0 就是关机、6 就是重新开机等等。不过,这个 init 目前只是一个相容模式而已。在 CentOS 7 当中,虽然你依旧可以使用“ init 0 ”来关机,但是那已经跟所谓的“执行等级”无关了。

  目前系统中所有服务的管理是使用是 systemctl 指令。这个指令相当的复杂,会在很后面系统管理员部份才讲的到。 上面谈到的 halt, poweroff, reboot, shutdown 等等,其实都是调用这个 systemctl 指令的,这个指令跟关机有关的语法如下:

[root@study ~]# systemctl [指令]
指令项目包括如下:
halt       进入系统停止的模式,屏幕可能会保留一些讯息,这与你的电源管理模式有关
poweroff   进入系统关机模式,直接关机没有提供电力喔!
reboot     直接重新开机
suspend    进入休眠模式

[root@study ~]# systemctl reboot    # 系统重新开机
[root@study ~]# systemctl poweroff  # 系统关机

 

posted @ 2022-10-10 14:42  莫莫君不恋爱  阅读(221)  评论(0编辑  收藏  举报