开端
之前总说自己要跳出自己专业转计算机要自学云云,付出的努力却一直不够,大学两年功夫也只把离散、数据结构与算法学到略懂一二,深刻反省后决定将自己的学习经历整理写下,一为总结复习,二为激励自己。
由于本人知识水平有限,写出的东西也必然是漏洞百出,希望有缘看到的朋友能不吝赐教。
为什么学linux
linux是目前最流行的操作系统之一,由于其开源的特性,我们可以很轻松的得到它的代码并进行学习。
今天学了什么
分区表和文件系统
磁盘分区
linux下的设备管理
linux的一个理念就是 “每一个设备都当成一个文件来对待” 。每一个设备都被分类储存在/dev文件夹下。以下是部分设备的文件名:
设备 | 文件名 |
---|---|
SATA、SCSI、USB | /dev/sd[a-p] |
Virtio接口 | /dev/vd[a-p] |
鼠标 | /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2接口) /dev/mouse (当前鼠标) |
CD/DVD | /dev/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS中常见) /dev/cdrom (当前CD-ROM) |
这里有一点非常有意思,Virtio是一种半虚拟的I/O接口,以下是它的介绍:
virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。
然而我自己通过vmware安装的ubuntu中硬盘的文件名为/dev/sda1,鸟哥教程中通过CentOS自带的虚拟机安装的CentOS中硬盘名为/dev/vda1,这点不同我猜测是因为我在创建虚拟机时选择的虚拟节点为SCSI导致的,也可能是鸟哥本身演示安装时就是在虚拟机内完成的才会将硬盘识别为Virtio接口。
硬盘分区格式
MBR(Master Boot Record,主引导记录)
这种格式主要在MS-DOS和windows中使用,早期linux为了兼容windows磁盘也采用了这种分区格式。
这种分区格式在第一个512字节的扇区内储存了以下数据:
主引导记录(MBR,Master Boot Record):可以安装启动引导程序的地方,占用446字节.
分区表:记录整块硬盘分区的状态,有64字节。
由于分区表只有64字节,最多只能有四组记录区,每组记录区记录了该区段的起始和结束的柱面号码。这四个记录区一定是连续的。假设该硬盘设备文件名为/dev/sda,则这四个分区在linux中的名称会在硬盘名后加一个数字,这个数字与分区位置有关。假设P1-4为这块硬盘从低地址到高地址的4个分区,则其对应的文件名为/dev/sda1、/dev/sda2、/dev/sda3、/dev/sda4。
这四个分区的记录被称为主要(Primary)或扩展(Extended)分区,其中一个主要分区(主分区)中一定会包含第一个扇区。
当然你会注意到我们平常使用的硬盘可不止4个分区,这是通过在扩展分区中选择一个扇区记录新的分区表来实现的,这种方法所切出来的分区称为逻辑(Logic)分区,这种分区的范围就是扩展分区的范围。
假设目前分区情况如下:P1为主分区,P2为扩展分区,P3和P4没有使用,P2分成了3个逻辑分区,则它们的设备文件名分别为:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
你会注意到L1的设备序号是5,这是因为前4个序号是保留给主分区和扩展分区使用的,逻辑分区的序号就从5开始。
值得注意的是,由于操作系统的限制,扩展分区最多只能有一个,而主分区和扩展分区最多有四个是由硬盘限制的。且只有主分区和逻辑分区能格式化,扩展分区不能格式化。
由于MBR的分区表最多只有四组,导致其无法提供对2.2TB以上容量磁盘的识使用,只能2TB/2TB这样分下去;而且如果主引导扇区被破坏整块硬盘的数据将会丢失且几乎无法恢复,因此现在出现了GPT分区表格式。
GPT(GUID partition table)
GPT吸收了MBR的教训,使用了整整34个扇区来记录分区信息,同时在整个硬盘最后也留下了34个扇区作为备份使用,这在提供了高达233TB的分区表的同时也减少了由于引导扇区损坏造成的数据丢失风险。
GPT在扇区的定义上使用所谓的LBA(Logical Block Address,逻辑区块地址)来处理,一个LBA占用512字节,从0开始编号。其中LBA0、LBA1比较特殊,剩余LBA2-LBA33作为普通分区记录组使用。
LBA0(MBR兼容区块):用于只支持MBR格式的操作系统,存放有446字节的启动引导程序和一个表示GPT的标识符,不认识GPT的磁盘管理程序无法认出这块硬盘,进一步保护了硬盘。
LBA1(GPT表头记录):记录分区表本身大小和备份的GPT分区位置,同时放置了分区表校验码(CRC32),操作系统可以通过这个校验码判断GPT是否正确。
在GPT分区中已经没有所谓主要、扩展、逻辑分区的概念,每个分区都可以格式化使用。
启动引导
在计算机上电时,BIOS会最先启动,分析被连接到计算机上的设备,随后找到能够启动的硬盘,从该硬盘中读取第一个扇区的MBR位置,从而执行MBR中储存的启动引导代码,至此BIOS的工作就圆满完成,接下来就是MBR中的启动引导程序(boot loader)加载内核文件启动操作系统的过程。
当然,如果你的硬盘是GPT格式,BIOS也能从LBA0的MBR兼容区块中读取需要的启动引导代码,如果启动引导程序支持GPT的话也可以读取到正确的操作系统内核,但反之亦然。
如果你的计算机安装了多个操作系统,则将会在第二个操作系统所在的区块内增加一个启动扇区,同时第一块扇区中MBR的启动引导程序可以提供两个选项:(M1)加载第一个分区中的操作系统内核(通常为windows),或是(M2)交给第二分区的启动扇区内的启动引导程序(通常为linux),此处的启动引导程序只指向第二分区的操作系统内核。
需要注意的是,windows在安装时会覆盖掉MBR和自己所在分区的启动扇区,而linux提供给用户自己选择启动引导程序的安装位置,且linux的启动引导程序可以手动设置选项(即上文的M1/M2),因此在安装win+linux双系统时一定要先安装windows再安装linux。
当然,如果linux的引导信息不幸被windows覆盖了也不用担心,只需要向MBR中加入linux的引导信息即可,比如linux的恢复模式就可以做到这一点。
linux下的文件系统
linux的文件系统采用目录树的方式构成。所谓目录树就是以根目录为主,其余目录向下呈现分支结构的一种文件架构。在这种架构下,所有的文件都是由根目录衍生而来的,因此整个架构中最重要的就是根目录,它用一个斜杠 / 表示。
文件系统是linux管理文件的方式,但磁盘中的数据是由扇区组成的,那磁盘中的数据如何与目录树架构结合起来呢?这里就涉及到了挂载这个概念。
所谓挂载,就是指将一个目录指定为磁盘中一个分区的进入点,将磁盘分区的数据放置在该目录下,使得程序在访问该目录时就可以读取该分区的信息。形象地表示就是将这个磁盘分区给挂在了这个目录上,只要找到这个目录就可以找到磁盘分区里的数据。
由于根目录是整个文件系统中最重要的目录,因此一定要将根目录挂载到某个分区,其他目录可以根据自己的需求进行挂载。
由于linux的文件结构是树形的,因此所有文件只要没有被挂载到其他分区都会被挂载到根目录所挂载的分区。
在windows中也存在挂载这个概念,不过多用于可移动储存设备。比如你将一个U盘插进自己的电脑里,电脑给它分配的盘符是F,而你插进你朋友的电脑里时他的电脑给你的U盘分配的盘符是G,这时你还能到盘符F下去寻找你U盘里的文件吗?这个“设备与磁盘分区的对应关系”就是windows下的挂载概念。
再举一个例子,还是你的U盘,只不过这次它的对象换成了windows系统和linux系统。假设这个U盘里有一个名为files的文件,windows分配的盘符是F,而linux下会将它挂载在/mnt/username/drivername下(我用ubuntu测试是这样的,不过这个可以用mount命令修改所以无关紧要)。那么这个文件应该是在哪里?
答:windows下为F:/files
linux下为/mnt/username/drivername/files
那我现在执行mount /dev/sdb1 /mnt/usb命令(假设这块U盘在本linux系统中的文件为sdb1)将U盘挂载到/mnt/usb目录下,此时这个文件的位置就变成了/mnt/usb/files。这样是不是好理解多了。
(以上两个例子来源于鸟哥的linux私房菜,有一定改动)。
在安装linux时通常安装程序会给我们选择自行挂载分区,一般来说初学者(像我)只需要指定根目录 / 和交换分区 swap 即可,留下一定空间不做挂载处理留给以后进行分区练习。