声明:下面的内容只是为了给几个为数不多的同学补充知识所写,限于本人当前知识水平,一定会有很多谬误,不与专业教材比质量,被半路出家自学成才的大神嘲笑也是很正常,7吧的小明还是我的人生偶像
其实我一直觉得Win这个系统误人子弟——
- 有多少人认为非exe文件就不是可执行文件?
- 再退一步,多少人认为
D盘
、E盘
真的是个盘? - 有多少人把
SSD只需要一个分区
这句话说成SSD不用分区
?
小明当时天天喷一群傻逼把nt6hddinstaller
简称成nt6
,虽然强迫症重了点,但是完全可以理解,把一个小脚本叫成操作系统内核的名字,能合适吗?
今天这篇文章抛开win,我们从安装一个Archlinux
说起,需要注意的是本文甚至不会采用已经普及的炫酷技术,比如UEFI
,甚至会故意简化一些复杂概念,比如文件系统
,只保证我认为这些内容不会对将来的学习产生消极影响。
进入正题,
假设你什么都不会,你想要安装一个Archlinux
,你需要做什么?
——你需要查资料,不是找人问,找人问是下策,查资料是上策。
这里采用Archlinux
的一个原因就是这姑且算是资料比较齐全的发行版:这里是Arch的官方wiki (但是下文安装系统我不会按照wiki的来,你可以试着按照wiki走一遍,我装系统是为了说明问题)
我不知道Archwiki是不是介绍了如何制作启动介质,这里就按照我一贯喜欢的方式来做,其实做法有两种,一种是针对Legacy BIOS
和UEFI
系统,另一种仅针对UEFI
系统,这里采用通用的办法,至于UEFI有什么优势,为什么会产生这种区别,需要你自己去调查。
国内的Archlinux
镜像站还是比较多,这里我用一下清华源,下载一个安装镜像
下载完了这个安装镜像,就是制作启动介质的时候了,首先我们需要明确:启动介质是干什么的。
操作系统本身是安装在硬盘内的,系统上电时还完全没有操作系统什么事,系统上电后由主板内的固件完成自检和初始化等操作,操作系统是被主板固件主动读入到内存并执行的,执行后操作系统从主板固件接手系统控制权。
那么,为什么我们不能控制主板固件读入谁、执行谁呢?
——当然可以,我们的启动介质就是借此发挥作用,我们把一个操作系统写入一个存储介质中(如:U盘、光盘等),然后控制主板固件从这个介质读入并执行操作系统,在启动了这个操作系统之后,再进行把操作系统安装到硬盘的操作,也就是安装操作系统的过程。
明确了启动介质的作用就来制作吧,把下载好的镜像用Win32diskimager
写入到U盘中,待写入完成后从等待安装操作系统的机器上启动这个U盘内的操作系统即可。
那么,Win32diskimager
到底是什么呢?
这个说来话长,请先做个实验:当你用Win32diskimager
把下载好的iso镜像写入到U盘中后,你会发现Windows说你的U盘容量变小了,只有700MB了。
——你的U盘当然是不可能变小的,这都是Windows的锅。
Win32diskimager
做的工作极其简单,只是把镜像文件直接写入到你的U盘中去,可是这样一来,你的U盘就失去了原有的数据,众所周知,文件系统是文件的组织形式,你的U盘原本有一个文件系统,这个文件系统是经过格式化
操作产生的,在格式化
时,格式化程序会检查你的U盘容量,并且把一个只属于这个U盘的文件系统写入到U盘上,这个文件系统记录着格式化程序检测到的U盘各种信息,包括容量等等。现在,你的U盘文件系统不见了,取而代之的是一个光盘的文件系统,系统自然也就无法精准地读出你的U盘有多大。
可是不用担心,当你像你的U盘中写入一些无效数据,系统会因为U盘包含的文件系统不可识别而重新从硬件层面上识别U盘,并会提醒你对U盘进行重新格式化(即写入新的文件系统)。
现在要做的事情就很简单了,我们只需要从U盘启动新系统就可以
进入系统之后,我们首先输入 dhcpcd
,这个命令是一个dhcp客户端,dhcp协议可以帮助连接到局域网的主机自动配置ip。DHCP的服务器,通常是我们的路由器或电信家庭网管等设备。
至此,我们已经连接上了网络,接下来我们设置pacman的镜像服务器地址,依然是设置成清华源,这些设置是为了让之后安装系统的过程更顺利,与我试图通过这篇文章说明的问题无关,故在此不做说明。
在小设置完成之后,我们需要做的首先是给即将安装系统的硬盘分区,需要注意的是,Linux把所有的设备都当作文件来对待,不如说,文件就是二进制块组成的,对于我们的主硬盘(位于/dev/sda
),Linux认为它是一个块设备
。如果我们向/dev/sda
写入了一个0
,就是向我们硬盘最开始的为止写了一个0。
我们通过linux下的工具dd
(全称为disk dump
)来对我们的硬盘首先进行清空操作,即向其写入一定数量的0
以保证清除现有的分区表
和文件系统
:(关于这些的解释,请看上文)
dd if=/dev/zero of=/dev/sda bs=1M count=50 conv=fsync
dd if=/dev/zero of=/dev/sdb bs=1M count=50 conv=fsync
由于我有两块硬盘,就需要分别执行两次操作,最后的conv=fsync
不属于本文应当涉及的内容,不予解释。
当清除工作完成后,我们就开始分区。
输入cfdisk /dev/sda
对于硬盘,我们需要首先建立分区表,分区表是记录硬盘内各个分区起始和结束为止的数据表,分区表让一个硬盘拥有多个分区成为可能,这里可以选择dos
分区表,具体的区别不予展开。
之后我们只需要对硬盘分区即可,记得给主硬盘的系统分区加上bootable
的flag
,这个bootable
flag曾经是(但本文不作展开)主板固件识别操作系统的唯一依据。没有它,主板固件就不知道该去哪里引导操作系统,进而导致系统无法启动。
在分区工作完成之后,我们需要给各个分区进行格式化操作,以此创建文件系统,以便进行之后的文件管理等等操作。(请记得,文件的组织形式是文件系统,关于文件系统的解释请看上文)
我们用mkfs.ext4 /dev/sda1
命令把sda
(主硬盘)的1
分区格式化成ext4文件系统
之后,我们把格式化好的分区挂载(mount)
到系统安装点上。
这里需要重点解释,首先,先说一下挂载的概念:
挂载是指先对分区或硬盘等存储设备的文件系统进行识别(在此例中为ext4
),之后加载文件系统的驱动
,使得操作系统具备对目标分区的文件系统具有读写能力(即使操作系统能够找到分区内的文件,如果没有这个驱动,操作系统不识别文件系统,是不可能发现其中的文件的),最后再由操作系统把文件系统驱动读取的结果反馈给用户的过程。
在Windows中,就是把硬盘上的一个分区变成D盘的过程,在Linux上,我们使用mount
命令:
mount /dev/sda1 /mnt
来把我们想要的分区挂载到/mnt目录下,使得它对我们可读、可写。
安装系统需要很多步骤,但不是本文的写作目的,在此不予介绍。
最后,在系统安装完毕后,我们还需要一个bootloader
,从名字就可以看出,它的作用是帮助引导操作系统的,实际上,由于操作系统的内核过大等等问题,通常(现在已经有主板固件直接执行内核的技术),主板固件直接读取并执行的是bootloader
,bootloader
具备识别操作系统内核的能力,并且执行操作系统内核,最终启动操作系统。
关于具体的技术细节在此不做讨论。
按理说这里就已经写完了,但是如果你真的有看懂上面这些文章的话,请试着来回答这个问题:
在安装Archlinux
的过程中,需要执行一条genfstab -U -p /mnt >> /mnt/etc/fstab
命令。
这条命令会生成一个叫fstab
的文件,已知:
- 执行这条命令的时候要求挂载好所有新系统要用的分区。
- 生成的fstab文件包括的内容形如:
/dev/sda1 / ext4 0 0 ...
请问:你认为fstab
的作用是什么