linux 开机流程
shell(bash / dash)
终端仿真器/终端仿真程序
虚拟控制台tty1(桌面环境 gnome等) | tty2 | tty3 ...
Linux kernel
<LVM>
分区(分区表,GPT等)
物理磁盘
Linux系统拥有很高的灵活性和自由度,系统启动后首先进入桌面环境(例如Ubuntu默认进入gnome,用户可更换其他桌面)或者tty(虚拟终端)。当进入桌面环境后可启动终端仿真器(用户可自行更换),终端仿真器会启动默认的shell(Ubuntu默认bash,用户可自行更换)。
BIOS+MBR/GPT
CMOS是记录各项硬件参数且嵌入在主板上的存储器,BIOS则是一个写入如到主板上的一个固件(所谓固件就是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,电脑系统主动执行的第一个程序了。接下来,BIOS会分析电脑里有哪些存储设备,以硬盘为例,BIOS会取的能够开机的硬盘,并到该硬盘读取第一个扇区的MBR位置。MBR有446字节存储引导程序,BIOS将该程序加载到内存,然后跳转到该程序执行。该程序会做相关工作。
每个分区都有自己的boot sector,可以负责启动自己的内核
UEFI(Unified Extensible Firmware Interface) BIOS+GPT
UEFI必须格式化一个vfat的文件系统,大约512MB~1GB。
文件系统
linux支持多种文件系统
-
Linux文件系统的演进
-
ext文件系统
Linux最初的文件系统,限制较多,比如文件大小不能超过2G等
-
ext2文件系统
ext的升级。容易在系统崩溃或断电时损坏。
-
ext3文件系统
ext2的后续演进,支持最大2TB的文件,能够管理32TB大小的分区。默认采用有序式的日志方法,没有提供数据压缩功能
-
ext4文件系统
ext3的后续版本。最大支持16TB的文件,能够管理1EB大小的分区。默认采用有序日志方式。
-
JFS文件系统
一种比较老旧的文件系统
-
ZFS文件系统
一个稳定的文件系统,与Resier4、Btrfs和ext4势均力敌,拥有数据完整性验证和自动修复功能,最大支持16EB的文件,能能够管理256万亿ZB的存储空间。
-
XFS文件系统
日志式文件系统,适合高容量高能效的场景。几乎涵盖了ext4文件系统的所有功能
- data section
与ext文件系统一样,包括包括 inode/data block/superblock 等。inode 与 block是系统需要时动态分配产生,所以格式化快 - log section
记录文件系统的活动记录,以备恢复校验等。可指定外部存储介质作为xfs文件系统的日志区 - realtime section
用于支持实时数据
- data section
sh
xfs_info /dev/sda1
# 将系统内的所有档案格式及名称都列出来
df -aT
-
NTFS文件系统
windows系统默认文件系统
-
fat文件系统
单个文件传输不能超过4G
-
exfat文件系统
Windows U盘文件系统的改进,取消了单个文件不超4G的限制
1.文件系统 inode block superblock
inode与block在格式化时会固定大小及数量
索引式文件系统,如ext2/3/4
FAT文件系统没有 inode
ext2文件系统的实现
将inode,block分组
superblock
记录整个文件系统相关信息。只在第一个组有,其他组或许有备份
- block与inode总量
- 未使用与已使用inode/block数量
- block与inode大小(1,2,4k, 128B,256B)
- 文件系统是否挂载等信息
文件系统描述说明
描述每个block group的首尾block号码,以及每个区段(superblock, bitmap, inodemap, data block)分别介于哪个block号码之间
block bitmap 区域对照表
记录block是否为空
inode bitmap
记录inode是否为空
inode 表格
inode记录文件的属性信息以及该文件在哪些block内
inode指向block的层级结构
dumpe2fs 命令查看文件系统相关信息
sh
dumpe2fs [-bh] 设备名
-b:列出保留为坏道的部分
-h:仅列出superblock的信息
blkid # 查看当前已经格式化的设备
文件与目录在OS中显示的占用与磁盘占用
目录:文件系统会分配一个inode与至少一个block给该目录
因此当用ls -l查看时目录总是block大小的整数倍数,不包含该目录的inode占用
文件:ls -l查看的是实际文件大小
文件的实际磁盘占用需要加上inode(256B/128B)加上n个block,根据文件大小可能会有用于记录block号码的block
查看Linux支持的文件系统
sh
ls -l /lib/modules/$(uname -r)/kernel/fs
查看Linux系统当前支持的文件系统
sh
cat /proc/filesystems
Linux VFS(Virtual filesystem switch)
2.与文件系统相关
硬链接
- 每个目录或文件都会占用一个inode,其内容由inode指明
- 想要读取文件必须经过目录记录的名称指向的inode号码才能读取
硬链接:在某个目录的block下多写入个名称和inode号
限制:1.不能跨文件系统。2.不能硬链接目录
软连接
建立一个inode与block,block的内容为连接的位置名称
mount
sh
[root@study ~]# mount -a
[root@study ~]# mount [-l]
[root@study ~]# mount [-t 文件系统] LABEL='' 挂载点
[root@study ~]# mount [-t 文件系统] UUID='' 挂载点
[root@study ~]# mount [-t 文件系统] 设备名 挂载点
选项参数:
-a :按照设定档 /etc/fstab 的资料将所有未挂载的磁碟都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名!
-t :可以加上文件系统种类来指定想挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,
reiserfs, vfat, iso9660(光碟格式), nfs, cifs, smbfs (后三种为网络文件系统类型)
-n :在预设的情況下,系统会将实际挂载的情况即时写入 /etc/mtab 中,以利其他程序的运行。
但在某些情況下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选項。
-o :后面可以接一些挂载时额外加上的参数!比如账号、密码、读写权限等:
async, sync: 此文件系统是否使用同步写入 (sync) 或非同步 (async) 的
存储机制,请参考文件系统的运行方式。预设为 async。
atime,noatime: 是否修订文件系统的读取时间(atime)。为了效能,某些时刻可使用 noatime
ro, rw: 挂载文件系统成为只读(ro) 或可读写(rw)
auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)
dev, nodev: 是否允许此 filesystem 上,可建立设备文件? dev 为可允许
suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?
exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?
user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般來说,
mount 仅有 root 可以执行,但下达 user 参数,则可让
一般 user 也能够对此 partition 进行 mount 。
defaults: 预设值为:rw, suid, dev, exec, auto, nouser, and async
remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
sh
# 从新挂载 / ,并加入参数 rw与auto
mount -o remount,rw,auto /
内存文件系统的iNode=1
root目录的iNode=2
sh
mount -t tmpfs -o size=32M tmpfs /mnt/tmpfs/
ls -id /mnt/tmpfs/
ls -id /
Linux已经载入的文件系统类型
cat /proc/filesystems
- linux通过MAJOR与MINOR号识别唯一设备
手动建立设备 mknod /dev/vda10 b 252 10
ext4修改partition的label tune2fs -L new_label /dev/vda5
磁盘/文件系统参数
设备文件 | Major | Minor |
---|---|---|
/dev/sda | 8 | 0-15 |
/dev/sdb | 8 | 16-31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |
3.使用文件系统
1. 首先,需要在存储设备上创建可容纳文件系统的分区
分区管理工具:
-
fdisk
老而弥坚,可以在任何存储设备上创建和管理分区。但只能处理最大2TB的硬盘,再大就只能换工具
不允许调整现有分区大小,只能删除现有分区然后重新创建。 -
gdisk
如果存储设备要使用GUID(GPT)分区表就用它
许多命令和fdisk很像
操作分区后需要partprobe -s
使之生效 -
GNU parted
允许调整现有分区大小shparted devicename print # 查看硬盘信息
硬盘设备名称分配格式:
- SATA驱动器和SCSI驱动器:设备命名格式为 /dev/sdx(x = a, b, c, ...)
- SSD NVMe驱动器:/dev/nvmeNn#(N = 0, 1, ...; #=1,...,是分配给该驱动器的名称空间编号)
- IDE驱动器:/dev/hdx(x = a, b, c, ...)
2. 创建文件系统(格式化):
将数据存储到分区之前,必须使用某种文件系统对其进行格式化,以便Linux能够使用分区。
sh
mkfs # 复合指令,mkfs.ext4 / mkfs.xfs partition
mkfs -t filesystemtype partition
3. 挂载分区
为分区创建好文件系统之后,是将其挂载到虚拟目录中的某个挂载点,以便在新分区中存储数据
sh
mkdir /home/part
# 临时挂载分区。要在Linux启动时挂载需要添加在/etc/fstab文件中
sudo mount -t ext4 /dev/sdb1 /home/part
lsblk -f /dev/sdb
- 根目录必须挂载,且一定在其他挂载点之前
- 其它挂载点必须为已建立的目录,可指任意指定,必须遵守FHS原则
- 所有 挂载点/分区 在同一时间之内只能挂载一次;
- 卸载时,须先将工作目录移到挂载点之外
sh
cat /etc/fstab # filesystem table
[设备/UUDI/LABEL] [挂载点] [文件系统] [文件系统参数] [dump(备份指令)] [fsck(校验)]
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=074d9 / ext4 errors=remount-ro 0 1
UUID=e0fa /data/xfs xfs defaults 0 0
/etc/fstab是开机是的设置文档,实际文件系统的挂载是记录到/etc/mtab与/proc/mounts这两个文件中的。每次在更改文件系统的挂载时,也会同时更改这两个文件。在单人模式中通过下面的指令重新挂载根目录为可读写,更新fstab
sh
mount -n -o remount,rw /
4. 文件系统的检查与修复
bash
fsck options filesystem
4.逻辑卷管理
LVM(Logical Volume Manager)和文件管理系统时关于存储管理的两个不同的概念和技术。
LVM是一种逻辑卷卷管理技术,用于管理磁盘驱动器和存储设备,它实现了在物理存储设备上创建逻辑卷,并将它们合并成一个虚拟组卷组的功能。LVM可以在运行时动态地调整逻辑卷的大小,提供更高的灵活性和可扩展性,以满足存储需求的变化。
文件管理系统是用于组织和管理计算机体系中的文件的软件或子系统。它涵盖了对文件的创建、存储、访问、修改和删除等操作。文件管理系统负责将文件存储在物理存储设备上,并提供对文件的访问和保护等功能。
LVM和文件管理系统之间的联系在于,LVM可以为文件管理系统提供灵活的存储管理解决方案。通过使用LVM,文件管理系统可以更加灵活地管理磁盘空间,轻松地扩展或缩小文件系统的大小,而无需重新分区或复制数据。
当文件管理系统需要增加存储空间时,LVM可以添加新的物理卷(例如硬盘或磁盘分区)到现有的卷组中,然后将该卷组扩展到新的物理卷组上。这使得文件系统可以继续在增加的空间上存储文件,并无需重新安装操作系统。
总的来所,LVM为文件管理系统提供了更高的灵活性和可用性,使得存储空间管理更加方便和可靠。它们共同为计算机系统中的文件管理提供了更好的性能和扩展性。
LVM允许将多个分区组合在一起,作为单个分区(逻辑卷)进行格式化、在Linux虚拟目录结构上挂载、存储数据等。
- 物理卷 physical volume,PV
通过LVM的pvcreate命令创建。指定一个未使用的磁盘分区(或整个驱动器)由LVM使用。该过程中,LVM结构、卷标和元数据都会被添加到该分区。 - 卷组
volume group, VG 通过vgcreate创建。将PV加入存储池,存储池用于构建各种逻辑卷。即,多个PV集中在一起形成VG,由此形成了一个存储池,从中为逻辑卷(LV)分配存储空间。
可存在多个VG, vgcreate同时也会添加卷组的元数据。
一个磁盘可以有多个PV,一个PV同时只能属于某个VG - 逻辑卷
logical volume, LV, 由lvcreate创建。LV由VG的存储空间块(PE, physical extents)组成。可以使用文件系统格式化LV,然后将其挂载,然后像普通磁盘分区一样使用。
LV不能跨VG创建
特殊设备loop挂载
假设有个映像文件xxx.iso
如何查看?可以读写iso的内容
sh
mount -o loop /tmp/xxx.iso /data/iso_dvd
-
建立大型文件
shdd if=/dev/zero of=~/loopdev bs=1M count=512 # if: input file,输入文件,/dev/zero会一直输出0 # of: output file, 将输入写入到后面的文件中 # bs: 每个block大小 # count: block的个数
-
大型文件格式化
shmkfs.xfs -f ~/loopdev blkid ~/loopdev
-
挂载
没有权限可能会挂载失败
sudo mount -o loop UUID="52654417-db5a-4294-afc0-0be467713b31" /mnt
/mnt$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/loop31 488M 24K 452M 1% /mnt
swap
建立swap
- 获得一个分区。由于Linux的gdisk预设会将分区ID设为Linux的文件系统,所以可能还得设置一下system ID。
- 格式化分区: mkswap 设备名
- 使用:启动该swap, swapon 设备名
- 观察,free -h 或 swapon -s指令查看
也可以用loop设备建立swap
shell基础知识
sh
# 先执行第一个命令然后执行第二个命令
cd ~;ls
# 当第一命令成功执行后再执行第二个命令
cd ~ && ls
variable=value #等号两边不能有空格
shell对空格的支持并不友好,在遇到空格时需要用转义字符()或将其用引号包含
1 命令替换
将命令的输出结果赋给变量
sh
# 用反引号将命令括起来
testing=`date` # 创建子进程运行date命令
testing=$(date)
today=20$(date +%y%m%d) # 同上,创建子进程运行date命令
echo container > log.$today 2$>1