14-CentOS启动流程 CentOS启动流程粗讲(细讲见本文档) 1. POST:Power On Self Test 加电自检 ROM中存放了BIOS系统和自检程序,当主板加电后会将BIOS载入内存空间执行检测,当检测通过后会通过检测boot顺序读取MBR 2. 读取MBR中前446个字节,boot loader,引导加载器 boot loader有grub|grub2|Lilo等,当BIOS载入bootloader后,将控制权交给bootloader(GRUB),grub去加载内核,grub首先要能够识别文件系统,grub中应当声明内核的位置,在第二阶段的boot基本磁盘分区中,/boot/grub/grub.conf中定义了内核位置信息 /boot/grub/grub.conf default=0 默认启动的内核 timeout=5 默认等待时间 hiddenmenu 隐藏式菜单,需按任意键显示 splashimage=(hd0,0)/grub/splash.xpm.gz 可使用Imagemagick包安装convert生成xpm格式的图片 图片的要求必须是XPM格式 必须使用gzip压缩 最多使用14位颜色显示 分辨率640*480 GRUB的功能 1) 选择要启动的内核或者操作系统 能够隐藏选择界面 2) 交互式接口 e 编辑模式 3) 基于密码保护 启用内核映射,password段定义在相应的title下,对内核进行加密 传递参数[进入编辑模式],password端定义在全局段中 加载VMLinux至内存 3. kernel运行 通过initrd加载根文件系统,initrd中包含根文件系统所在设备的驱动和相关程序,是kernel能够识别并加载根文件系统的桥梁 4. init运行 /sbin/init 配置文件:/etc/inittab /etc/init/*.conf 通过/etc/init/rcS.conf & /etc/init/rc.conf 确认系统的启动级别 进入相应的目录/etc/rc.d/rc#.d/S*,执行对应启动级别下的服务 脚本的实际位置:/etc/init.d/* init的任务 1) 设定默认的运行级别 2) 指定系统运行的初始化脚本-->/etc/rc.sysinit 3) 启动指定级别下需要启动的服务 4) 定义Ctrl+Alt+Delete组合键的动作 5) 初始化字符终端(对应的设备是/dev/*,调用login-->/etc/issue) 6) 启用图形终端(X-window桌面管理器) init级别定义 0 关机 1 singe 单用户模式 2 无网络的完全模式 3 完整的多任务多用户的模式 4 保留 5 图形界面 6 重启 系统初始化脚本完成的任务 1) 设置主机名 2) 打印文本欢迎信息-->/tec/issue 3) 激活SELinux和udev 4) 激活swap 5) 挂载/etc/fstab中定义的本地文件系统 6) 检测文件系统并以读写的方式挂载 7) 设置系统时钟 8) 装载键盘映射 9) 根据/etc/sysctl.conf设置内核参数 10) 激活软RAID和LVM设备 11) 清理操作 root忘记密码的操作方式 1.进入单用户模式-->e-->选择内核版本e-->编辑:1/single 回车保存-->b 重启进入单用户 2.使用启动盘,进入修复模式更改root的密码,按照提示进行 ~]# chroot /mnt/sysimage #切换到真实操作系统目录下 ~]# passwd root #修改用户密码 ~]# exit #退出当前根 ~]#reboot #重启 手动安装GRUB 使用光盘进入救援模式 ~]# chroot /mnt/sysimage ~]# grub >root (hd0,0) #第一块磁盘的第一个分区 >setup (hd0) >quit ~]# exit ~]# reboot linux启动流程细讲: centos的启动流程(5&6) linux:kernel+rootfs kernel的功能:进程管理、内存管理、网络管理、驱动管理、文件系统、安全管理 glibc (gnu lib) C标准库(系统调用的再封装) glibc已经属于用户空间,在根文件系统上 库:函数的集合,function(功能),调用的接口为函数。库也是二进制程序,但是库文件没有独立的运行接口,只能被调用。 库文件:*.so (share object) 共享对象。 过程调用:procedure,无返回值的代码片段,它的作用可能是环境的准备,并不需要返回值。 函数调用:function,有返回值。 内核的设计流派 : 1. 单内核设计:把所有的功能集成到同一程序 2. 微内核设计:windows、solaris,微内核的设计能真正意义上实现线程模型,每种功能使用一个单独的子系统实现。 linux的特点: 1. 支持模块,linux将支持的功能做成模块 内核模块 只能被内核调用,称为内核对象 .ko (kernel object)内核对象 2. 支持模块的动态装载、卸载 模块化的设计使得内核不会变得过于庞大,需要的时候装载模块,不需要的时候卸载模块。 组成部分: 核心文件:/boot/vmlinuz-VERSION-release (内核也被做成rpm包,release为rpm包的release号) 模块文件:/lib/modules/Version-Release/kernel/.... /lib/modeles下的文件(目录)名与内核版本号和发行号保持严格一致。 虚根(微型的根文件系统) 内核借助它来驱动硬盘上的文件系统,这个微型的根文件系统是在操作系统安装时生成的(安装程序时一定能够识别硬盘类型的),里面记录了这个操作系统上文件系统的驱动,这使得内核能够加载根文件系统上的模块,从而启动起来 ramdisk(辅助工具,虚根)是基于内存的磁盘,本地回环设备文件,将文件当做磁盘来使用,在系统启动时直接被装入内存,在内存中把一段空间当做磁盘使用,从而使得内核能够加载到根,能运行根上的应用程序,能装载根上的群东程序。 为了避免内核意为加载到虚根后完成任务,因此还需要做根切换 /boot/initrd-Version-release.img CentOS5中ramdisk模拟成硬盘 /boot/initramfs-Version-release.img CentOS 6/7中模拟成文件系统,可以提高存储效率 Tips:硬盘驱动是硬件层次的识别,如插入设备后BIOS会进行扫描,在BOOT选项中可以看到 CentOS系统启动流程(X86平台) POST加电自检: ROM芯片:CMOS固化程序,CMOS中科做一些设定 CMOS中的设定叫做BIOS,(Basic Input and outpout system) 用于设定硬件之间的协作方式,启动硬件哪些功能,这些程序需要CPU才能运行(执行) 内存是由ROM和RAM构成,32位编址,ROM先进行编址,再编址RAM,CPU加电就你能够完成自举,即去固定的地址空间加载一段程序,这个地址空间就是ROM提供的,从而完成加电自检,自检完成后出现BIOS界面(不选择就不会进入BIOS界面) BIOS会通过设定好的BOOT Sequence(引导顺序)加载对应磁盘上的MBR中的bootloader,只要在按顺序查找的任何一个设备可被引导,无论是否能加载操作系统,都不会去找下一个设备。 按boot sequence查找可引导的设备,第一个有引导程序的设备即为本次启动的设备。 boot loader:引导加载器(一段程序),任何操作系统安装时提供并安装的。 windows的boot loader为NTloader linux:linux loader(LILO 较老) 不支持1024柱面后的分区,在移动设备上使用广泛 GRUB(Grand unifrom bootloader)统一引导加载器 GUB2(是完全重写的,二者不是同一个东西),常用的版本为0.97版的一代G boot loader 找到操作系统所在磁盘分区,将内核加载至内存中,并且将控制权常常移交给内核程序 boot loader放在MBR中的前446bytes中,接下来的64字节为磁盘分区表,每16字节表示一个分区,最后的两字节表示bootloader是否有效 MBR位于0盘面、0磁道、0扇区 bootloader是安装操作系统的时候安装的,手动也可以安装,只要存在分区,MBR中的64bytes分区表一定在使用,但bootloader不一定被使用。 bootloader会提供一个菜单,允许用户选择要启动的操作系统内核的版本,当内核装载至指定的内存空间内自解压,展开后硬件的控制权限交给内核。 GRUB分为两个阶段: 第一阶段是放在boot loader中的,(1st stage)的主要作用是找到硬盘上的第二阶段 第二阶段位于硬盘上,(2nd stage),于是GRUB的菜单就变得非常漂亮,功能也变得完善。 GRUB还有一个1.5阶段,是帮助GRUB识别文件系统的 /boot/grub 许多1.5*文件,都是各类型的文件系统,是为了让第一阶基于这些内容去识别第二阶段,文件系统也叫驱动,但这些文件系统放在分区上,因此,这也是操作系统安装时就设定好的,将安装时选用的文件系统对应的1.5*驱动放在MBR随后的一段空间上,这里存放的一定是能驱动文件系统的驱动文件,从而使得GRUB进入第二阶段 kernel:大多数的内核是自解压的,展开后进行初始化 内核接管后会探测各硬件,如有驱动就安装驱动,挂载根文件系统并启动init,当没有硬件驱动时,使用基本的驱动访问或不加载驱动 内核的初始化: 探测可识别的硬件设备,架子啊硬件驱动程序,有可能会借助ramdisk加载驱动。 以只读的方式挂载根文件系统,运行用户空间的第一个应用程序/sbin/init init程序的类型: sysv风格:init centos5:以脚本的方式运行启动程序,效率很低,且服务启动有先后顺序,不能够并行运行。 upstart:由Ubuntu研发,不用等前一个服务完全启动,差不多一并行的方式进行,通过内核间的一种通信方式来实现,启动的任然是脚本,在CentOS上使用init命名,以service进行服务的管理。 systemd:无需脚本来启动,systemd本身就是一个强大的解释器,需要借助其他程序来启动服务,自身就能够完成加载并提交给内核,不需要bash参与。只要暂时用不到的服务在启动时不启动,但会告诉内核所有的服务都启动了,当用户第一次访问到该服务时才会将该服务启动,这使得开机可以完成秒级启动。 CentOS7上 systemd保留了原名,由systemctl进行服务的管理 内核的特性之一:使用缓冲和缓存来加速对磁盘上文件的访问 ramdisk: initrd加载仅内存后将该段内存当做磁盘使用,但是内核会认为任何磁盘的性能都比较慢,会将数据先加载到内核的缓冲区,因此,本身就处于内存中的数据还要缓存一次,因此,使用ramdisk的方式较慢。 ramfs:initramfs装载进内存后,被内核识别为文件系统,文件系统自身能完成缓冲和缓存的管理。 initrd/initramfs 是由操作系统安装后根据用户的实际环境动态生成的,动态生成需要工具。 CentOS 5 initrd 工具程序 mkinitrd(脚本) CentOS 6 initramfs 工具程序 dracut centos5 上 initrd 配置文件在/etc/inittab centos6 兼容/etc/inittab,/etc/init/*.conf upstart程序的配置文件,启动服务时可以通过写入配置文件来实现,但是在CentOS上依然采取了/etc/init.d/*.sh的方式来完成服务的启动,因此启动的速度提升不明显。 centos7 system配置文件存放目录 /usr/lib/systemd/system /etc/systemd/system 内核一旦装载并运行init程序,接下来的工作都由init完成,内核在启动过程中完成。 系统的初始化: POST-->BOOTsequence(BIOS)-->BootLoader(MBR)-->kernel(ramdisk)-->rootfs(只读)-->init 基础笔记综合整理 2018-10-09 评论 1629 次浏览
13-linux基础-磁盘管理 磁盘管理: 对于主机来说并不是CPU越多越好,因为CPU之间的协调是需要消耗资源的,且内存是CPU数量多时极容易产生问题的地方,CPU需要锁定整个内存,对内存进行操作。 •服务器的IO设备: 硬盘提供持久存储 网络接口:设备 •外部存储是一种额外设备 •CPU控制器只是负责收发指令 •CPU运算器负责运算 •内核管理协调硬件工作,并将底层硬件功能以系统调用的形式向上层提供,为了开发者方便调用这些系统调用,一些组织再一次将系统调用的功能整合,以库调用(API应用程序接口)的形式提供给开发人员使用。 •在早期,输入设备是通过批处理的方式检测触发,浪费大量的CPU运算能力,称为忙等待。 •每一个硬件设备在主机启动后在硬件层都有一个IO端口的概念,IO端口是靠16进制的二进制数字进行定义,65536个每一个硬件设备对应某个或某些个端口,CPU上某个空间中保存了硬件设备的注册端口,当某个硬件设备上有数据产生时,硬件尝试触发CPU,发生一个IO请求,有内核判断 •每一个设备会在CPU上注册中断信号(可编程终端控制器),可编程终端控制器上的每一个针脚可供一个设备抢占使用,针脚不够就需要复用(线路复用) •I/O ports:I/O设备地址,是在硬件层次上实现的。 •linux下一切皆文件,所有的设别都识别为文件,大大方便了设备的操作,对文件来说,主要有open(),read(),write(),close()操作,整个流程会简洁许多。 •设备文件:关联至一个设备的驱程序,进而能够跟与之对应的硬件设备通信。 •设备号码: 主设备号:major number标识设备类型 次设备号:minor number标识同一类型的不同设备 •设备文件中只有元数据,没有数据。 •区分不同的驱动程序是依靠硬盘内置的工作电气特性实现的 •不同的设备之间需要完成数据的交换,我们需要将二者的传输信息统一为一种标准,线缆就是用于不同设备之间的数据交换的,由控制器(内置)进行数据转换。 •插在插槽上、接口上的称为适配器 •整合在主板上(内置的)称为控制器 硬盘在系统中的识别: IDE接口:hd[a-z] SATA|USB|SCSI等接口:sd[a-z] 磁盘的常见接口: SATA 6Gbps 500MB/s SCSI 320MB/s SAS 500MB/s PEI-e 1GB/s 光纤通道接口为外部设备接口,并非是直接接在硬盘上 3.5英寸、2.5英寸为硬盘厚度的斜角 •西数的产品依靠颜色分类,根据服务器的需求购买 •硬盘连接线的规格会影响硬盘的性能 •缓存是硬盘控制器的内存芯片,内部存储和接口的缓存,缓存越大效率越高。 扇区是磁盘上最小的存储单位:512bytes 寻道时间:磁头读取数据时从一个地方移动到另一个地方花费的时间,也是物理磁盘的瓶颈。 •通过动态的调整马达的转速使内外磁道上读取的数据时间一致(线速度相同)。 •磁盘的主控芯片中存放了磁盘的物理结构信息 •硬盘厂商生产硬盘的时候,会为每一块硬盘设置磁道、扇区(低级格式化) 分区: •分区是为了方便管理,对磁盘进行分区,以创建多个不同文件系统。 •格式化:写入文件系统(高级格式化),附带清空数据 将分区中的扇区整合为Block,再将block划分到组中,一个分区中有多少个块组。 块组中有:super block、GDT、inode bitmap,block bitmap、inode table、data block •硬盘上的第0个分区不属于任何操作系统,不属于任何分区,叫MBR(主引导记录) 446 bytes boot loader 引导加载器,写入引导程序,用于引导操作系统 64 bytes 分区表(partition table) 每16bytes标记一个分区,因此最多只能有4个(主分区+扩展分区) 扩展分区最多只能有一个 2 bytes MBR的有效标记符,5A或者55AAH,用于表示前500字节有效 MBR无法识别2.1T以上的硬盘 所有的硬盘都是兼容MBR的GPT上游MBR只是没有启用 •文件系统结构 表示层:文件 逻辑层:文件系统(ext2、ext3、ext4....) 物理层:Block •硬盘的系统结构 表示层:文件系统的类型(块、块组) 逻辑层:分区 物理层:扇区 UEFI:用于操作系统自动从预启动的操作环境加载到另一种操作系统上,比传统的Legacy更优秀 GPT:一种基于EFI(可扩展固件接口)使用的磁盘分区架构,比MBR更优秀。 •/dev/disk/byuuid/UUID指向硬件设备的连接 MBR分区表管理命令:fdisk fdisk:对于硬件来说,最多只能管理15个分区 Tips:不要对正在使用的磁盘进行操作!! ~]#fdisk -l #列出主机上的所有磁盘分区信息 ~]#fdisk -l /dev/[sh]d[a-z]# #列出指定磁盘的分区信息 •boot列为"*"表示为可引导设备 ~]#fdisk /dev/[sh]d[a-z]# #进入交互式分取界面 p print显示已有分区 n new创建新分区 d delete 删除分区 w write 保存并退出 q quit 放弃更新并退出 m 获取帮助 l 列出所有分区ID t 调整指定分区ID •新创建分区其实位置默认即可,default 1 表示默认从第一个可用的扇区开始 当我们分区完成并保存后fdisk -l可以看已经划好的分区是否识别 ~]#cat /proc/partition #查看是否被内核识别,内核未识别时不能进一步操作。 •通知内核重新读取磁盘分区表 ~]#partx -a /dev/[sh]d[a-z] #通知内容读取指定设备的分区表信息 ~]#partx -n M:N /dev/[sh]d[a-z] #通知内核读取指定设备的M-N分区编号的分区表信息 ~]#kpartx -a /dev/[sh]d[a-z] #从硬盘分区表重读信息 -f (force)强制 •内核一旦识别分区,就能够在分区上创建文件系统了,创建好文件系统便能够实现挂载 •分区时,正处于挂载的设备不能立即写入磁盘上的MBR分区表 先卸载设备:umount device/mount_point ~]#partprobe DEVICE #将分区表信息强制写入磁盘 重启也可使分区表信息写入磁盘 格式化: ~]#mkfs -t FILETYPE DEVICE(partiton) ~]#mkfs.*(*为文件系统类型) DEVICE(分区) ~}#mke2fs -t [ext2,3,4] -b[1024/2048/4096] -I [128/256] Device -t 文件系统类型 -b 指定block大小 -I 指定inode大小 -i 指定为每多少字节创建一个inode 挂载:需要有空目录作为挂载点,挂载点的命令应当见名知意,要有标志性 mount -t FilesystemType Device Mount_Point 文件系统查看: ~]#df -ahTP #显示已挂载的文件系统信息 -a 显示所有文件系统(包含特殊文件系统) -h 以常见单位显示 -T 显示文件系统类型 -P 将内容放到一行显示,避免grep等文本处理工具切取出错,无法正确匹配 ~]#fsck -y Partition #自动修复出现问题的文件系统(分区上的文件系统) ~]#dumpe2fs -h Partition #查看指定分区的文件系统的详细信息 显示:卷标,挂载点,UUID,挂载参数,文件系统状态 inode总量/空闲,block总量/空闲,单个block大小等等 GPT分区表parted、sfdisk LBA逻辑区块(和扇区概念一样) 逻辑区块从第0个开始 •MBR 扇区1 扇区2 扇区3 •GPT LBA(逻辑区块)0 LBA1 LBA2 •GPT是从MBR后面开始的,GPT是为了突破MBR的存储容量限制,但占用了比MBR大的磁盘空间 •GPT又叫GUID,最大识别18EB扇区,9.4ZB •GPT每个分区所需要记录大小和范围需要128byte进行记录 ~]#parted -l #查看gpt分区信息 ~]#parted Device #gpt格式分区交互命令 mklabel gpt #将硬盘分区格式转换为GPT mklabel msdos #修改分区表为MBR print #打印分区列表 mkpart #分区命令 分区名 文件系统类型 起始点 第一次分区为第一个可用的LBA 结束点 给分区划分的容量大小 •第N个分区的起始点为上一个分区的结束点(容量) •结束点为之前分区的总和加上当前分区的容量 rm 分区号 删除指定分区(立即生效) (分区号在划分分区时由系统自定义的) rescue 误操作分区时对磁盘进行恢复 quit 退出 •GPT分区是即时生效的,mkpart分区时需要人为指定在哪个位置结束 •gpt分区的格式化同mbr分区 swap交换分区: fdisk 创建分区,并将类型设备82(ID) ~]#mkswap Device #格式化指定的设备 ~]#swapon Device #挂载指定设备 ~]#swapoff Device #卸载指定设备 ~]#swapon -a #激活所有swap分区 ~]#swapon -p NUM Device #指定swap的优先级,在不同硬盘上穿件交换分区,性能较好的指定较高的优先级 •永久挂载需要写入配置文件:/etc/fstab 查看内存的使用状态 ~]#free -m #以M为单位查看内存的使用状态 buffers 缓冲 cache 缓存 •缓冲和缓存是为了协调组建之间的差异使用的 LVM2 Logical Volume Manager,Version2 lvm2是linux环境下对磁盘分区管理的一种机制 目的:实现动态调整分区的大小 dm:device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块 LV 可动态扩展不损坏数据 对于LV来讲LE为单元大小,逻辑盘区 VG PE:phsical extent 物理盘区,VG的存储单元,默认大小为4MB VG(卷组):能够将底层提供的存储能力整合起来,PE是在VG上定义的,新加入的PV的PE无法指定,跟随VG的设定 PV 底层的硬件设备 设备文件: /dev/mapper/VG_NAME-LV_NAME /dev/VG_NAME/LV_NAME •被软链接到/dev/dm# pv管理工具: ~]#pvcreate 创建pv ~]#pvs 查看pv信息 ~]#pvscan 查看pv信息 ~]#pvdisplay 查看pv详细信息 ~]#pvremove 移除pv(物理卷) vg(卷组管理工具) ~]#vgs 查看pv信息 ~]#vgscan 查看pv信息 ~]#vgdisplay 查看pv信息 ~]#vgcreate -s # VG_NAME pv(物理卷,使用多个物理卷用空格隔开) -s 指定PE的大小,默认为4M VG_NAME为卷组名,可以自定义,一般应做到见名知意 ~]#vgextent VG_NAME PV_Device #将pv加入已存在的VG中 ~]#vgreduce VG_NAME PV_Device #将指定的PV从VG中移除 •pv移除时一定要先将pv中的数据移动到其他PV上,且其他pv能够容纳转移的数据 ~]pvmove pv_device #将pv上的数据迁移到其它正在使用的pv上 ~]#vgreduce -a #移除卷组中的空pv ~]#vgremove VG_NAME #删除卷组 ~]#vgrename OldName NewName #修改VG的名称 lv(逻辑卷管理工具) ~]#lvcreate -L 10G -n LV_NAME VGNAME #在指定的VG上创建PV -l(小) 100%free #使用整个VG创建LV •逻辑卷的大小需在卷组的大小范围内 •我们所指定的空间大小是否精确,取决于所指定的大小是否能够被PE整除 ~]#lvs #查看逻辑卷信息 ~]#lvscan #查看逻辑卷的详细信息 ~]#lvdisplay #查看逻辑卷的详细信息 ~]#lvrename OldName NewName #修改LV的名称 逻辑卷扩容:支持在线扩展 ~]#lvextent -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME #扩展指定的逻辑卷 -L +# 增加多少 -L # 增加至多少 -l(小) +100%free 扩展余下的所有空间 •逻辑卷支持在线扩展,但是扩展的只是逻辑边界,文件系统并没有扩展 ext系列文件系统扩展 ~]#resize2fs /dev/VG_NAME/LV_NAME # 不指定大小则使用分区上的所有空间 •逻辑卷属于软件层面,如果损坏,数据很难恢复 缩减逻辑卷:缩减不允许联机进行,并且需要对数据进行备份 备份逻辑卷上的数据 卸载逻辑卷 强制检测文件系统 ~]#e2fskc -f /dev/VG_NAME/LV_NAME #强制检测文件系统 ~]#resize2fs /dev/VG_NAME/LV_NAME NewSize #缩减文件系统,注意数据的大小 ~]#lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME #缩减逻辑卷边界,比文件系统略大 -L -# 减少# -L # 减少到# •缩减完成后重新挂载即可,不建议对文件系统进行缩减操作 快照:snapshot,保存某一刻的数据 快照是通过快照卷来实现的,刚创建时没有任何数据 快照其实就是指向源卷的另一个路径,保存的是源卷某一个时刻的数据状态,当某一数据发生改变的那一刻,快照卷才将被修改前的数据复制到快照卷中,没有发生改变的数据依然指向源卷 因此,快照卷的体积很小,比直接备份磁盘快得多,且数据为同一时刻数据,快照卷的大小取决于我们要将快照存放的时间。我们通过这个接口去备份就保证了数据同一时刻。需要配合增量备份使用,差异备份等,备份结束后删除快照。 •快照卷一定是现有某个卷的快照,不能够跨分区,快照卷通常是只读的,如果能够修改则失去了快照卷的意义。 ~]#lvcreate -L #[mMgGtT] -p r -s -n Snapshot_Name /dev/VG_NAME/LV_NAME #创建快照卷 -L 指定大小 -p 指定权限 -s 指明创建快照卷 -n 指定快照卷的名称 •对原卷创建快照卷,且为只读 •挂载到指定位置就可以进行备份了(快照卷是否需要格式化) •当备份完成后卸载并移除快照卷 ~]#umount Mount_point #卸载指定的快照卷 ~]#lvremove /dev/VG_NAME/SnapShot_name #删除指定的逻辑卷 btrfs文件系统,GPL授权 b-tree filesystem支持写时复制的功能 用于取代ext3/4文件系统但是在CentOS7上采用了xfs ext3/4是实际使用中的标准。 b-tree文件系统直接支持快照,还可以对快照进行快照,相当于增量备份 b-tree内置RAID功能,即在文件系统底层直接支持RAID 核心特性: 1. 多物理卷支持,一个文件系统由多个物理卷组成,支持RAID,联机添加、删除、修改 2. 写时复制(COW):复制时更新替换指针(指向磁盘块的地址) copy on write:对文件进行写入操作时,现将文件复制一份,并将原指针指向新的数据块位置,这样就算是修改错误也可以回滚操作。 3. 数据与元数据校验码,checksum,极大的保证了数据的可靠性 4. 支持子卷:subvolume(btrfs可直接挂载使用,也可在其上创建子卷) 5. 快照:支持快照的快照(增量备份) 6. 透明压缩机制,数据保存时压缩保存,读取是自动解压缩,但是会消耗CPU时钟周期 btrfs: mkfs.btrfs [option] DEVICE #将指定的设备格式化为btrfs格式的文件系统 -L "LABLE" 指定标签 -d 指定数据存储的类型:RAID{0,1,5,6,10,single} -m 指定元数据类型:RAID{0,1,5,6,10,single(只保单份)},dup复制 -O 指定在格式化时就要启动的文件系统特性 -O list all 列出所有支持的feature(根据发行版的不同选择) ~]#btrfs filesystem show Device(可以为多个设备) #当这个磁盘属于btrfs时会显示对应的btrfs的全局信息 show 显示信息 sync 同步数据 df 查看btrfs的使用情况 defragment 磁盘碎片整理,消除磁盘碎片 lable 指定或显示卷标 •创建好btrfs文件系统后,挂载时指定任一设备都可以 ~]#mount -t btrfs Device Mount_Point #挂载指定的btrfs文件系统 btrfs文件系统中,文件被压缩存放,用户是意识不到的 ~]#btrfs filesystem resize [+|-]#[MGT] btrfs_name(需要已挂载) #单位:M、G、T +# 扩展文件系统 -# 缩减文件系统 max 更改逻辑边界至最大物理边界 ~]#btrfs device add|delete|scan Device [Mount_Point] •当加入新的磁盘至btrfs时,硬盘上此前的数据是不会加入进来的,新加入的磁盘只能分担其他硬盘的存储压力 •btrfs 移除硬盘时会自动将数据迁移到其他设备 ~]#btrfs device delete Device Mount_Point #从挂载点中移除指定的设备 ~]#btrfs balance start Mount_Point #均衡存储,使用很少,会消耗大量的资源 start 开始 pause 暂停 resume 继续 status 状态 •在数据量很大的情况下不建议做均衡存储,会占用大量的资源 修改对应数据RAID级别机制,在文件系统运行过程中可以修改 Tips:修改对应级别的RAID需要底层硬盘数量的支持 ~]#btrfs balance start -mconvert=raid[0,1,5,10..] Mount_Point #修改对应元数据raid级别 ~]#btrfs balance start -dconvert=raid[0,1,5,10...] Mount_Point #修改对应数据raid级别 raid0 至少两块磁盘 raid1 至少两块磁盘 raid5 至少三块磁盘 raid10 至少四块磁盘 single 至少一块磁盘(?猜测) btrfs文件系统上传建子卷 子卷挂载时需要单独挂载的话,需要指明subvol子卷名称,或以subvol id的方式挂载 ~]#btrfs subvolume list Mount_Point #列出指定btrfs挂载点上的所有子卷 ~]#btrfs subvolume create /btrfs_name/new_subvol #创建子卷 ~]#btrfs subvolume show #显示子卷信息 •在挂载时,如果挂载的是顶级卷(父卷),所有的子卷会自动挂载,子卷单独挂载时,父卷是不可以访问的,安装操作系统时,可以单独挂载子卷 ~]#btrfs subvolume delete /Mount_Point/subvalu_name #删除指定btrfs的子卷 ~]#btrfs subvolume snapshot /Mount_Point/subvalu_name /Mount_Point/shot_name 对子卷创建快照,快照必须要与原卷在同一个父卷中 •对文件进行快照 cp --reflink filename file.snap #对文件创建快照 将ext4转换成btrfs 卸载exit文件系统 ~]#fsck -f Device #强制检查文件系统 ~]#btrfs-convert Device #将exit文件系统无损转成btrfs ~]#btrfs filesystem show #显示btrfs文件系统 从btrfs回滚到ext4文 ~]#btrfs-convert -r Device #从btrfs文件系统回滚到ext4文件系统 软RAID,生产环境中一定是采用硬件RAID Redundant Array of Independent Disks 独立冗余磁盘阵列 RAID技术是将磁盘按照一定的形式组织起来当做一块硬盘使用的技术 •提高I/O能力 •提高耐用性 RAID的实现方式 •外接式磁盘控制器 •内接式RAID,主板集成 •软件形式实现 RAID有不同的组织形式,在此称之为级别,每一级别表示其硬盘的组织形式不同 硬件RAID的配置接口在BIOS中实现 RAID控制器上有内存时,需要检查该RAID是否有供电配置,防止断电数据尚未完全写入磁盘导致数据丢失 RAID0:条带存储 在控制器的指挥下,先将数据切割成chunk,平均分配到组成RAID0的磁盘上 控制器的能力是有限的,分割、组合数据需要时间,因此不能够无线扩展 •读写性能提高 •空间利用率100% •磁盘的大小需要一致(至少两块磁盘) •无冗余能力(即损坏会造成数据丢失) RAID1:镜像存储 •读性能提升 •写性能略有下降 •磁盘利用率为50% •磁盘的大小需要一致 •有冗余能力(允许损坏整个对称区域的磁盘,但不能两边同时损坏) •至少需要两块磁盘,添加硬盘时需要成对的添加 RAID5:带校验位的条带存储 每块磁盘轮流作为校验盘的机制,使得每块磁盘都均衡的分担读写,提高了可用性。 •读写性能提升 •磁盘的利用率为(n-1)/n •拥有冗余能力,允许损坏一块磁盘 •至少需要三块磁盘,需要大小一致 RAID10:组合式存储 先组建RAID1,再使用RAID组建RAID0 •读写性能提升 •磁盘的利用率为50% •拥有冗余能力,允许每组RAID1阵列中损坏整个镜像区域 •至少需要四块硬盘 RAID6:在RAID5的形式上再加一次校验,允许损坏两块磁盘 RAID7:私有技术,读写性能很好,价格很高。 JBOD(Just a Bunch of disks) 将多个硬盘的空间合并成一个大的连续空间使用 •常用的级别:RAID0、RAID1、RAID5、RAID10、JBOD、RAID50(损坏几率更大) CentOS6上使用软件RAID的形式实现RAID过程: 首先软RAID是没有什么使用价值的,占用了CPU的消耗 mdadm模式化工具语法格式: ~]#mdadm [mode] Raid_Device options Component_Device [mode] 模式 -C 创建模式 -n # 指定使用几块设备来创建此RAID -l # 指明要创建目标RAID的级别(磁盘的不同组织形式) -a [yes|no] 是否自动创建目标RAID设备的设备文件 -c # 指明chunk size的大小 -x # 指明空闲盘的个数(热备) -A 装配 -F 监控 -f,-r,-a 管理 Raid_Device: 指定md设备文件名:/dev/md#...开机后可能会发生变化,但可以使用其他方式进行固化 Component_Device: 指定组建RAID的设备,可以是任何一个块设备(磁盘或分区) ~]#mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5 /dev/sd{2,3,4,5} #指定设备创建RAID ~]#mdadm -D /dev/md0 #查看指定RAID的详细信息 ~]#mdadm /dev/md0 -f /dev/sdb #将sdb磁盘标记为损坏,查看热备磁盘是否接替工作 ~]#watch $(cat /proc/mdstat) #以指定的时间刷新查看文件内容 ~]#watch -n 1 $(cat /proc/mdstat) #动态查看文件的变化,每一秒刷新一次 -n 1 指定为每一秒刷新一次 管理模式: ~]#mdadm /dev/md0 -r /dev/sdb #将sdb从md0中移除 -a 添加磁盘 -f 标记磁盘为损坏 停止md设备: ~]#mdadm -S /dev/md# •RAID不能够代替备份,防止人为的损坏(删除) 该有的策略一个都不能少 md设备的启动 ~]#mdadm -E Device #查看指定的设备上是否有RAID整列信息 ~]#mdadm -A /dev/md# Device1 Device2..... #重新组建RAID,名称可自己指定 •删除mdadm设备需要先卸载mdadm设备 •停止mdadm设备 •~]#mdadm --zero-superblock Device1 Device2.... #删除mdadm设备 linux上的文件系统管理 文件系统实现按名存取 linux上的文件系统:ext2/ext3/etx4/xfs/btrfs/reiserfs/jfs/swap.... btrfs文件系统支持LVM功能,在CentOS7上实现,自身就能实现快照,比LVM更底层,性能优于LVM swap对于数据库应用来讲,放到硬盘上性能会急剧下降,因此数据库服务器应当将swap设小一些,对于hadoop科学计算批处理系统系统来讲,内存的使用率不高,性能要求不高,因此交换分区可以大一些,但是在linux操作系统上,内存空间使用完毕才会使用swap交换分区。 •光盘文件系统:iso9660 •windows:fat32/ntfs/ fat32为vfat类型 •unix:FFS/UFS/JFS2 •网络文件系统:NFS、CIFS(windows网上令居共享,只能共享目录) •集群文件系统:红帽的GFS2、Oracle的OCFS2 •分布式文件系统:ceph moosefs、mogilefs、Glusterfs(?) 根据是否支持journal(日志)功能分类 日志型:ext3、ext4、xfs、btrfs 非日志型:ext2、fat32 •日志型文件系统会有额外的I/O操作 在磁盘上单独的区域(日志区)写入时,先将inode信息写入日志区,数据存放结束后再将inode信息放入数据区,这对于大量小文件的场景占用大量I/O •当分区完成后需要对分区写入文件系统:高级格式化 文件系统的组成部分: 内核中的模块:ext4/xfs/btrfs/fat.... 用户空间的管理工具:mkfs.ext4/mkfs.xfs/mkfs.vfat.... •linux的虚拟文件系统:VFS,显示噶很难过提供统一的文件系统接口,抹除底层的差异,统一标准。 创建文件系统的前提: 1. 内核上有文件系统模块 2. 用户空间由磁盘管理工具 ~]#cat /proc/filesystems #查看内核支持的文件系统类型 ~]#lsmod #查看内核已经加载的所有模块 •文件系统的位数很重要,它决定了单个文件的支持上限,xfs、btrfs了理论上没有上限 ~]#blkid DevicePartition #显示一个分区的属性信息 UUID全局唯一 标识符,防止重启后硬盘的识别顺序发生变化 ~]#blkid -U UUID #查看指定UUID对应的设备、分区 ~]#bllkid -L "LABEL" #使用卷标调用分区 ~]#mkfs -t FS_TYPE -L "LABLE" Device #格式化指定分区、设备,并赋予卷标,可用卷标调用分区 -f 强制 ext系列专用管理工具: ~]#mke2fs [option] Device #格式化指定设备、分区 -L "LABEL" #指定标签 -i NUM #指定元数据区和数据区的比例,为数据空间中每多少字节创建一个inode,不应小于block块大小,否则一定有浪费 -N NUM #指定为数据空间创建多少个inode -m NUM #为管理员预留的空间占用百分比,默认为5%,用于磁盘占满操作文件 -O [feature特性] #启用指定特性 -O [^feature] #关闭文件系统特性 ~]#e2lable Device #查看指定分区、设备的label ~]#e2lable Device LABLE #给指定ext系列文件系统设定卷标 重新设定ext系列文件系统的可调参数值 ~]#tune2fs [option] Device #调整ext系列文件系统的可调参数 -l(小) 查看指定文件系统的超级块信息(super block) •为了方便管理,在写入文件系统的时候,将磁盘分区划分成N个大小一样的组(block group),每一个块组中拥有相同的磁盘块,超级块存放的是磁盘的全局信息 -L "LABLE" 修改卷标 -m NUM 修改预留给管理员管理空间的百分比,默认为5% -j NUM 将ext2升级为ext3 -O [feature特性] 文件系统特性的启用或禁用"^",特性与是否挂载无关 -o 调整文件系统的默认挂载选项,^为取消 文件系统检测: ~]#fsck.FS_TYPE DEVICE #检查指定分区上的指定文件系统 -f 强制检查 •一个文件系统的 访问必须从根开始,kernel是内核上装载的第一个程序,这只是一个通用的管理程序,并不能完成具体的工作,需要调用程序来实现功能,内核回去装载根文件系统所在的分区(rootfs),rootfs中应当包含的目录 /etc、/bin、/sbin、/lib、/lib64、/proc、/sys、/dev kernel启动的第一步就是去识别rootfs(根分区),rootfs和kernel看可以不在一个分区,kernel应当能够识别rootfs,一旦rootfs拂去成功,就能够立即装载init程序,有init来完成所有和用户相关的程序启动,完成系统的初始化。 ~]#pstree #进程树查看到的所有进程都是init进程的子进程 文件系统的挂载: 挂载:将文件系统与根文件系统下的空目录关联起来,进而使得此目录作为文件系统的入口的行为成为挂载。 卸载:将文件系统与根文件系统下的空目录接触联系关系,指明挂载点或设备均可 •如果挂载点下有文件,挂载文件系统后原目录下文件无法被访问,需卸载后才能恢复访问。 ~]#mount #显示当前系统上所有已挂载的设备 ~]#mount [option] Device Mount_Point #挂载指定设备至指定的挂载点(空目录) -t vfstype #指明挂载设备上的文件类型,不指明会调用blkid查看 -r #(read only)只读挂载 -w #(read & write)读写挂载 -a #读取/etc/fstab文件,并将其中未挂载的条目挂载 -n #挂载时不更新/etc/mtab文件,/etc/mtab文件最终系统上所有的挂载和卸载 -L "LABLE" #以卷标的形式挂载 -U "UUID" #以UUID挂载设备 -B #挂载目录至另一个目录,即绑定到另一个目录上 ~]#mount [-o option] #-o选项的子选项 -o #指明挂载文件系统的选项,指定文件系统挂载时的特性 async 异步模式,大多数磁盘采用此种模式,采用了copy on write(写时复制)的机制,一段被多人使用的程序,在修改前调用CPU复制一份,只对复制的这份进行操作(于内存中完成),应及时回存硬盘 sync 同步模式,只要有写操作就回存硬盘,性能很差,但是数据可靠性高 atime 每一次访问文件时,访问时间修改(默认),对目录和文件都生效 noatime 访问文件时不修改访问时间,以减少磁盘的I/O,对目录和文件都生效 •对于访问量非常大的文件系统来说,关闭访问时间的记录可以提高效率 diratime 访问目录是修改目录的访时间戳,只对目录有效 nodiratime 访问目录是不修改目录的访问时间, auto 支持自动挂载 noauto 不支持自动挂载 exec 允许指定文件系统上的应用程序运行为进程 noexec 不允许指定文件系统上的应用程序运行为进程 dev 支持在此文件系统上使用设备文件 nodev 不支持在此文件系统上使用设备文件 suid 允许特殊权限 nosuid 不允许特殊权限 remount 重新挂载 ro 只读挂载 rw 读写挂载 user 允许普通用户挂载,默认只有管理员才能挂载设备,设备管理是特权 nouser 不允许普通用户挂载设备 acl 是否启用文件系统上的ACL功能,访问控制列表 •CentOS6默认不开启acl •CentOS7默认启动ACL •多个选项之间使用逗号分隔 ~]#mount -o default,rw,suid,dev,exec,auto,nouser,asnyc,nodiratime...... 卸载命令: ~]#umount Device #卸载时指定设备文件 ~]#umount Mount_Point #卸载时指定挂载点 •当有进程在使用设备时,设备时无法卸载的,一定要确认是谁在使用设备干什么 ~]#cat /proc/mounts #查看内核中已挂载的设备 ~]#fuser -v(小) Mount_Point #查谁在访问挂载点 ~]#fuser -km Mount_Point #将正在访问指定挂载点的进程结束,只有管理员才有权限 /etc/fstab文件使用方法: ①需要挂载的设备或者伪文件系统,可以使用LACLE、UUID、centos7中使用UUID=''挂载 ②挂载点,swap的挂载点为swap,文件系统类型为swap ③文件系统的类型:filesystem,ext2,ext3,ext4... ④挂载选项,default或跟上其他选项(default中包含auto自动挂载) ⑤转储频率(备份频率),0:不做转储,1:每天转储,2:每隔一天转储(一般为0,不开启) ⑥自检次序:开机后文件系统的自检顺序,0:不自检,1:先自检(一般只有rootfs才开启1) ext文件系统结构: superblock、GPT、inode table、block bitmap、inode bitmap、dateblock ~]#dumpe2fs Partition #显示文件系统超级块中的信息和组描述信息 ~]#tune2fs -l Partition #显示超级块信息 •checksum为校验和,用于检测数据完整性,checksum与数据比对不一致时认为数据不可靠。 •inode(index node) 索引节点 •inode number(inode号) •地址指针决定了单个文件的大小 直接指针 间接指针 三级指针 •位图索引(二级索引),每一位对应一个inode或block inode bitmap #对位标识的inode是否使用 block bitmap #对位标识的block是否使用 位图索引、superblock、GPT等存在于每个块组中。每个块组中分为数据区和元数据区 •如果使用dumpe2fs DEVICE看到块组中的block块段落过多(不连续的块),就是出现磁盘碎片了。 •目录是路径的映射,只是一张表,目录中存放的是目录中直接能够找到的文件名和与其对应的inode number •将经常访问的目录缓存起来,这就是buffer和cache的意义 磁盘配额: •限制用户的磁盘使用期限,空间使用量,inode使用量。当用户超过软限制,并且磁盘配额设置了警告,则会进入倒计时,只有在剩余时间内能够使用剩余空间,倒计时结束后,不论软限制外的空间有没有剩余空间,都无法使用,并且软限制变成硬限制。 •目的:为了限制每一个用户在指定分区上的空间使用量,和inode的使用量。 当限制组的时候,是限制组内的成员一共能够使用多少空间 •磁盘配额的限制级别: 1. 软限制(警告限制):可以突破此限制。 2. 硬限制(绝对限制):不能够突破此限制。 3. 宽限天数,突破软限制后进入倒计时,如果有硬限制,则在倒计时内可以使用硬限制前的空间,倒计时结束,软限制称为硬限制。 •磁盘配额是针对分区的,需要磁盘分区能够支持。 1. 查看内核是否支持 ~]#grep "CONFIG_QUOTA" /boot/config #查看内核是否支持 2.查看是否安装了磁盘配额相关命令 ~]# rpm -q quota #查看是否安装了磁盘管理相关命令 3. 开启磁盘配额 ~]#mount #查看分区上挂载项有无(usrquota、grpquota)有则为开启 •磁盘配额默认是不开启的,需重新挂载,此处直接写入配置文件 ~]#vim /etc/fstab #编辑自动挂载配置文件 default,usrquota,grpquota #开启磁盘配额 ~]#mount -o remount Device #重新挂载设备 4. 为磁盘配额生成配置文件 ~]#quotacheck -avug #自动为开启磁盘配额的分区创建配置文件 -a 自动扫描/etc/mtab文件,记录了mount信息 -v 显示过程 -u 为用户创建配置文件 -g 为用户组创建配置文件 •必须关闭selinux才会生成,否则没有权限 5. 对用户或者组进行磁盘配额 ~]#edquota -u 用户名 #编辑指定用户的配额信息,单位为K/M/G,默认为K -g 组名 -t 宽限天数 -p 模板用户 -u 目标用户 #复制已设置好的磁盘配额给另一个用户 6. 启动磁盘配额 ~]#quotaon -avug #按照配置文件开启配额 ~]#quotaoff -avug #关闭磁盘配额 7. 查看已设置的磁盘配额 ~]#quota -gvs USERNAME #查看指定组的磁盘配额信息 ~]#quota -uvs GROUPNAME #查看指定用户的磁盘配额信息 -s 以常见单位显示 ~]#requota -ugvs Partition(开启磁盘配额的分区) #查看制定分区上限制的用户和组。 RAID,生产环境中使用硬件RAID,区分品牌和型号 RAID0 条带存储,并行写入,并行读取,没有冗余,利用率为100% RAID1 镜像存储,两个磁盘互为镜像,利用率为50%,具有冗余能力 RAID5 分布式奇偶校验的独立磁盘结构,磁盘的利用率为(n-1)/n RAID10 先组建RAID1,再将RAID组建成RAID0,磁盘利用率为50% 热备磁盘:备用磁盘,用于替换故障盘 全局热备:对所有的RAID整列生效,谁先损坏替换谁 局部热备:对某一指定的RAID阵列生效 硬盘测速: 写:~]#dd if=/dev/zero of=/tmp/a.txt bs=4096 count=25000 读:~]#dd if=/tmp/a.txt of=/dev/null bs=4096 ~]#dd if=数据来源地址 of=数据目标地址 bs=大小 count=数量 •伪设备文件 /dev/zero 吐零机,可生成无限的0 /dev/null 数据黑洞 /dev/urandom 随机字符串 ~]#cat /dev/urandom |head -5 #查看随机字符串的头部,没有尾,即无限多 •dd命令以前也用于磁盘对拷 基础笔记综合整理 2018-10-08 评论 1671 次浏览
12-linux基础-软件包的安装 linux程序包管理 API:application programing Interface 应用编程接口 程序源代码-->预处理-->编译-->汇编 ABI:Application binary Interface 应用二进制接口,这导致了不同平台程序不兼容 •wine 库级别的虚拟化,让win程序跑在linux上 •java是在API上进行统一,java程序是跑在虚拟出来的环境上(JDK),JAVA内部还包含运行环境JVM,只需要JDK的版本一致就能够将程序运行在各种平台上,为应用级开发 •系统级开发:c、c++、go •应用级开发:java、python、php •二进制程序的组成部分:二进制文件、库文件、配置文件、帮助文件 源码包: 一般由编译型语言编写而成,无法直接运行 需要先编译成二进制,源码包一般为压缩包 特性: 需要编译,非技术人员无法安装(需要人为解决依赖关系) 所有的软件包都是源码包,再有封装包(二进制) 自定义性强,可自由调整软件功能(需要技术达到一定水平) •一些源码包有安装脚本,简化安装操作 rpm包管理(安装、卸载、升级、查询) 二进制软件包的特点 专门的工具进行管理 安装简洁、速度快 经过封装,无法自定义 无法直接获取源代码 各平台的程序包管理器: Debian:deb格式软件包,使用dpt包管理器 RHEL:rpm格式软件包,使用rpm包管理器 •SUSE使用rpm包但是包 管理的形式不一样 源码包命名方式: name-version-tar.gz(为文本格式) VERSION:major-minor-relese 主版本号-次版本号-末版本号 rpm包命名的方式: name-version-arch.rpm(二进制格式) •version与源码包相同 arch:release.arch release:release.os.arch arch:表示与硬件平台无关 PPC(power PC)平台 •rpm包在制作的时候,将常用的功能和不常用的功能拆开(拆包),因此,rpm包由主包和子包组成,不常用的功能可选择性安装,但是子包依赖于主包,一般属于一个应用程序,为了适用于不同的场景。 •linux特性:一个程序只干一件事,这样就使得包与包之间存在依赖关系。 rpm包是编译好的封装包,也就是已经编译好的二进制文件打包后封装成rpm包 rpm包解压缩后是cpio类型的文件,cpio包有一个特点:从绝对路径恢复包内的文件,因此不论在上面地方安装,rpm工具都能够正确的安装。 •软件包依赖的是其他软件所提供的功能,这些功能被封装成函数的形式向外提供 •~]#ldd /COMMAND #显示指定二进制程序的所依赖的库,X0为内存中的16进制编址方式 •~]#ldconfig -p #查看已加载并缓存在内存中的库文件名称及其指向库文件路径的映射关系 ` /etc/ldso.conf中定义了库文件的位置 /etc/ld.so.conf虽然可以定义,但是一般放在/etc/ld.so.conf.d/*.conf 缓存文件:/etc/ld.so.cache ` 程序包管理: 功能:将编译好的应用程序各组成文件打包成一个或几个程序包文件,从而方便地实现程序包的安装、卸载、查询、升级、校验等管理操作 程序的组成清单(每个包独有,可通过接口查看) 文件清单、安装或卸载时运行的脚本 数据库(公共) 记录程序包名及版本、依赖关系、功能说明 安装生成的个文件路径及校验信息 CentOS程序包管理的方式: 使用包管理器:rpm rpm安装:不能自动查询软件包位置,不能自动解决依赖关系 使用前段共聚:yum、dnf yum前端工具 丰富了rpm的功能,解决了rpm包之间的依赖关系 apt-get 是deb包管理器的前端工具 zypper 是SUSE上的rpm包管理工具 dnf fedora设计的rpm包前端管理工具,在CentOS上可以实现,需要Fedora的EPEL源 yum RHEL系列的rpm包前端管理工具 获取程序包的路径: 1. 系统发行版的光盘或官方服务器CentS镜像 2. 项目的官方站点 3. 第三方组织 唯一一个靠谱的第三方源:Fedora-EPEL rpmfind.net rpm.pbone.net pkgs.org 4. 自己制作rpm包 •通过互联网下载的包要检查其合法性 来源的合法性 程序包的完整性 安装包的依赖关系 树形依赖: 1. 安装A依赖B,安装B依赖C.. 2. 安装A同时依赖多个软件 3. 安装A依赖C,但是安装B软件已经解决了依赖 环形依赖: 安装A依赖B,安装B依赖C,安装C依赖A 解决办法是软件包一起安装 •软件包依赖的是函数库文件,函数库文件是软件安装时,一并安装的,是为软件提供某些功能的,函数文件不能作为单独的程序运行,只能被别人调用。 •如果我们安装了32位的软件到64位的操作系统上,32位的软件会到/lib下查找函数库文件,但是在64位操作系统上,大多数的函数库文件放在/lib64下,因此我们需要将32位软件依赖的函数文件软链接到/lib下 ~]#ldd /path/to/COMMAND #查看指定软件依赖的函数文件 将对应的函数文件从/lib64软链接到/lib目录下即可 •静态函数:*.a 只为某一个应用程序提供服务,但会使软件的体积变大 •动态函数(公共函数):*.so 为多个应用程序提供服务,减少额外的空间占用 当安装程序时提示依赖,其函数库不存在时,可通过findrpm.net反查询哪一个包能够提供此函数。 二进制软件包的安装位置: /etc 配置文件 /usr/bin 命令存放目录(可能是其他目录) /usr/lib 函数库目录 /usr/share/doc 手册保存目录 /usr/share/man 帮助文档保存目录 安装: ~]#rpm [option] #软件的安装 -i 安装 -v 显示详细信息 -h 以hash"#"的格式来显示程序包管理的执行进度,每一个"#"代表2%的进度 --test 测试安装,并不是真正的安装,dry run模式 --nodeps 忽略依赖关系,当出现循环依赖时可以忽略,也可以同时安装 --replacepkgs 重新安装,这可能会导致新的配置文件不能使用,也可能覆盖掉配置文件 --ignoreos 忽略系统的版本,即内核的版本 --nosignature 不检查来源的合法性 --nodegest 不检查包的完整性 --noscripts 安装程序但是不执行包中的脚本 •安装前脚本 %pre --nopre •安装后脚本 %post --nopost •卸载前脚本 %preun --nopreun •卸载后脚本 %postun --nopostun --oldpackage 降级安装,使用旧版本替换掉新版本 升级: ~]#rpm -Uvh Package #安装有旧版本程序包则升级,不存在旧版本则安装 ~]#rpm -Fvh Package #如果安装有旧版本程序包则升级,如果不存在旧版本程序包则不执行升级操作 --force 强制安装(旧版本的库提示不兼容,可用次选项) •Tips: 不要对内核的版本做升级操作,linux支持多内核版本并存,因此可以直接安装新版本内核。 如果源程序包中的配置文件安装后曾被修改,升级时新版本的配置文件并不会直接覆盖老版本的配置文件,新版本的配置文件重命名为filename.rpmnew后保存 查询: ~]#rpm -qa #查询所有已安装的软件包 -q 包名 #查询包是否已安装 -f filename #查询指定文件由哪个程序包生成 --whatprovides capability(能力) #查询指定的功能由哪个包提供 --whatrequires capability #查询指定的能力被哪个包所依赖 --changelog #查看rpm包的change日志 -c 查询程序包的配置文件 -d 查询程序包生成的文档 -i 查询程序包的详细信息 -qR 查询指定程序包依赖的capability -ql 查询指定程序包安装后生成的所有文件 --scripts 显示rpm包自带的脚本片段 --provides 列出制定程序包所提供的capability ~]#rpm -qf filename #查询指定文件是由哪个软件包产生的 当误操作文件(修改)以后,反查询后进行强制安装 ~]#rpm --force -ivh 包全名 #强制安装指定的软件包 •对于未安装包的查询 ~]#rpm -qpi 包全名 #查询指定未安装包的详细信息 -p --package -qpc 查询未安装包的配置文件 -qpd 查看未安装包生成的文档 -qpl 查询未安装包安装后生成的所有文件 -qpR 查询未安装包所依赖的capability 卸载:针对的是已经安装的包 ~]#rpm -e 包名 #卸载指定的程序 --erase 卸载 --nodeps 忽略依赖 校验:检查软件包的完整性 ~]#rpm -V 包名 #查看指定服务(软件)的文件是否被修改过,一个服务对应多个文件 c 配置文件 d 普通文件 g 鬼文件ghost ~]#rpm -Vf filename #查看指定的文件是否被修改 s 文件大小改变 M 文件权限改变 5 文件的MD5校验和改变(即文件内容) D 主从设备编号改变 L 路径改变 U 属主改变 G 属组改变 T mtime改变 P capabilities(能力)改变 •软件包来源的合法性验证以及完整性验证 计算软件包的特征码并附在软件包后,使用非对称加密算法将特征码加密,公布公钥,保证软件包不被修改 对称加密:加密解密使用同一密钥 非对称加密,密码成对出现,使用其中一个加密,只能由另一个密钥解密(RSA) 公钥:public key 私钥:secret key •公钥由第三方机构来保证,或者去官方找(CentOS安装光盘自带) •完成性验证:SHA256 •来源合法性验证:RSA ~]#uname -r #查看内核的版本 证书的安装:导入公钥 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-.... #CentOS证书安装 ~]#rpm -qa |grep "gpg-pubkey" #查看证书是否成功安装 •rpm数据库位置:/var/lib/rpm,存放的是程序依赖的文件数据 •rpm数据库重建 ~]#rpm --initdb #初始化数据库,不存在则创建,存在则不创建 --rebuilddb 重建rpm数据库 前端工具:yum 也可以使用dnf(Fedora的EPEL源) yum为C/S架构,是由RedHat三次发行版yellow dog研发 yum支持很多插件但是依旧不完善 yum仓库:repository(yum repository) 仓库中存储了众多的rpm包,以及包相关的元数据文件(放置于特定目录repodata) 仓库的路径应当指向repodata目录 仓库一般是文件服务器提供服务 URL:统一资源定位 ftp://.... http://... nfs://... file://... yum客户端 配置文件:遵循将大配置文件分割成多段的管理风格 /etc/yum.conf #主配置文件,通常只提供个yum指向的公共配置 /etc/yum.repos.d/*.repo #用于配置一个或多个仓库指向,统一仓库可以存在多个,但是使用时只使用一个,不同类的仓库可以存在多个,可以同时使用 •基于yum配置文件解决了rpm不能查询软件的位置、不能自动解决依赖关系 •yum通过配置文件实现了软件的定位功能,需要人为 配置yum仓库 •yum能够通过列出的依赖关系,反向查询所有依赖软件的软件包位置 /etc/yum.repos.d/CentOS-Base.repo 网络yum源(所有软件包的存放地址,连接) /etc/yum.repos.d/CentOS-Media.repo 本地yum源(人为将挂载点填写到指定位置) •所有的源使用时只能使用一个 仓库的定义:搭建yum源 修改不启用的文件后缀,否则多个仓库不能正常使用 ~]#cd /etc/yum.repos.d ~]#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak ~]#vim CentOS-Media.repo #编辑配置文件(名称可自定义,识别.repo结尾的文件) [repository-ID] #定义yum源的名称,中间不能有空格 name=CentOS-$release #描述信息可自定义,此处为调用版本信息 baseurl=URL #仓库的访问路径,可使用`mirrorlist=http://...指向一个文件,该文件中保存了baseurl,需要插件支持,默认开启` gpgcheck=[0|1] #是否检查rpm的合法性,开启后会强制检查 enabled=[0|1] #本仓库是否开启 gpgkey=URL #指定密钥文件的位置 failovermethod=[roundrobin|priority] #当默认仓库不能使用的处理方式 •默认为roundrobin(轮询),实际上是随机挑选一个 •priority 按照优先级由上而下 cost=1000 #默认开销为1000,当不同源的程序包版本相同时,开销最小的生效 •首次使用yum源的时候,会到服务器上去下载元数据文件(primary_db) 搭建本地双光盘yum源: 首先确认已经挂载双光盘 ~]#rm -rf /etc/yum.repos.d/* #删除所有yum源 ~]#vim /etc/yum.repos.d/CentOS-Media.repo #手动编辑配置文件 [CentOS-6] name=This is CentOS-6 packages baseurl=file///mnt/cdrom1 file:///mnt/cdrom2 #此行如注释,必须于绝对行首注释,否则不生效 enabled=1 gpgcheck=1 gpgkey=/etc/pki/rpm-geg/..... yum命令的使用方法: ~]#yum [option] [command] [Packages] -y 自动回答yes -p 静默模式 --nogpgcheck 临时禁止密钥校对 --disablerepo=repoID_glob 临时禁止已启用的仓库,可使用通配 --enablerepo=repoID_glob 临时开启已禁用的仓库,可使用通配 --noplugins 禁用所有插件 help 获取帮助信息 repolist [all|enabled|disabled] #显示仓库列表 list 显示所有的程序包,@表示已安装 list available 显示仓库中有但是没有安装的包 list update 显示可以升级的包 list installed 显示已经安装的包 install Package_name 安装指定的软件,也可指定下载的本地包,自动解决依赖关系 update Package_name 升级指定的软件 check-update 检测升级 remove Package_name 删除指定的软件 erase Package_name 删除指定的软件 info Package_name 查看包的简要信息 provides package_name/filename 查看指定的特性由哪个程序包提供 search KeyWord 按指定的关键字搜索(包名或summary摘要) reinstall package_name 重新安装,覆盖 downgrade package_name 降级安装 deplist package_name 显示指定包的依赖关系 history 查看操作历史(安装、升级、卸载等事务) ~]#yum clean all #清理本地缓存 ~]#yum makecache #构建缓存,执行其它操作时会自动重建 包组管理: ~]#yum groupinstall Group_Package #安装指定的包组 grouplist 显示能安装的包组 groupdate 升级包组 groupinfo Group_Name 查看包组信息 groupremove Group_Name 删除指定包组 •yum不能并行安装,只能一个结束后开始另一个安装 yum配置文件中可用的变量(*.repo) $releasever 当前OS发行版的主版本号 $arch 平台 $basearch 基础平台,如i386被i586,i686等兼容 创建yum仓库的方法: 需要安装createrepo软件包,能帮助我们创建、组织并管理rpm包相关repodate目录相关的文件 ~]#createrepo DIR #对指定rpm存放目录创建关系文件 createrepo工具会根据DIR目录下的rpm包信息,在DIR目录下创建repodata目录,并创建相关文件,写入软件包之间的依赖 createrepo工具能够读取rpm包本身的信息 rpm包的封装原理: cpio包的特点:如果是按照绝对路径进行压缩,那么解压时按照绝对路径进行解压缩。 •主要用来建立或者还原备份的工具 备份:压缩 ~]#cpio -ovcB >/path/to/filename #cpio的压缩 -o 进入copy-out模式(压缩) -v 显示过程 -c 使用Protable format存储方法 -B 设定输入输出为512bytes eg:~]#find /etc/*.sh -print |cpio -ovcB >/tmp/conf.bak 使用find命令列出所有目标的绝对路径,传递给cpio命令 !!此处需要注意:find查询时一定要使用绝对路径的方式进行查询 -print可以省略 还原:解压缩 ~]#cpio -idvcu < *.cpio #解压缩指定的cpio压缩包 -i copy-in模式(解压缩) -d 恢复到指定位置(视压缩方式恢复) -v 显示过程 -c 使用Protable format存储方法 -u 替换所有文件,无提示 从rpm包中提取cpio包 ~]#rpm2cpio Package_name |cpio -idv ./path/to/dir #按包中的绝对路径提取文件 !!给出的路径必须在cpio包中存在 源码包的编译安装: 源码包的特点:最新,可定制 源码包的组成格式:多文件,文件中的代码很可能存在跨文件的依赖关系 源码包需要依赖编译器进行编译,常见的编译器有c、c++。 •make 项目管理器,依靠makefile文件完成工作,makefile文件事先不存在,根据用户的需要生成。c/c++编写的程序常常使用make项目管理器 •maven java的项目管理器 源代码-->预处理-->编译-->汇编-->链接-->执行 •编译三步骤: ``` 安装前先查看install文件或README ①./configure --prefix=软件的安装位置 --sysconfigdir=配置文件位置 通过选项传递参数,指定启用的特性,安装路径等,执行时会按照用户指定以及makefile.in文件生成makefile文件 检查编译环境,以及依赖到的其他安装包 --help 获取帮助 ~]#echo $? #查看上一步骤是否出错 ②make #根据生成的makefile文件构建应用程序 ~]#echo $? #查看上一步是否出错 ③make install #j将 文件复制到指定目录下 ~]#echo $? #查看上一步是否出错 安装后的配置: 1. 导出二进制程序目录至PATH环境变量中 ~]#vim /etc/profile.d/NAME.sh #编辑环境变量配置文件 export PATH=/path/to/bin:$PATH #将新安装软件的命令路径加入环境变量中 2. 导出文件路径 ~]#vim /etc/ld.so.conf.d/NAME.conf #编辑函数库路径文件 添加新的函数库文件目录至文件中 •让系统重建缓存 ~]#ldconfig [-v] #通知内核重新加载函数配置文件 3. 导出头文件,基于符号链接方式实现 将每个文件或目录连接到/usr/include下即可 4. 导出帮助手册 ~]#vim /etc/man.config #编辑man配置文件 向其中添加MANPATH路径即可支持man的方式获取帮助 ``` 网络yum源的搭建: 必须要能够上网 wget下载指定版本的repo文件 网易:http://mirrors.163.com #只能下载最新版,所有镜像站点不允许下载老版本 CentOS官网:valut.centos.org 找到对应版本的使用帮助,按照求下载指定版本的repo文件至/etc/yum.repos.d •网络yum源的优先级最高,本地yum源会失效,只有将网络yum源文件删除或重命名才能使本地yum源生效 yum局域网络源: 服务器软件升级时应当按批次升级,避免同时升级出现故障停止服务 yum局域网络源原理: 将其中的一台进行更新,并下载所需要的软件,将保存下来的软件通过共享的方式共享给其他主机,其他主机指定yum源的时候制定该共享主机即可。 sftp的操作: >lcd 修改本地 下载路径 >get 下载 >put 上传 >!COMMAND 执行当前shell命令 打补丁原理: 补丁文件生成: ~]#diff -Nauf 旧文件绝对路径 新文件绝对路径 >/tmp/*.path #生成补丁文件 -N 当比较目录时,若某个文件只存在一个目录中,则另一个目录视为空文件 -a 将任何文档当做文本文档处理 -u 使用统一的输出格式 -r 当比较目录时递归比较子目录 -b 忽略空格造成的问题 -B 忽略空白行造成的不同 *.path补丁文件中的格式: 带加号的是新文件中有的旧文件中没有的 带减号的是旧文件中有,新文件中没有的 没有符号则为新旧文件中都有的 打补丁: ~]#patch -p# <*.patch #打补丁 -p 设置要剥离的目录层数,从根开始算起,代表补丁文件中记录的,old文件所在目录的层数,用于更新old文件时匹配正确的路径。 基础笔记综合整理 2018-10-07 评论 1754 次浏览
11-Linux基础-vim编辑器 vim编辑器 vi (visual insterface):vi是一个文本编辑器 文本:ASCII码,美国国家信息标准交换代码 unicode 国际通用的编码方式,utf8为unicode中的一种编码方式 •但凡是纯文本编辑时,都可以使用vim进行编辑 •种类 行编辑器:sed 全屏编辑器:nano,vi •vim是vi的增强版,vi在嵌入式中应用较多 •vim是一个模式化的编辑器 命令模式 插入模式 末行模式(vim内置的命令接口) •当我们使用vi/vim编辑文档时,会有一个临时文档(隐藏文件)在目录中生成,目的是防止系统或程序意外崩溃,保存编辑的信息,并不会写入源文件 出现打开文件报错的时候,我们可以选择删除.*.swap临时文件再编辑文档。 文档编辑时的不征程退出也可能到导致临时文件的存留,当再次打开文件时会报错,删除即可。 ~]#vim #欢迎信息与文件内容无关 ~]#vim [opyion] file1 file2 file3.... +NUM 打开文件时让光标处于指定行的行首 +/PATTERN 打开文件后定位到被模式第一次匹配行行首 + 打开文件后,直接出现在行尾 •vim模式间的转换 命令模式-->插入模式 i 在当前光标前插入 I 在当前光标所在行行首插入 a 在当前光标后插入 A 在当前光标所在行行尾追加 o 在当前光标所在行的下新建一行 O 在当前光标所在行的上方新建一行 插入模式-->命令模式 Esc键 命令模式-->末行模式 输入冒号":" 进入末行模式后需输入相应的命令 •末行模式下文件的操作 ``` :q 退出 :q! 强制退出,丢弃做出的决定 :wq 保存并退出 :x 保存并退出 :w 保存文件至当前文件 :w /PATH/TO/SOMEWHERE 将文档所有内容保存到指定位置 ZZ 保存退出 •光标跳转 字符间跳转:H(左) J(下) K(上) L(右) 支持#COMMAND #指定跳转的字符 •单词间跳转 w 下一个单词的词首 b 当前或上一个单词的词首 e 当前或下一个单词的词尾 #COMMAND #支持跳转指定单词数 •行首行尾跳转 ^ 跳转至行首第一个非空白字符 0 跳转至绝对行首 $ 跳转至绝对行尾 •行间移动 #G 跳转至指定行 G 跳转至最后一行 gg/1G 跳转至行首 •句间移动 ) 下一句 ( 上一句 •段落间移动 } 下一段 { 上一段 vim编辑命令(命令模式) •字符编辑 x 删除光标处的字符 #x 删除光标处开始的指定个字符 xp 删除当前字符,粘贴在当前字符(当前字符已改变)的后面,交换光标所在处及其后面字符的位置。 •删除命令(删除的内容是保存在缓冲区内的,因此可以撤销,但是只能粘贴最近一次删除的内容) d 需要结合光标跳转字符使用,即删除命令执行后光标移动的距离 d$ 删除光标至行尾的内容, d0 删除光标处至行首的内容 d^ 删除光标到行首的第一个非空白字符 d#w/dw '#'为删除的单词数,即光标掠过的单词,删除光标后n个单词,当前单词不计算在内 d#b/db 删除光标前指定的单词数 d#e/de 删除光标后的指定单词数,当前单词计算在内 dd 删除光标所在行 D 删除光标所在行的所有字符(仅删除行中的字符) •粘贴命令 粘贴的方式取决于当前缓冲区内为整行还是非整行 p(小) put、paste 整行:粘贴至当前光标所在行行下 非整行:粘贴至当前光标所在字符后 P(大) 整行:粘贴至当前光标所在行上 非整行:粘贴至当前光标所在字符前 •复制命令 y$ 从当前光标处复制到行尾 y^ 从当前光标处复制到行首的第一个非空白字符 y0 从当前光标处复制到绝对行首 yy 复制一整行 #yy 复制从当前行开始的向下指定行数 •改变命令:c(change) c 删除光标所在处内容并进入插入模式,配合字符跳转字符使用 c$ 删除光标处至行尾的内容并进入插入模式 c^ 删除光标处至行尾的第一个非空白字符,并进入插入模式 c0 删除光标处至绝对行首,并进入插入模式 cc 删除整行并进入插入模式 #cc 删除指定的多行并进入插入模式 •替换:r r 替换光标处的字符 R 进入替换模式 •撤销此前的操作(在没有使用w保存的时候) u (undo)撤销此前的操作,保存在内存的缓冲区,默认保存50次操作 •反撤销(恢复此前的撤销) Ctrl+r "." 重复上一次的操作 •翻屏操作: ctrl+f 向文件尾部翻一屏 ctrl+b 向文件首部翻一屏 ctrl+d 向文件尾部翻半屏 ctrl+u 向文件首部翻半屏 •查找 /pattern 从光标处向下查找指定的字符串,可使用正则,也可使用字符串 ?pattern 查找字符串,可以使用正则,也可使用字符串,从光标处向上 n:与命令查找方向一致 N:与命令查找方向相反 末行模式(末行模式下也有命令历史的功能) 末行模式为内建的命令行接口 •地址定界 :开始行,结束行 :1,100 从第一行到100行 :# 定位到指定行 :M,+N 从第M行开始的+N行 :. 当前行 :$ 最后一行 :$-1 倒数第二行 :% 表示全文 :/pattern1/,/pattern2/ 从第一次被模式1匹配的行开始至第一次被模式2匹配的行结束之间的行,但是很少这么用 :#,/pattern/ 从指定行开始,至第一次被模式匹配的行结束 :/pattern/,$ 从第一次被匹配到的行开始,到文档最后一行 •地址定界常常和编辑命令等一起使用 :m,nd 删除指定的行 :m,ny 复制指定的行 :w /path/to/somewhere 将修改后的文档保存到指定位置 :r /path/to/somefile 将指定文件读取到当前光标处 •查找并替换(末行模式下,同地址定界一同使用) :%s/要查找的内容/要替换的内容/修饰符 #可以使用正则匹配 替换的内容可以使用\1,\2...后项引用 "&" 引用前面查找到的整个内容 :.,$s/R..t/&er/g 将R..t替换为R..ter •修饰符: g 全局(整行,只要匹配就替换)替换,不写则默认替换每一行第一次匹配 分隔符可使用@或者#代替,避免出现相同字符需要转义 :%s/^[[:space:]]\+/#&/g 以空白字符开头的行首加入"#"(注释) ``` •多文件文件操作: ``` ~]#vim /tmp/{a,b,c,d} 同时操作多个文件。但是不会出现在同一屏幕 :next 下一个文件 :last 最后一个 :prev 上一个文件(previous) :first 附一个文件 :wall 保存所有打开的文档 :qall 退出所有 :wqall 保存并退出所有文档 •窗口分割模式(未打开的多文件) ~]#vim -o|O file1 fil2 fil3..... -o 水平分割 Ctrl+w ←、→切换文档 -O 垂直分割 Ctrl+w ↑、↓切换文档 #窗口切换:Ctrl+w,arrow(箭头) •单文件窗口切割(已打开的单个文件) Ctrl+w, s(split) 水平分割单文件 Ctrl+w, v(vertical) 垂直分割单文件 ``` 定制vim工作特性 ``` 全局:/etc/vimrc 个人:~/.vimrc •显示行号 :set number 开启行号显示 :set nonumber 关闭行号显示 •括号匹配 :set showmatch 开启括号匹配 :set noshowmatch 关闭括号匹配 •自动缩进 :set ai 开启自动缩进 :set noai 关闭自动缩进 •高亮搜索 :set hlsearch 开启高亮搜索 :set nohlsearch 关闭高亮搜索 •语法高亮 :syntax on 开启语法高亮 :syntax off 关闭语法高亮 •忽略大小写(不建议启用,linux本身就严格区分大小写) :set ic 启用忽略大小写 :set noic 禁用忽略大小写 •配置文件中,以"#[[:space:]]"开头的一般为注释(chkconfig行就是例外) •配置文件中,以"#"开头的一般都可以删除"#"启用该行 ``` vim编辑器回顾: 编辑模式 输入模式 末行模式 可视化模式 跳转:h、j、k、l、w、e、b、)、(、{、}、G、^、0、$ 编辑:x、r、c、d、y、p、u、Ctrl+r 查找:/、?、n、N 查找替换s:常配合定界符使用s/OLD/NEW/g g 全局替换 i 查找时忽略大小写 •末行模式定界 # 定位到指定行 m,n m行开始,n行结束 m,+n m行以及m行下一行开始的n行 . 当前行 $ 最后一行,$-1倒数第二行 #,/PATTERN/ 从第#行开始,到第一次匹配到结束 /PATTERN/,$ 第一次被模式匹配的行至行末 % 全文查找 •文件测试(双目测试) 文件1 -nt 文件2 文件1是否新于文件2 文件1 -ot 文件2 文件1是否旧于文件2 基础笔记综合整理 2018-10-07 评论 1791 次浏览
10-shell编程基础 shell编程: 语言的特征:变量、函数、流程控制、判断 编译型语言:c、c++、c#、java 解释型语言:php、python、perl、shell 程序的编程风格: 面向过程:以指令为中心,数据服务于指令 面向对象:以数据为中心,指令服务于数据 ·计算机只识别二进制指令 ·程序由指令+数据组成 ·shell程序提供了编程能力,依靠调用系统提供的命令(已有的二进制程序),组织成一定形式解释执行的。 ·编译:高级语言→编译器→目标代码(c/c++/java…) ·解释:高级语言→解释器→机器代码(shell/perl/python) ·过程式编程: 顺序执行、循环执行、选择执行 ·编程语言的基本结构: 数据存储:变量、数组 表达式 语句 ·shell编程语言除了控制保留字所写的结构外,剩余都是系统中的命令 shell是过程式的、解释执行的、严重依赖操作系统的语言 shell脚本是文本文件,但是这个文本文件是有特殊格式的 ·第一行要写清楚解释器的路径,由哪个解释器解释执行 #!/bin/bash(顶格写) ·shell脚本是由解释器解释执行的,解释器是二进制文件运行在CPU上 ·shell脚本还需要依赖PATH环境变量,如果是当前用户运行脚本,命令是可以执行的,如果是计划任务则不会登录执行,需要在脚本中定义PATH环境变量 ·内核是通过魔数(magic number)来判断文件的格式,文件前的几个字节 实例:统计/etc/passwd文件有多少行 ~]#vim /tmp/test.sh #编辑文件,不存在的文件自动创建(需保存) 按下键盘上的小写字母a,并输入如下内容 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:count /etc/passwd has line filename=”/etc/passwd” #定义文件路径变量,方便替换 cat $filename #查看文件内容 wc -l $filename #统计文件行数 ``` 按Esc,并且键入冒号,输入wq,回车保存文件 chmod +x /tmp/test.sh #给脚本执行权限 ./tmp/test.sh #执行脚本 变量:命令的内存空间 ·不同的数据存储的格式可能不同 字符型、数值型… ASCII 127个字符的编码集 逻辑运算符: &&与 true 0 真 || 或 false 1 假 ! 非 短路运算: 与:两个条件都为真时才成立 当第一个参数为真时,第二个参数才参与运算 当第一个参数为假时,第二个参数不参与运算 或:两个条件任意 一个为真,则结果为真 当第一个参数为真时,第二个参数不参与运算 当第一个参数为假时,第二个参数参与运算 linux上的文本处理三剑客 grep 文本过滤工具,基于模式(pattern),显示匹配的行 grep支持正则 egrep支持扩展正则 fgrep 不支持正则 sed 文本流编辑器,是一个文本编辑工具(行编辑工具) awk linux上实现的是gawk,awk是一门单独的编程语言,也就是说awk也是一个解释器,awk既不是用于编辑文本也不是用于过滤文本,而是将文本进行美观输出,所以awk是一个文本报告生成器 grep及正则表达式: 文本搜索工具,根据用户指定的模式,对目标用户文本进行匹配检查,打印匹配到的行。 模式:由正则表达式及文本字符所编写的模式,其中有些字符不表示字符字面意义,表示控制或者通配的功能 元字符:特殊功能的字符 正则表达式在编码上有所不同,所以分为两类: ·基本正则表达式BRE ·扩展正则表达式ERG ·grep默认是支持基本正则表达式的 ·扩展正则表达式需要使用egrep或者grep -E ·正则表达式引擎:进行正则表达式的解释及匹配检查 ~]#grep [option] PATTERN [FILENAME] —color=auto 对匹配到的文本着色显示 -v(小) 反向显示,显示无法被匹配到的行 -i 匹配时忽略大小写 -o 仅显匹配到的子串 -q 静默模式,不会输出任何信息 -A# 显示匹配行的后#行 after -B# 显示匹配行的前#行 before -C# 显示匹配行的前后各#行 -E 使用扩展的正则表达式 基本的正则表达式元字符: ·grep使用的模式应当使用引号包含起来 ``` "." 匹配任意单个字符 ”[ ]” 匹配指定范围内的任意单个字符 ”[^]” 匹配指定范围外的任意单个字符 "[:digit:]" 所有数字0-9 ”[:lower:]” 所有的小写字母 ”[:uppper:]” 所有大写字母 ”[:alpha:]” 所有的大小写字母 ”[:alnum:]” 所有的字母和数字 ”[:punct:]” 所有特殊字符 ”[:space:]” 空格字符 ·次数匹配,用在要指定出现次数的字符后面 ”“ 匹配前面的字符任意次,““本身仅表示次数 ”.*” 任意长度的任意字符 ”\?” 匹配前面的字符0次或一次,即前面的字符可有可无。 ”+“ 匹配前面的字符至少一次 ”{m,n}“ 匹配其前的字符至少m次,至多n次 ”{m}“ 匹配其前面的字符m次 ”{0,n}“ 匹配前面的字符至多n次 ”{m,}“ 匹配其前的字符至少m次 ``` ·位置锚定 ``` ”^” 行首锚定,使用在最左侧 ”$” 行尾锚定,使用在最右侧 ”^PATTERN$” 用模式匹配整行,匹配到为真,否则为假 ”^$” 空行,none ”^[[:space:]]*” 空白行,没有可见字符的行 ”\<” 词首锚定,用于单词的左侧 ”\b” 词首锚定,用于单词的左侧 ”\>” 词尾锚定,用于单词的右侧 ”\b” 词尾锚定,用于单词的右侧 ”\” 单词锚定 ”\bPATTERN\b” 单词锚定 ·分组:“()“,小括号在shell中有特殊含义,所以需要转义 将一段字符当作一个整体处理 字符一旦分组以后,在所在的正则表达式中还有第二个作用:后向引用 ·后向引用:引用前面分组括号中模式所匹配到的字符 一旦一个模式能够匹配到一个字符串,在后面的任何位置我么都可以再次引用这个模式匹配到的字符 分组中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,这些变量的命名方式为\1,\2,\3等等 \1表示从左起第一个括号到与之匹配的括号之间模式所匹配到的字符 分组允许嵌套,最里面的一对括号为最后一个分组。 ·后向引用,引用的是分组括号中模式所匹配到的字符,而非模式本身 ``` egrep及其扩展的正则表达式: egrep相当于grep -E ·扩展正则表达式的原字符 ·字符匹配: “.” 任意单个字符 “[]” 指定范围的单个字符 “[^]” 指定范围外的单个字符 ·次数匹配 “*” 匹配其前的字符任意次 “?” 匹配其前的字符0或1 "+" 匹配其前的字符至少一次 "{m}" 匹配其前的字符m次 "{0,n}" 匹配其前的字符至多n次 "{m,}" 匹配其前的字符至少m次 "{m,n}" 匹配其前的字符至少m次 •锚定字符 "^" 行首 "$" 行尾 "\<" "\b" 锚定词首 "\>" "\b" 锚定词尾 •分组 "()" 将扩展正则表达式的一部分当做一个整体 后向引用:\1,\2,\3...... •或者 a|b a或者b C|cat C或者cat (C|c)at Cat或者cat ~]#basename /etc/passwd #取路径的基名passwd ~]#dirname /etc/passwd #取目录名/etc bash中算术运算的实现: •let sum=$num1+$num2 #计算num1+num2的和保存在sum变量中 •var=$[算数表达式] #有返回值,可以直接调用 •var=$((算数表达式)) #也可实现直接引用 •var=$(expr arg1 arg2 arg3....) #arg1、arg3操作数,arg2为操作符 #使用expr需要注意,*号需要转义,此处为命令行的调用,会被当做通配符 增强型赋值: +=、-=、*=、%=、/= let count+=1 let count=$count+1 let var++ #自加 let var-- #自减 •bash内建的随机数生成器$RANDOM $RANDOM是bash的内建变量,(0-65535) 列如我们要在1-60中生成一个随机数 echo $[$RANDOM%60+1] #+1是因为$RANDOM%60的随机范围为[0-59] 条件测试: 判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程 •测试命令: ~]#test expression(表达式) ~]#[ expression ] #一对中括号为测试命令,同test ~]#[[ expression ]] #两对中括号中为bash中的关键字 #expression与中括号之间要有空格,否则会报错 •bash中的测试类型: 数值测试(数值大小) 字符测试(字符串大小) 文件测试(文件存在与否,读写执行等权限) •数值测试:一般不加引号,加引号就是字符串了 -gt 左侧(数值)是否大于右侧(数值) -ge 左侧是否大于等于右侧 -eq 左侧是否等于右侧 -ne 左侧是否不等于右侧 -lt 左侧是否小于右侧 -le 左侧是否小于等于右侧 •字符串测试: ==/= 等值测试,一个或两个等于号都可以,但是为了与赋值区分,监视使用前者 ">" 是否大于 "<" 是否小于 "!=" 是否不等于 [[ "char" =~ "RATTER" ]] #左侧的字符串是否能被右侧的模式匹配到 [ -z "string" ] #测试字符串是否为空,空位真。 [ -n "string" ] #测试字符串是否不空,不空为真 字符串要加引号,使用单引号还是双引号取决于是否要做变量替换 •文件测试 ~]#man bash #查看bash的各种特性 -e filename 文件存在为真,否则为假 -b filename 文件存在且为block设备文件,否则为假 -c filename 文件存在且为字符设备文件,否则为假 -d filename 存在且为目录文件,否则为假 -f filename 存在且为文件,否则为假 -S filename 存在且为套接字文件,否则为假 -L filename 存在且为符号链接文件,否则为假 -p filename 存在且为命名的管道文件,否则为假,我们使用的为匿名管道"|" •文件权限测试 -r filename 是否存在且可读取 -w filename 是否存在且可写 -x filename 是否存在且可执行 •文件的特殊权限 -g filename 是否存在且拥有sgid权限 -u filename 是否存在且拥有suid权限 -k filename 是否存在且拥有sbit(sticky)权限 •文件大小测试 -s filename 文件是否存在且为空 •文件打开性测试 -t fd fd为文件描述符,是否已打开且与某终端相关 -N filename 文件自上一次读取后是否修改过 -G filename 当前有效用户是否为文件属组 -O filename 当前有效用户是否为当前属主 •双目测试 file1 -ef file2 file1和file2是否为指向同一个设备上相同的inode(是否为硬链接) file1 -nt file2 file1是否新于file2,nt为new than file1 -ot file2 file1是否旧于file2,ot为old than #常用于备份中的判断,如果新于备份文件则备份 •组合测试条件 •逻辑运算 && 与 COMMAND1 && COMMAND2 || 或 COMMAND1 && COMMAND2 ! 非 !COMMAND eg: [ -e file ] && [ -r file ] #文件是否存在且可读 -a 与 expression -a expression -o 或 expression -o expression ! 非 !expression eg: [ -e file -a -r file ] #文件是否存在且可读 •摩根定律:整体取反后内部符号要取反 [ ! -r file /tmp/test ] && [ ! -w /tmp/test ] 相当于 [ ! \( -r /tmp/test -o -w /tmp/test \) ] shell脚本编程,过程式编程 1. 顺序执行,无需控制 2. 选择执行,需要使用关键字来实现 3. 循环执行 •选择执行 if单分支语句 if 条件判断; then 条件为真时的代码 fi if双分支语句 if 条件判断; then 条件为真执行的语句 else 条件为假时执行的语句 fi if多分支语句 if 条件判断;then 条件为真执行的语句 else 条件为假时执行的语句 fi •if语句逐条进行判断,第一次遇到"真"条件时,执行其分支,而后结束 •if语句允许嵌套 条件判断就是命令,自身为表达式的需要转为测试语句 循环:for、while、until 循环体:要执行的代码,可能执行N次 进入条件 退出条件 for 变量名 in 列表; do 循环体 done while 条件;do #当条件成立时,循环体一直执行,不成立则结束 循环体 done until 条件;do #当条件不成立时,循环体一直执行,条件成立则结束寻循环 循环体 done while :;do #无限循环 循环体 done •一般来说循环体会调用变量名,执行的机制为: 依次将列表中的元素赋值给"变量名",每次赋值执行一次循环体,直到列表的元素耗尽,循环结束,列表是一次性生成存放在内存中的。 列表的生成方式: 直接给出列表 整数列表 {StartNumber..StopNumber} seq 起始数 增量 结束数 seq [start [step]] stop 可使用能返回列表的命令 glob文件名通配 函数 function 函数名() { 函数体 } #调用函数时直接使用函数名即可 bash脚本常使用的命令 read 该命令能完成和用户的交互,能够实现多个变量对应存储 -p "提示信息" #打印提示信息 -t NUM #指定超时时间,为空(用户不输入)时应设定默认值 •如果用户输入的参数超过设定变量的数量,则最后一个变量接收余下的所有参数,如果变量足够则参数对应存储 ~]#bash -n *.sh #检查脚本是否存在语法错误 ~]#bash -x *.bash #显示每一行代码的执行结果,调试执行 ~]#echo [option] "...." #打印字符串至屏幕 -e 支持反斜线的换行符、控制符 \n 换行 \t 制表符 -n 取消输出行尾的换行符的换行符,即不换行输出。 -e 支持颜色输 开始:\e [字体颜色;字体底色m \033[字体颜色;字体底色m 结束:\e[0m \033[0m #0m为结束所有的格式 •脚本的命名一般为*.sh •脚本的执行方式: 添加x执行权限,使用绝对路径或相对路径 使用bash命令,调用脚本,即让解析器主动去读取脚本 ~]#bash -n *.sh #检查脚本的语法错误 ~]#bash -x *.sh #显示脚本的执行过程 •命令执行的优先级: 1. 使用绝对路径或相对路径 2. 别名命名的命令 3. bash内置的命令 4. 根据环境变量定义的目录查找到的命令 管道符和xargs命令的区别: ~]#echo "--help" |cat #执行该命令的结果为"--help" ~]#echo "--help" |xargs cat #执行该命令的结果为cat的帮助 shell脚本中的特殊符号: 单引号:强引用,单引号中的符号,如"$"、"反引号"等都没有特殊意义 •Tips:PS1变量的复制使用的是单引号 双引号:弱引用,在双引号的引用下,特殊符号几乎没有特殊意义 $ 变量引用 `` 命令的调用 基础笔记综合整理 2018-10-06 评论 1751 次浏览
9-linux基础-权限 基础权限: ·linux中文件权限的信息使用ls-l filename可以查看到文件的详细信息,权限位十一位 ·第一位表示文件的类型 '-'普通文件 "d"目录文件 "l" 连接文件 "b" 块设备文件 "c" 字符设备文件 "s" 套接字文件 "p" 管道文件 ·中间9位每三位一组:从左到右为 所有者(u),所属组(g),其他人(o) ·最后一位为'.',表示该文件被selinux保护,selinux为增强型安全组件 ·如果末尾有‘+’表示有acl权限 权限管理: ·主要是针对三类用户定义: 属主 owner 属组 group 其他人 other ·每个文件对每类访问者都定义了三种权限 对于文件来说 r readable可以使用文件查看工具获取其内容 w writable可以修改器内容 x excutable 可以把此文件提请内核启动一个进程 对于文件来说: r 可以使用ls命令列出目录下的文件列表 w 可以再目录中创建、删除文件 x 可以使用cd命令进入此目录,也可以使用ls-l查看此目录中文件列表 修改文件权限 ~]#chmod [option] MOD FILE #修改指定文件的权限 -R 修改目录的权限的时候递归修改权限,修改目录的权限时,默认不会修改目录下文件的权限 使用八进制数形式修改权限 ~]#chmod750 /tmp/test/ #修改指定目录的权限为750 直接指定用户mode进行定义 ~]#chmodu=rwx FILE #修改某一类用户的权限 u=rwx,g=rw,o=(空,表示不给权限) 修改用户的耨意为权限: ~]#chmodu+x FILE #给文件属主添加执行权限 a+x 所有类型用户添加执行权限 a-x 所有类型用户减少执行权限 参考指定文件的权限,将目标的权限修改同相同权限 ~]#chmod--reference=/etc/fstab /tmp/test #以/etc/fstab文件为模板文件 ~]#chownlinux:linux /tmp/test #修改指定用户的属主属组为linux ·~]#chown:linux /tmp/test #仅修改文件的属组 -R 递归修改目录下的所有文件 ~]#chgrp group FILE #修改文件属组 -R递归修改文件属组 遮罩码:为用户创建的文件提供基本权限 ~]#umask #显示当前用户的umask值(遮罩码) ·root用户的umask值为022 ·普通用户的umask值为0002 ·当创建文件的时候,默认的权限为 666-umask 如果文件有执行权限,其八进制权限加1,文件不允许默认有执行权限 ·当创建目录的时候,默认权限为: 777-umask 目录的可用权限只有0,5,7 ·umask的值在/etc/profile文件中可以修改 常使用的权限: 000没有权限 644标准文件权限 755标准目录权限 777最大权限,禁止赋予 权限对文件的含义: r读取文件的内容 w编辑、新增、修改文件的内容,不包含删除 x可执行 权限对目录的意义 r可查询目录下的文件名 w具有修改目录结构的权限 x可以进入目录 目录的可用权限 0最小权限 5标准权限 7最大权限 ·对于文件来说,最大权限为执行权限 ·对于目录来说,最大的权限是写权限 "#" 读音:sharp ·默认权限保证了新建的文件、目录有基本权限,不能通过目录继承的原因是,目录和文件的执行权限的意义不同。 文件系统上的特殊权限 SUID、SGID、Sticky linux上的权限有mode和ownership mode:user、group、other三类用户,分别you读、写、执行权限 ownership:所有权,属主身份 进程的安全上下文: 前提条件:进程由属主、属组,文件有属主、属组 谁发起的进程,进程的属主就是谁 实例: /bin/cat 属主属组都为root,当普通用户执行/bin/cat程序时,匹配的是其他人权限,如果其他人拥有执行权限则普通用户可以执行/bin/cat程序,当程序运行起来后为进程,此时进程的属主属组为执行程序的用户,这个进程所能访问的资源受进程属主属组的限制。 ·任何一个可执行文件能不能启动为进程,取决于发起者对程序问价是否拥有执行权限 ·启动为进程后,其进程属主为发起者,进程的属组为发起者的属组(属组意义不大) ·进程访问目标时的权限,取决于进程的发起者 1.进程的发起者同文件属主,则应用文件属主权限 2.进程的发起者属于文件的属组,则应用文件属组权限,如果进程发起者属于多个组,有一个组与文件相同即表示该用户属于该文件的属组 3.应用其他人的权限 SUID(一般为提权操作) 1. 任何一个可执行程序能否启动为进程,取决于发起者对程序文件是否拥有执行权限 2. 启动为进程后,其进程属主为源程序文件的属主,这个进程访问的资源的权限取决于这个进程属主的权限 ~]#ls -l $(which passwd) #红色的底纹表示拥有特殊权限 ·SUID权限的设定 ~]#chmodu+s filename #给文件添加SUID权限 ~]#chmodu-s filename #取消文件的SUID权限 #ls-l长格式显示时,原文件属主执行位上为s(小)表示存在执行权限 #ls -l长格式显示时,原文件属主执行位上为S(大)表示无执行权限 SGID(一般为提权操作) 默认情况下用户创建文件时,属主为用户的基本组。 一旦某目录被设定了SGID权限,则所有对该目录有写权限的用户,在此目录中创建的文件属组为目录的属组,在创建文件的那一刻,用户以目录的属组为基本组创建文件,临时更改有效组。 ·SGID的设定(对目录) ~]#chmodg+s DIR #给目录添加SGID权限 ~]#chmodg-s DIR #取消目录的SGID权限 ·SGID的设定(对文件) 当一个普通用户执行具有SUID权限的程序时,该命令的 执行者会临时加入该命令的属组内。 ~]#ls-l /usr/bin/local #具有SGID权限的命令 ~]#ls-l /usr/lib/mlocate/mlocate.db #具有SGID权限后操作的文件 ~]#chmodg+s filename #给文件添加SGID权限 ~]#chmodg-s filename #取消文件的SGID权限 #ls -l 长格式显示时,源文件属组执行位上为s(小),表示原属组执行位有权限 #ls-l 长格式显示时,源文件属组执行位上为S(大),表示原属组执行位无权限 Sticky(黏着位SBIT) 对一个多人可写的目录,如果设置了sticky权限,则每个用户只能删除自己的文件,root用户除外。 ~]#chmodo+t DIR #给目录添加sticky权限 ~]#chmodo-t DIR #给目录取消sticky 基础笔记综合整理 2018-10-05 评论 1696 次浏览 « 前一页1234后一页 » 关于博主 几人行 纸上谈来终觉浅,绝知此事要躬行。 了解更多 文章分类 OpenStack+Ceph(5) Python笔记(0) CI/CD(4) Ansible(1) Docker笔记(3) shell脚本(24) Linux_quession&answer(2) 调优文档(4) 服务(6) 随手笔记(21) 妄尘集(20) 基础笔记二(8) 基础笔记综合整理(20) 给自己讲linux(114) 最受欢迎的文章 博客停更通知( 19,851 人看过 ) OpenStack(一)( 12,690 人看过 ) 情书( 11,295 人看过 ) 我的青春里没有爱情( 9,641 人看过 ) 操作系统原理--Linux篇(摘录)( 9,361 人看过 ) OpenStack+Ceph云平台卷清理操作( 9,257 人看过 ) OpenStack+Ceph磁盘解锁( 8,773 人看过 ) Docker container 修改MAC( 8,539 人看过 ) 防火墙规则笔记整理( 7,835 人看过 ) JumpServer简介( 7,452 人看过 ) 最近回复 wuzetian: alert("你好,我是一个警告框!"); wuzetian: function myFunction() { alert("你好,我是一个警告框!"); } wuzetian: http://fxme.top/index.php/page/2/ wuzetian: http://fxme.top/index.php/page/2/ wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习 wuzetian: 凯哥哇,继续更新,学习学习