linux笔记
马哥linux笔记
11_04 网络配置 ifg和ip系列命令
1.网络属于内核的功能。ip地址是属于内核的。虽然看起来像是配置在网卡上,但实际上是属于内核。无论数据是从哪个网卡进来,只要内核有这个地址,就可以响应
04_10 根文件系统
程序的编译方式:
动态链接:优点:节约内存资源
静态编译:优点:可移植性比动态链接强
库:不能独立执行,必须被调用才能执行
linux库:glibc
进程的类型按与终端是否有关可以分成两类:
与终端有关:用户通过终端启动的
与终端无关:开机自动启动的(由init程序启动的)
FHS:Filesystem Hierarchy standard(具体看linuxfoundation.org关于FHS的文档)
/bin:所有用户可用的命令文件
/sbin:系统管理员使用的工具
/boot:bootloader必须用到的所有文件:kernel,initramfs,grub等
/dev:特殊文件(有可能是软件模拟出来的设备)或设备文件
设备有两种类型:字符设备(线性设备),块设备(随机设备)
/etc:系统程序的配置文件
/home:存放普通用户的家目录
/root:管理员的家目录;可选
/lib:存放共享库。操作系统启动需要用到的所有库,根文件系统下/bin,/sbin目录下的可执行程序需要用到的所有库都要放在此目录。并且包含一个子目录modules,其存放可装载的内核模块。
libc.so.*:动态链接c库
ld*:运行时链接器/加载器
/lib64:64位系统特有的存放共享库的目录
(顺带一提:64位系统使用的共享库放在lib64下,32位的共享库在64位系统上依然放在/lib目录下)
/media:便携式设备挂载点,u盘等
/mnt:其他文件系统临时挂载点
/opt:第三方程序安装位置(现在很少有程序依赖于这个目录);可选
/srv:当前主机为服务提供的数据;一般不用
/tmp:存储临时文件的目录,可供所有用户执行写操作
/usr:第二重要的目录,存储全局共享的,只读的东西。 普通用户不应该向该目录写
子目录:
bin sin lib lib64 include,share(有些系统将命令手册页放在此处)
/usr/local:Local Hierarchy。系统管理员用来在本地安装软件时用到的目录
子目录:bin,etc,sbin,include,lib,lib64...
/var:Hierarchy。存储经常变化的数据,比如说日志
子目录:cache...
/proc:内存中的内核及进程相关信息的映像文件,是一个虚拟文件系统
/sys:
对于文件系统的问题
文件系统是与磁盘上的某个分区绑定吗?
(我的意思是:如果我有一个文件/etc/sysconfig/selinux放在一个分区上,那这个分区上是只有selinux文件还是说它还包含了整个目录结构的信息?如果包含了目录,那么是怎么做到的?是不是说文件系统就在这个磁盘上记录了?文件系统到底是什么?
)
上图中的含义有哪些:
1.内核完全隐藏了硬件细节
2.内核向上提供了一层系统调用
3.应用程序可以通过shell,库函数,或者系统调用三种方式与内核交互
(顺带一提:也就是说,应用程序也可以按是否通过shell启动分成两类)
08_26 磁盘及文件系统管理
接口类型:
IDE:并口
SCSI:并口
SATA:串口
SAS:串口
USB:串口
硬盘:机械硬盘,固态;
机械硬盘:
磁道,扇区,柱面
分区是基于柱面进行的
linux哲学思想:一切皆文件
设备类型:
块设备:随机访问,数据交换以一块为单位
字符设备:线性访问,数据交换以字符为单位
设备文件:FHS
/dev:存储设备文件
设备文件是为了关联设备的驱动程序
设备号:
major:主设备号,区分设备类型;用于表明设备所需要的驱动程序
minor:次设备号,区分同类型下的不同设备;特定设备的访问入口
mknod命令:创建块或字符设备文件
磁盘的设备文件:
IDE:/dev/hd
SCSI,SATA,SAS:/dev/sd
centos6,7统一为/dev/sd
引用设备的方式:
设备文件名
卷标
UUID
磁盘分区
MBR:磁盘的第一个扇区
446bytes:bootloader
64bytes:分区表,16字节一个分区,一共只能分四个分区
最后两字节:表示该MBR分区是否有效,0x55aa为有效
主分区和扩展分区分区号是1-4,逻辑分区只能从5开始
GPT:(没讲,自己补)
管理分区:
fdisk:
parted
sfdisk
【注意】:在已经分区并且其中某个分区已经被挂载至某个目录的设备上进行分区的管理操作时,在操作结束后内核可能无法直接识别;只有在确认内核已经识别后,才能继续进行其他相关操作
查看内核是否已经识别: cat /proc/partitions
通知内核强制重新重读磁盘分区表:
centos5:
partprobe [device]
centos6,7:
partx -a [device]
kpartx -af [device]
创建文件系统:
文件系统(what,why,how)?:
磁盘分区之后,结果只是将一个大的存储空间划分成了若干个小空间,如何方便的管理这块空间,便是文件系统要做的事情。
拿图书馆举例子。磁盘就好像是一个裸的图书馆,只有空间,里面什么设施啊,管理人员啊,书架,书的分区都没有。
对磁盘分区就好像对这个图书馆进行规划:哪一块地用来放文学类图书,哪一块地放理工科图书,哪一块地用来供阅读,哪块地是管理员的办公室
当然,划分好地方之后,也不能直接一股脑的将所有图书随意放在书架上,不然以后找书,还书可麻烦死了。所以我们有图书索引,也就是存储了图书的元数据(书名,简介,位置),这样以后找书就方便多了。创建某个分区创建文件系统就类似对某个图书馆的分区创建图书索引,目的就是为了更好地管理这块空间。
格式化:
低级格式化(分区之前硬件厂家会做的事情,进行划分磁道等工作)
高级格式化:分区之后对分区创建文件系统
所谓对某个分区创建文件系统,其实就是把这个分区划分成元数据区和数据区,元数据区只存储数据的元数据,真正的文件数据存放在数据区
元数据区:
文件元数据:存放在inode里
大小,权限,属组,时间戳,数据块指针...
(顺带一提:每个文件的元数据格式都是一样的,也就是说存储哪些文件的哪些元数据是预先定好的,所以inode的大小是固定的,但是不同文件系统的inode大小可能不同,inode的数量一般在格式化的时候就已经确定了)
bitmap:
元数据的bitmap
数据块的bitmap
(顺带一提:为什么要有bitmap?为了加速写)
数据区:数据区会被划分为固定大小的一个个数据块,文件系统应根据文件大小为其分配合适数量的数据块
数据块组:对所有磁盘块进行逻辑上的分组
每个块组都有元数据区和数据区
超级块:记录整个磁盘分区的所有块组信息。非常重要,所以一般会做冗余备份。
每个块组还有记录自己这个块组相关信息的专属块,叫做组描述符块
(顺带一提:为什么要分块组?为了加速读写)
目录:
每个目录也有元数据和数据,也就是说每个目录也有对应的inode和磁盘块,目录的磁盘块记录的数据内容是一张表。这张表有两个列,一列是该目录下的所有文件(包括目录)的名字和其对应的inode。
(顺带一提:实际上,创建文件系统是先对磁盘分区进行划分磁盘块,然后对这些磁盘块再划分成元数据区和数据区,所以说先划分元数据区和数据区,再对数据区分块是不精确的。超级块也是磁盘块中的某一个块,一般存储在元数据区中的某个磁盘块上)
(顺带一提:软链接文件:存储数据块指针的存储空间中存储了真实文件的访问路径,不占用数据块
设备文件:存储数据指针的空间中存储了设备号(major,minor),不占用数据块)
VFS:虚拟文件系统。linux为了向上层统一接口而在程序员和文件系统之间增加的一层虚拟文件系统。
linux支持的文件系统:ext2(无日志),ext3,ext4,xfs,reiserfs,btrfs
支持的光盘文件系统:iso9660
网络文件系统:nfs,cifs
集群文件系统:gfs2,ocfs2
内核级分布式文件系统:ceph
windows的文件系统:vfat,ntfs
伪文件系统:proc,sysfs,tmpfs,hugepagefs
unix文件系统:UFS,FFS,JFS
交换文件系统:swap
用户空间的分布式文件系统:mogilefs,moosefs,glusterfs
文件系统管理工具:
创建文件系统的工具
mkfs
mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.xfs,mkfs.vfat...
检测及修复文件系统的工具
fsck
fsck.ext2,fsck.ext3...
查看其属性的工具
dumpe2fs,tune2fs
调整文件系统特性
tune2fs
是否存日志:
日志文件系统,无日志文件系统
链接文件:
硬链接文件:例如硬链接hard_link->a,在目录的数据区中的记录表中新建一行,文件名叫hard_link,inode号是文件a的inode号
特性:
不能为目录创建硬链接;
不能跨文件系统创建硬链接;
创建硬链接会增加inode引用计数;
符号链接文件:列入soft_link->a,新建一个文件soft_link,其元数据区本应记录inode索引的区域现在用来记录文件a的路径
特性:
符号连接和原文件是各自独立的文件,有不同inode;创建符号连接不会增加inode引用计数
可以为目录创建软链接,可以跨文件系统创建软链接
删除符号连接不影响原文件;但删除原文件,符号连接就无用了
软链接的权限并不代表其原文件的权限,它俩的权限是独立的。意思是,如果soft_b->a,如果文件a对某用户来说,没有读权限,但是这个用户 可以读soft_b,即使这样,该用户也没法通过soft_b来读文件a的
28
内核级文件系统组成部分:
文件系统驱动:由内核提供
文件系统管理工具:由用户空间应用程序提供
09-32 raid
2.硬盘的io速度具体是指什么的速度
3.raid:将多块硬盘按某种格式组织在一起。
可以提高性能和耐用性。
性能
磁盘并行读写
耐用性
磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同
raid的实现方式
raid需要raid控制器
外接式磁盘阵列:通过扩展卡提供适配能力
内接式磁盘阵列:主板集成raid控制器
software RAID:用软件控制来实现raid
硬件级别的raid的配置是在bios中做的。
在安装操作系统之前,如何使用raid,将哪些硬盘按哪种级别组织raid,是要事先规划好的
级别:仅仅是组织上的不同
0-6
使用内核模块管理:md:multiple device
管理命令:mdadm
09-33 LVM
apt install lvm2: ’2‘是lvm的版本号
使用的内核模块:dm: device mapper
PV->VG->LV:物理卷组成卷组,卷组会被分成多个PE(卷组在定义时指定一个PE的大小),若干个PE组成一个逻辑卷,所以一个卷组可以分成多个逻辑卷
物理卷可以是很多,比如硬盘,raid
常用相关命令:
pvdisplay,pvs
pvcreate /dev/DEVICE
pvremove
vgdisplay,vgs
vgcreate VGNAME /dev/DEVICE
vgextend
vgreduce:VG的缩减,缩减之前要将所移除的PV的数据移动到同一卷组的其他PV中去
lvdisplay,lvs
lvcreate --size #[mMgGtT] --name NAME VolumeGroup
lvremove
扩展逻辑卷:
lvextend [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
注意:逻辑卷扩展完之后,仅仅是增加了逻辑卷的物理存储空间,但是逻辑卷的文件系统并没有随之扩展,所以需要手动扩展其文件系统
扩展文件系统:resize2fs /dev/VG_NAME/LV_NAME
缩减逻辑卷:
妥当的做法:
先卸载文件系统:umount
在做文件系统的强制检测:e2fsck -f
重新调整文件系统大小:resize2fs
最后缩减逻辑卷:lvreduce
快照:
快照卷的工作原理:原卷文件元数据变化时将文件复制到快照卷
快照卷和原卷必须在同一卷组中
lvcreate -s -L #[mMgGtT] -p r -n snapshot_lvname original_lvname
文件系统挂载:
挂载光盘设备
光盘设备文件:
IDE:/dev/hdc
SATA:/dev/sr0
符号链接文件:
/dev/cdrom
/dev/cdrw
/dev/dvd
//dev/dvdrw
dd命令:转换和复制文件,但使用的接口比cp更底层
dd if=/PATH/FROM/SRC of=/PATH/To/DEST bs=# count=#
磁盘拷贝:
dd if=/dev/sda of=/dev/sdb
备份MBR
dd if=/dev/sda of=/tmp/mbr.backup bs=512 count=1
清空MBR:
dd if=/dev/zero of=/dev/sda bs=512 count=1
linux两个特殊设备:
/dev/null
/dev/zero
94 iptables
linux防火墙:主机防火墙;网络防火墙
hook function
prerouting
input
forward
output
postrouting
iptables:用户空间的规则编辑攻击
netfilter:内核内部的防火墙模块,五个钩子函数
防火墙产品的历史 ipfirewall->ipchains->iptables->nftables
iptables+netfilter可以实现的功能
filter:防火墙
nat:网络地址转换
mangle:拆开报文,作出修改,重新封装
raw:关闭nat表上启用的连接追踪机制 ??
链:
内建链:上面的五个
自定义链:自定义的链必须在内建链上调用才能生效
一个自定义链有被内建链引用,或者自定义链有规则,都删不掉
内建链是删不掉的
iptables [-P {chain} {policy}] 该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略
链的默认策略:当数据包与链上所有规则都不匹配时,应用此策略。链中的每条规则也有自己的策略(ACCEPT,DROP...)
如果默认策略是ACCEPT,则表示在所有规则都不匹配时,默认接收对应的数据包。因此,在添加规则时,需要注意规则的顺序。
ACCEPT一定要在DROP REJECT等前面,才能通过iptables。如果新的规则加在DROP规则的后面,就起不到作用。
如果默认策略是DROP,则表示所有规则都不匹配时,则丢弃对应的数据包。这样的话,就可以在规则中,只添加允许的服务通过iptables,以白名单的形式,如果没有在列表的请求则默认丢弃。
iptables修改的是内存中内核的参数,修改后立即生效
扩展匹配条件,扩展策略
扩展匹配条件
隐式扩展,在指定了‘-p protocal’之后,扩展功能模块自动加载,无需再指定--match参数
显式扩展,
multiport
iprange
iptables总览
有四张表:filter,nat,mangle,raw
每张表都有若干条链:每张表特定的内建链和自定义链
每条链上有若干条规则,每条链都有默认策略,
*当数据包来的时候,按什么顺序匹配规则?
表有优先级,链有前后顺序,规则也有先后顺序(按照规则定义顺序)。具体优先级如下图。数据包会按下图的顺序进行规则的匹配
14-51 centos启动流程
linux系统:内核+根文件系统
内核:进程管理,内存管理,网络协议栈,文件系统,驱动程序,安全功能,
IPC:进程间通信
消息队列,semerphor,shm
socket
内核设计流派:
单内核设计:所有的功能放在一个程序中;
linux
微内核设计:每种功能由一个单独的子系统实现;
windows,solaris
linux内核特点
支持模块化:.ko(kernel object)
支持模块运行时动态装载和卸载
内核组成部分
核心文件
ramdisk:
centos5: /boot/initrd-VERSION-release.img
centos6,7: /boot/initramfs-VERSION-release.img
模块文件
centos系统的启动后流程 (MBR x86)
POST:加电自检
ROM:CMOS
BIOS:基本输入输出系统
boot sequence:
1.按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备,里面写有bootloader,加载bootloader
bootloader:一段程序
windows:ntloader
linux
LILO:linux loader
GRUB:grand uniform bootloader
grub0.x(grub legacy),grub1.x(grub2):两者相差甚远
功能:提供一个菜单,允许用户选择要启动的系统或内核版本;把用户选定的内核装在到ram的特定空间中,解压,展开,而后把系统控制权 移交给内核
MBR:master boot record
512bytes
446bytes:bootloader
64bytes:fat(分区表)filesystem allocation table
2bytes:0x55AA,表示这是一个有效的MBR
GRUB:
bootloader:grub第一阶段,加载第二阶段的存于磁盘中的一段程序
partition:filesystem driver,grub第1.5阶段
partition:/boot/grub,grub第二阶段,真正用于加载内核等其他操作
UEFI
2.kernel
自身初始化:
探测可识别到的所有硬件设备;
加载各种硬件驱动程序;(有可能会借助于ramisk加载驱动)
ramdisk:
centos5: mkinitrd
centos6,7:dracut
以制只读方式挂载根文件系统;(防止内核有问题,所以先以只读挂载)
运行用户空间的第一个应用程序:/sbin/init
init程序有不同类型
centos5-: SysV init
配置文件:/etc/inittab
centos6:upstart
配置文件:/etc/inittab(基本没用)实际上读取的是:/etc/init/*.conf
centos7: systemd
配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*
系统启动流程
POST->BootSequence(BIOS)->Bootloader(MBR)->kernel(ramdisk)->rootfs(readonly)->switchroot->/sbin/init
/sbin/init
centos5: SysV init:
运行级别:为了系统的运行和维护而设定的机制
0-6:
0:关机
1:单用户模式:只有root用户,无须认证;维护模式
2:多用户模式:会启动网络功能,但不会启动NFS;维护模式
3:多用户模式:完全功能模式;只有文本界面
4:预留级别:目前无特别实用目的,同3级别对待
5:多用户模式:完全功能模式;会启动图形接口
6:重启模式
级别切换:init <level>
级别查看:
who -r
runlevel
52 Sysv init
配置 /etc/inittab
每行定义一种action以及与之对应的process
id:runlevels:action:process
id:任务标识符
runlevels:在哪些级别启次任务,可以为空,表示所有级别
action:在什么条件下启动此任务
process:任务
action:
wait:等待,切换至此任务所在的级别时执行一次
respawn:一旦此任务终止,就自动重新启动之
initdefault:设定默认运行级别;此时,process省略
sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本
例如:
id:3:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
i0:3:wait:/etc/init.d/rc 3
意味着去启动或关闭/etc/rc.d/rc3.d目录下的脚本所控制的服务,一般都是链接文件,链接至/etc/rc.d/init.d/下的文件
K*:要停止的服务;K##*,优先级,数字越小,优先停止
S*:要启动的服务,S##*,优先级,数字越小,优先启动
rc脚本,接受一个运行级别作为参数
rc脚本核心:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for src in /etc/rc.d/rc#.d/S*;do
$srv start'
done
/etc/init.d/(/etc/rc.d/init.d/)下的脚本执行方式:
/etc/init.d/SRV_SCRIPT {start|stop|status|restart}
service SRV_SCRIPT {start|stop|status|restar}
chkconfig命令:管控/etc/init.d下每个服务脚本在各级别下的启动或关闭状态
实际上就是根据脚本的配置在对应的/etc/rc.d/rc#.d/目录下创建管理服务启动或关闭的链接文件
查看:chkconfig [--list SRV_NAME]
添加:chkconfig --add SRV_NAME
能被添加的服务的脚本定义方式之一:
#! /bin/bash
#
# chkconfig: 2345 60 80
删除:chkconfig --del SRV_NAME
更改链接状态:chkconfig [--level LEVELS] SRV_NAME {on|off|reset}
--level LEVELS:指定要控制的运行级别,默认为2345
注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/rc.d/init.d/下的某脚本,而是链接至了/etc/rc.d/rc.local(/etc/rc.local);因此,不便或者不需写成服务脚本的程序期望能够开机自动运行时,直接将命令写在rc.local这个脚本文件即可
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6 #控制六个开机启动的终端
(1)mingetty程序会调用login程序;
(2)能够让我们打开虚拟终端的程序除了mingetty,还有诸如getty等
系统初始化脚本文件/etc/rc.d/rc.sysinit做了什么:(很好的脚本学习文件)
(1)设置主机名
(2)设置欢迎信息
(3)激活udev和selinux
(4)挂载/etc/fstab下定义的文件系统
(5)检测根文件系统,并以读写方式重新挂载根文件系统
(6)设置系统时钟
(7)根据/etc/sysctl.conf文件来设定内核参数
(8)激活lvm及软raid设备
(9)激活swap设备
(10)加载额外设备的启动程序
(11)清理操作
总结(用户空间的启动流程):/sbin/init (/etc/inittab)
设置默认运行级别->运行系统初始化脚本,完成系统初始化->关闭对应级别下需要停止的服务,启动对应级别下需要启动的服务->设置登录终端 ->【启动图形终端】
centos6启动流程
init程序:称为upstart,但依然为/sbin/init,其配置文件为/etc/init/*.conf,但为了兼容,依然会读取/etc/inittab,不过此时这个文件仅用于设定默认运行级别
centos7启动流程
init程序:systemd,配置文件/usr/lib/systemd/system/*,/etc/systemd/system/*
完全兼容SysV脚本机制;因为service命令依然可以用;不过,建议使用systemctl控制服务
53 grub
Grub(一种Boot Loader):grand unified legacy
grub 0.x
stage1: MBR
stage1.5: MBR之后的扇区中,让stage1中的bootloader能识别stage2所在的分区中的文件系统
stage2: 存放在磁盘分区之上,一般挂载指/boot/grub
配置文件:/boot/grub/grub.conf,其一般有一个软连接为/etc/grub.conf
stage2及内核通常放置于一个基本磁盘分区
(顺便一提:BIOS首先要能够识别磁盘设备,然后再加载磁盘中的MBR)
功能:
(1)提供菜单,并提供交互式接口
e:编辑模式,用于编辑菜单
c:命令模式,命令行交互
(2)加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3)为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
(顺带一提:/boot目录不一定必须挂载到一个单独的分区上,如果根文件系统并不是复杂的文件系统,比如raid或者lvm,/boot也可以不另外挂载到其他的分区,而是直接就在根文件系统个所在的分区
再具体说下:
对于grub来说,grub第二阶段需要去加载某个磁盘分区中的文件,所以grub必须能够识别这个磁盘分区的文件系统,如果grub第二阶段所在的磁盘分区的文件系统是非常复杂的文件系统(比如lvm或者raid),grub就很难加载(因为在grub里预先写好所有的文件系统驱动是不现实的,所以一般只写一些常用的简单的文件系统),所以一般把grub第二阶段挂载到一个基本磁盘分区上。
grub有一个命令:root,这个命令用来指定第二阶段的磁盘分区是哪个。
如果第二阶段的磁盘分区是单独的一个分区,则使用root命令指定其为根之后,这个分区下的grub.conf 文件的访问路径就是/grub.conf
而如果第二阶段的磁盘分区指定的是根文件系统所在分区,如果grub相关文件被放在了根文件系统下的/boot目录下,则使用root命令指定该 分区为根分区后,访问grub.conf的路径就变成了/boot/grub.conf。(能访问这个根文件系统的/boot/grub.conf还有一个前提,就是grub必须能够识别这个根文件系统,所以,鉴于在grub中预先写完所有的文件系统驱动不现实,如果这个根文件系统是lvm或者raid这样复杂的文件系统,grub可能就无法识别。而一般情况下,操作系统的发行商习惯默认将根文件系统做成lvm的格式,所以一般默认挂载到/boot的分区是单独分区的【/boot一般用来存储bootloader和kernel等相关文件,这些文件放在一个单独的分区,该分区的文件系统一般为基本文件系统,一般将该分区挂载至根文件系统的/boot目录下,当操作系统启动完成后,访问根文件系统的/boot,就可以看到这些文件】)
ps:【马哥linux云计算第52讲20分钟左右处】的总结
)
如何识别设备:
(hd#,#)
第一个#:磁盘编号
第二个#:分区编号
grub的命令行接口
help 【keywork】:获取帮助列表
find (hd#,#)/path/to/somewhere
root (hd#,#)
kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数
例如:init=/path/to/init,selinux=0
initrd:/path/to/initramfs_file:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核
手动在grub命令行下启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-version-release ro root=/dev/device
grub> initrd /initramdisk-version-release.img
grub> boot
grub配置文件:/etc/grub.conf
配置项:
default=# //默认启动的菜单项,从0开始编号
timeout=# //指定菜单项等待选项选择的时长
splashimgae=(hd#,#)/path/to/xpm_pic_file //指定菜单的背景图片文件路径
hiddermenu //隐藏菜单
password [--md5] STRING //进入菜单编辑时进行认证
title TITILE //定义菜单项,可定义多次
root (hd#,#) //指定grub查找stage2及kernel文件所在的设备分区,是grub的根,不是根文件系系统的根
kernel /path/to/kernel_file parameters //指定要启动的内核文件
initrd /path/to/initramfs_file //指定内核匹配的ramfs文件
password [--md5] STRING //启动选定的内核或操作系统时进行认证
grub-md5-crypt:生成md5字符串
进入单用户模式:
(1)编辑grub菜单(选定要编辑的title,而后使用e命令)
(2)在选定的kernel后附加1,s,S或single都可以
(3)在kernel所有行,键入b命令
安装grub:
(1)grub-install --root-directory=ROOT /dev/DISK
注意:grub-install比较轴,--root-directory所指定的ROOT必须存在boot目录才行
具体看【马哥linux云计算52讲一小时左右】
(2)grub命令进入grub命令行
grub> root (hd#,#)
grub> setup (hd#)
这两者的区别是?(后续查找补充):
进入救援模式:【马哥linux云计算52讲一个半小时左右】
问题:
什么是文件系统?什么是根文件系统?文件系统驱动具体是什么?
grub不能放在复杂的文件系统里还是/boot不能挂载在复杂的文件系统里(这里不太明白)
答:已经算明白了。可以看【马哥linux云计算第52讲20分钟左右处】的总结
ramdisk为什么会存在,这里需要再看下,应该是在马哥51讲
可能不太准确的理解:里面有根文件系统所在设备的设备驱动,
54 内核配置,内核模块
ldd命令:二进制文件的动态库依赖
内核设计体系:单内核,微内核
linux内设设计:单内核,但充分借鉴了微内核设计的有点:为内核引入了模块化机制
linux内核的组成部分:
kernel:内核核心,一般为bzimage文件,通常位于/boot目录下,名称一般为vmlinuz-VERSION-RELEASE
kernel object:内核对象,即内核模块,一般置于/lib/moudules/VERSION-RELEASE/
内核模块与内核核心的版本一定要严格匹配
内核模块的编译选项:
不编译
编译成模块
编译仅核心
内核模块支持动态装载和卸载
ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动根文件系统所在的设备
目标设备驱动,例如SCSI设备的驱动;
逻辑设备驱动,例如lvm的驱动
文件系统,例如xfs文件系统
ramdisk是一个简装版的根文件系统
ramdisk的目的主要是为了能够加载真正的根文件系统
linux内核信息查看:
uname:
-a:所有信息
-r:内核release号
-n:主机名
linux模块信息查看:
lsmod命令:显式已装载的模块
显式的内容来自/proc/modules
modinfo命令:显式模块元数据,模块无论是否装载都可以显式,它显示的其实就是/lib/modules相关文件中的内容
modprobe:模块动态装载进入内核和从内核卸载
modprobe modulename //装载模块
modprobe -r modulename //卸载模块
depmod:生成依赖关系
模块装载和卸载的另一组命令:
insmod:装载模块进入内核
insmod [filename] [module parameters]
filename:内核模块文件的完整路径
rmmod:从内核卸载模块
rmmod modulename:无须指定内核模块完整路径,只需指定模块名
ramdisk文件的管理:
(1)mkinitrd命令 (centos5)
为当前使用中的内核重新创建
--with=<module>:除了默认的模块之外需要装载至initramfs的模块
--preload=<module>:在initramfs中的所有模块被加载之前,需要预先加载的模块
(2)dracut命令(centos6,7)
内核信息输出的伪文件系统:
/proc:内核状态及统计信息的输出接口;同时,提供了一个配置接口:/proc/sys
只读:信息输出;例如/proc/pid/*
可写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置;只有/proc/sys目录下有,而且只有管理员有写权限
(1)sysctl:专用于查看和设定/proc/sys目录下参数的值
sysctl [options] [variable=[value]]
查看:
sysctl -a
sysctl variable
cat /proc/sys/path/to/variable_file
net.ipv4.ip_forward相当于 /proc/sys/net/ipv4/ip_forward
修改
sysctl -w variable=value
(2)文件系统命令(echo,cat)
查看:cat /proc/sys/path/to/variable_file
修改:echo “value” > /proc/sys/path/to/variable_file
上述两种方式的设定,仅当前运行内核有效;
要想永久有效,修改配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf(centos7)
修改之后,要想立即生效,需要使用sysctl重读配置文件并根据配置文件进行设置
sysctl --load[=file] //有默认值,即默认读取的文件
内核参数:
net.ipv4.ip_forward:核心转发
vm.drop_caches
kernel.hostname:主机名
net.ipv4.icmp_echo_ignore_all:忽略所有的ping
/sys
sysfs:输出内核识别出的各硬件设备的相关信息,也有对硬件特性的可设置参数;对这些参数的修改,即可定制硬件设备的工作特性
udev:通过读取/sys目录下的硬件设备信息,按需为各硬件设备创建各设备文件;udev是用户空间程序;
内核在初始化的时候会探测硬件设备,但是根文件系统的挂载要在内核初始化之后才能进行,所以为了得到内核初始化的时候探测得到的设备信 息,需要内核在根文件系统挂载后将设备信息输出到/sys目录下,然后udev根据这些信息就可以按需在/dev下创建相应的设备文件
这里还有一些专用工具用来创建设备文件,比如devadmin,hotplug
很多设备文件都是udev创建的,但是也有一些是内核创建的。一些内核在初始化过程中必须用到的设备,在内核初始化的时候会在内置的一个文 件系统/dev/tmpfs中创建对应的设备文件,并在根文件系统挂载后将其移到根文件系统的/dev目录下
udev为设备创建设备文件时,会读取事先规定好的规则文件,一般在/etc/udev/rules.d目录下,以及/usr/lib/udev/rules.d目录下
15_55 编译内核
程序包的编译安装:
./configure, make, make install
前提:开发环境(开发工具,开发库),头文件/usr/include
源代码(不是所有人都会编译,而这些人可能只是想用这个软件),发行版(以通用的目标)
步骤:
(1)准备好开发环境
(2)获取目标主机上硬件设备的相关信息
(3)获取到目标主机系统功能的相关信息,例如要启动的文件系统
(4)获取内核源代码包
准备开发环境:
centos6,7
包组:
Development Tools
Server Platform Development
获取目标主机上硬件设备的相关信息
CPU:
cat /proc/cupinfo,
lscpu命令
x86info -a
PCI设备:
lspci命令
lsusb:显示usb信息
lsblk:显示块设备信息
内核编译:
tar -xf linux-3.10.67.tar.xz
cd /usr/src
ln -s linux-3.10.67.tar.xz linux
cd linux
make memuconfig //配置内核
make //编译
make modules_install //内核模块安装
make install //内核安装
screen命令和tmux差不多
16_60 systemd
systemd的新特性:
系统引导时服务并行启动
按需激活进程
系统状态快照
基于依赖关系定义服务控制逻辑
核心概念:unit
unit由其相关配置文件进行标识,识别和配置;文件中主要包含了系统服务,监听的socket,保存的快照以及其他unit相关的信息;
这些配置文件主要保存在/usr/lib/systemd/system,/etc/usr/systemd/system
unit的类型:
service:文件扩展名.service,定义系统服务
target:文件扩展名.target,用于模拟"运行级别"
device:文件扩展名.device,定义内核识别的设备(centos7,systemd和udev联合识别并创建设备文件,主要有systemd完成,而 systend主要就是靠device unit配置文件识别的)
mount:文件扩展名.mount,定义文件系统挂载点
socket:文件扩展名.socket,用于定义进程间通信用到的socket文件
snapshot:文件扩展名.snapshot,管理系统快照
swap:文件扩展名.swap,标识swap设备
automount:文件扩展名.automount,文件系统自动挂载
path:文件扩展名.path,定义文件系统中的文件或目录,systemd可以进行不存在自动创建
关键特性:
基于socket的激活机制
基于bus的激活机制
基于device的激活机制
基于path的激活机制
系统快照:保存各unit的当前状态信息于持久存储设备中
向后兼容Sysv init脚本:
/etc/init.d目录下的脚本
不兼容:
systemctl对每个unit的管理命令不能自定义
非由systemd启动的服务,systemd就无法对其进行管理
管理系统服务:
centos7:service类型的unit文件
systemctl:
service管理:
start,stop,status,restart
条件式重启:try-restart
重载或重启服务:reload-or-restart
重载或条件式重启:reload-or-try-restart
查看某服务当前激活与否:is-active
查看所有已激活的服务:systemctl list-units --type=service
查看已装载已激活和已装载但未激活的服务:systemctl --list-units --type=service --all
(查看所有已安装的unit:list-unit-files)
管理服务开机启动:enable,disable
查看某服务是否开机启动:is-enabled
禁止某服务被设定为开机启动:mask,unmask(取消禁止)
查看服务的依赖关系:list-dependencies
target管理:
运行级别:
0 => runlevel0.target, poweroff.target
1 => runlevel1.target, rescue.target
2 => runlevel2.target, multiuser.target
3 => runlevel3.target, multiuser.target
4 => runlevel4.target, multiuser.target
5 => runlevel5.target, graphical.target
6 => runlevel6.target, reboot.target
级别切换:
init n => systemctl isolate NAME.target
查看当前运行级别:
systemctl list-units --type=target //通过这个查看哪个级别被激活了
查看所有target:
systemctl list-units --type=target --all
查看和设置默认运行级别:
systemctl get-default
systemctl set-default NAME.target
切换至救援模式
systemctl rescue //启动rescue.target
切换至emergency模式
systemctl emergency
(顺带一提:救援模式和emergency模式的区别:
以centos6为例,在centos6,/etc/inittab里面一般会有一项用于系统初始化的配置,差不多长这样,【si::sysinit:/etc/rc.d/rc.sysinit】,所有init在启动后,会执行rc.sysinit脚本,该脚本进行系统的初始化工作,上面【在52】有介绍主要进行了哪些工作,比如设置主机名,挂载文件系统,激活驱动程序等,在救援模式下,也就是运行级别1下,该脚本依旧会执行,但是在emergency模式下,不会执行该脚本,所以简单来说,系统在emergency模式下会比救援模式更简装。
)
systemctl常用子命令:
关机:halt,poweroff
重启:reboot
挂起:suspend
创建快照:hibernate
创建快照并挂起:hybrid-sleep
service unit file:
文件由三段组成:
[Unit]:定义与unit类型无关的通用选项;用于提供unit的描述信息,unit行为及依赖关系等;
[Service]:定义特定unit类型的选项;此处为service
[Install]:定义由“systemctl enable/disable”在实现服务启用或禁用时用到的一些选项
Unit常用选项:
Description
After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反
Requires:强依赖到的其他的unit,被依赖的unit无法启动时,当前unit无法启动
Wants:弱依赖到的其他unit,期望这些unit能够启动,但是即使没有启动,当前unit也可以启动
Conflicts:定义units间的冲突关系
Service常用选项:
Type:定义unit进程启动类型,会影响ExecStart及其相关参数
启动类型:
simple:由ExecStart启动的进程就是主进程
forking:由ExecStart启动的进程,其生成的一个子进程会成为主进程
oneshot:
dbus:
notify:
idle:
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行的命令或脚本;还有ExecStartPre,ExecStartPost
ExecStop:停止unit要运行的命令或脚本
Restart:
Install常用选项:
Alias
RequiredBy:被哪些unit强依赖
WantedBy:被哪些unit弱依赖
注意:对于新创建的或修改了的unit文件,要通知systemd重载此配置文件 //使用systemctl daemon-reload
61 SElinux
SElinux(secure enhanced linux),工作于内核中
DAC:自主访问控制
MAC:强制访问控制
SElinux有两种工作级别:
strict:每个进程都收到selinux的控制
targeted:仅有限个进程受到selinux的控制
selinux为每个文件和每个进程都提供了安全标签;
user:role:type
user:SElinux的用户
role:SElinux的role
26_104 IO事件模型
IO模型:阻塞型(同步阻塞),非阻塞型(同步非阻塞),复用型(多路复用,阻塞),事件驱动型(半异步非阻塞),异步(完全异步非阻塞)
信号驱动型:第一阶段非阻塞,第二阶段阻塞
异步:第一二阶段都不阻塞,内核直到第二阶段完成才通知用户进程
一次文件IO由两阶段组成:
第一阶段:数据从磁盘到内核内存
第二阶段:数据从内核内存到用户进程内存
复用型IO:
select:一个进程最多1024
poll:可监听文件描述符不限制数量
事件驱动型:
epoll(Linux):libevent
Kqueue(BSD):
/dev/poll(Solaris)
nginx:
httpserver:
static web server
nmp(nginx,mysql,php),nmt(nginx,mysql,tomcat)
reverse proxy
架构:master+worker
特性:异步,事件驱动和非阻塞
并发请求处理:epoll/select
文件IO:高级IO sendfile,异步,mmap
nginx模块:
模块分类:
核心模块:core module
标准模块:
Http Modules:
Standard Http Modules
Optional Http Modules
Mail Modules:
Stream Modules:
传输层代理
第三方模块
nginx的功用:
静态的web资源服务器(图片服务器,或js/css/html/txt等静态资源)
结合FastCGI/uwSGI/SCGI等协议反代动态资源请求
http/https协议反向代理
Imap4/pop3协议的反向代理
tcp/udp协议的请求转发
nginx的配置:
配置文件的组成部分:
主配置文件:nginx.conf include conf.d/*.conf
fastcgi,uwsgi,scgi等协议的配置文件
mime.types:支持的mime类型
配置文件的配置指令:
指令 value...; (例如: listen 80;)
注意:
1.指令必须以“;”结尾
2.支持使用配置变量
内建变量:由nginx模块引入,可直接引用
自定义变量:由用户使用set命令自定义
set VAR VALUE
引用变量:$VAR
主配置文件的结构:
main_block:主配置段,也即全局配置段
event {
};事件驱动的相关配置
;特定功能的配置
http {
}; http/https协议相关的配置
mail {
}
stream {
}
nginx的主程序文件:/usr/sbin/nginx
未知
select只能处理1024,而poll和epoll没有限制,为什么?,怎么做到的?
select,poll,epoll的具体使用示例
补一下:
linux父子进程的相关知识,linux各种并发模型的原理
socket文件是什么
unix并发编程
unix网络编程
28_116 nginx反向代理
代理服务器与客户端会建立连接,而且也会和被代理服务器建立连接;
也就是说,代理并不是转发,而是一次新的请求
proxy_pass
proxy_set_header
add_header
未知
基于域名区分server是什么意思?
117 反向代理缓存,动态php请求代理
缓存:
要先定义缓存,然后在调用缓存
这个缓存是存储在磁盘中的,会根据url的hash值创建层级目录(hash值从右向左或取一位或取两位,最多建立三级)
内存中会存一张哈希表,key是url的hash,value表示这个url指向的资源是否被缓存
proxy_cache_path PATH levels=1:1:1 keys_zone=pcache:1M max_size=2G;定义缓存,名字叫做pcache
proxy_cache pcache;使用pcache缓存
proxy_connect_timeout 65;不能超过75秒
proxy_read_timeout ;
proxy_send_timeout ;
nginx+php:
118 动态php请求代理
php-fpm
119 nginx负载均衡
一致性hash 作者:ketama
补一下
各种配置文件如何读取的(代码级别)?
http的请求头和相应头各个字段如何读取的(代码级别)?
tcp和http的keepalive