第三十一讲——管理磁盘分区 管理磁盘分区的命令:fdisk fdisk /dev/sda(必须指向一个设备,不能指向一个分区)在sda上创建、删除分区。 执行命令后会进入一个交互式界面 p: 显示当前硬盘上的分区,包括没有保存的修改。 fdisk创建、删除分区时并不是立即保存生效的,只有退出这个命令的时候修改才会生效,如果创建错了、删除错了不保存直接退出即可。 n:创建新分区(新硬盘会有编号的选择,e扩展分区,p主分区) d:删除一个分区 w:保存并退出 q:不保存退出 t: 修改分区类型(文件系统类型)使用L可以查看所有支持的文件类型种类 l:显示所有支持的类型 创建一个新分区时,硬盘会询问使用的分区号(1/2/3/4),然后会默认一个起始柱面,这个默认就好,接下来就是指定结束柱面,可以按照空间大小指定:+1G(M/K) 扩展分区不能直接使用,它只是一个指针,指向MBR之外的一个分区表,扩展分区下创建的分区叫逻辑分区,逻辑分区是自动编号的。 当我们新建分区后内核不会立即识别,我们可以通过cat /proc/partitions查看当前内核是被了哪些分区。 创建完分区后我们需要通知内核重读分区表 partx /dev/sda (partprobe /dev/sda)重读分区表 当分区表重读后,接下来就是格式化并挂载分区。 操作系统的执行过程分为两段(两种模式) 一般来说,用户是没有特权取操作硬件的,所以这些进程所运行的模式我们称为用户模式,运行的空间我们称为用户空间。 所有的进程一般来说都运行在用户空间,指的是它们没有特权 我们常见的CUP(inter和AMD),将CPU划分为四个环状(同心圆)运行级别,最内层为ring0,外层为ring3,内核是跑在ring0上的,用户进程跑在ring3上,1和2由于历史原因没有使用,三级别下是没有特权的。 我们说过,任何程序在编程的时候,利用的是硬件芯片的功能,一些I/O操作(和硬件打交道的指令)都只能运行在零级别上。 所以要想和硬件打交道,必须要转入内核才有权限。(内核空间/内核模式)零级别。 文件系统对任何文件的操作都是通过文件系统调用接口来实现,一个内核所提供的功能都是通过系统调用向外提供的。因此,管理文件的功能也是通过系统调用来完成(和文件操作相关)。 我们要知道,打开一个文件可读取一个文件是两码事。 我们格式化分区之后会发现少了不少的空间,这些少去的空间用于存放元数据。 块大小(block size):对文件系统来讲,块大小是不确定的,它只能是2^n字节,一般为1024/2048/4096byte,三种情况(linux上)。 block size 决定了怎么装在磁盘块到内存中去,我们知道,磁盘中的数据不能直接被CPU访问,CPU要访问一个数据时,得先将数据装载进入内存。 内存中的空间一般是分成页面(页框)的,一般来讲,一个页框只能存放一个磁盘块或者两个磁盘块或者四个磁盘块,页框的大小通常为4k. 页框的大小对于不同的CPU是不一样的。 占据磁盘块的文件通常只有两类主流文件: 一是普通文件,二是目录文件 块组:块组属于逻辑概念,块组对用户是不可见的,块组是为了方便文件管理,块组的大小取决于块的大小,如果块大小为1K,那么一个块组中可以有1024*8bit个块(一个块位图中可标识的块的数目)。 在创建文件系统的时候,在元数据区有一个超级块(super block),用于保存创建了多少个块组。 super block坏了,基本上分区也就挂了,所以super block可以有多个备份 super block中保存了整个分区的全局信息。 有多少块组 每个块组中有多少个快 块大小 空闲磁盘块,已使用磁盘块 已用inode,未使用inode 块组描述符表(也拥有备份): 当前系统有多少块组,每一个块组从第几个开始,到第几个结束。 每一个块组都有一个inode表,每一个块组中有inode位图,块位图。 任何一个分区的第一个(第零个)块是不能被使用的,预留出来为boot block 引导块 如果在分区上安装操作系统,其BootLoader应当装在boot block中(多操作系统)。 boot block是被MBR调用的 除了第一个块,其他的块直接被划分为块组 boot block block group0 block group1 n…… 每一块组可划分为: super block GDT block bitmap inode bitmap inode table date blocks(数据块) mode权限 owner属主属组 size 大小 timestamps时间戳 direct blocks直接磁盘块指针 indirect blocks间接磁盘块指针 double indirect二级间接磁盘块指针 triple indirect三级间接磁盘块指针 super block超级块一般有3-4个备份 GDT:块组描述符表,group description table 存放每一个块组的起始块编号,结束块编号(块组边界信息),根据块个数不同,占据的空间也是不一样的,未必是一个磁盘块。 所以我们说一个磁盘分区内部又被分成了多个逻辑区域,彼此之间分隔开来管理。 inode:index node inode中存放inode号,属主属组,权限,时间戳,文件大小,直接磁盘块指针,间接磁盘块指针,二级间接磁盘块指针,三级间接磁盘块指针。 ext2 inode ext3于ext2最大的不同就是ext3被称为日志文件系统(journal file system) 日志文件系统将磁盘分为三个区,元数据区、数据区、日志区。 日志文件系统在运行的时候,先将inode的放入日志区,如果数据存储一般掉电了,重启时只需将日志中的inode删除即可,在ext2中需要遍历整个磁盘来寻找损坏的文件,效率非常低下。 日志文件系统提升了文件系统的检查速度,但是意为着多了一次I/O操作,写入操作比ext2慢一些。 非日志文件系统在linux上只有ext2一个,对于一些数据完整性、安全性要求不高,特别是需要大量写入小文件时,ext2的优势就比较明显(比如临时文件等情况),对性能要求比较高的场景下。 一级磁盘块,最多来讲只指向十来个磁盘块,不管指针有多少个级,这些指针加起来所能引用的块的个数是有限的,这个限制就是单个文件最大的文件大小限度。 对于一个系统工程师来讲,更多的管理操作如下: 对普通用户看不见的,不需要看的,我们要看 文件系统有多大,超级块在上面位置,超级块的备份个数够不够,GDT在什么位置,备份数够不够,里面存放了哪些信息,分了多少个磁盘块,有没有产生磁盘碎片,需不需要修复,一共有多少个块组,哪一个块组中有碎片等等,更多的是新加入的磁盘需要分区,格式化,挂载,以及文件系统损坏需要修复。 给自己讲linux 2016-12-31 评论 1627 次浏览
停滞了一晚上的expect排错 学习嘛,总是有搞不清楚的时候。 今天晚上我被堵在expect中变量设置的大门前蹲了几小时。。。有些郁闷,就因为手抖了一下,就总是多敲了一个字符“=”,为什么会错在这里,因为我习惯于编程语言的习惯,变量的赋值是会有“=”的,于是我敲了一晚上,改了代码还不够,参数各种修改,整的我都不敢相信自己的眼睛了,我一遍又一遍的比对参考别人的代码,咳咳,几个小时愣是没看出来,我甚至都怀疑我的测试环境有问题…… 不过最后看起来好像还是自己的问题占大部分,终于在我不经意间瞟了一眼,答案就很明了了,我重新敲了一遍,咳咳,流畅无阻。再敲一遍,休息。 随手笔记 2016-12-30 评论 1638 次浏览
第三十讲——文件系统 文件系统是一个让我们在磁盘分区上创建文件管理的软件,本间系统本身跟某个特定的系统没有关系,它是内核中的功能。 我们将某个设备格式化为某个类型的文件系统的话,管理文件系统的软件(程序)在空间里面是一个用户进程,用户进程可实现将硬盘上的某个分区格式化为操作系统内核所支持的文件系统(高级格式化)。 mke2fs 创建文件系统,使用mke2fs 指定文件系统类型将硬盘的某个分区创建为ext2类型的文件系统。 文件系统属于内核的功能,但是创建文件系统需要用户执行命令结合内核所支持的功能来完成的。 linux操作系统支持的文件系统有:ext2、ext3、ext4、xfs、jfs等等 对文件系统发起的操作可能有: open 打开一个文件 close 关闭一个文件 create 创建一个文件 delete 删除一个文件 edit 编辑一个文件 这些应当是文件系统提供的基本功能,但内核中的子模块(文件系统)的系统调用都是由子模块提供的,这样一来文件系统的调用接口各不相同。 例如创建目录所支持的命令得支持多个文件系统,否则只能在某个文件系统上创建目录,这样的话就得添加很多重复的代码,为了方便调用,所以在文件系统上再封装上一层软件,这个软件能认识各个文件系统,但是它能够将不同文件系统的功能使用同一种统一的接口输出出来(类似于库),由这个软件进行翻译工作(VFS),虚拟文件系统,又叫伪文件系统。 VFS:virtual file system 虚拟文件系统 linux正是因为VFS(虚拟文件系统)的存在,才能够支持众多的文件系统。 FAT32,在linux上称为vfat NTFS Windows下的文件系统,linux默认是不支持的 ISO9660 光盘文件系统 CIFS通用互联网文件系统(windows) ext2/3/4 xfs、reiserfs、jfs(日志文件系统)、nfs(linux上的网络文件系统) ocfs2,(集群文件系统第二版),gfs2(全局文件系统第二版) 我们需要知道的是VFS也是内核中的功能。 对于Windows和linux,一个分区就是一个独立的文件系统,每个分区可以使用不同的文件系统,但最终都是归并在根目录下,通过挂载(或关联)的方式。 内核是与硬盘脱离的,或者说是高于硬盘的,我们要知道,内核工作起来之后是跑在内存中的,而且内核知道根在什么地方。 独立的分区在物理上是并行的,但是在逻辑上必须要有上下级关系。 根是一个逻辑概念,访问任何一个分区都要从根开始,根所在的分区称为根分区,也叫根文件系统,根分区下的目录并非都可以独立出去,比如/etc、/bin、/sbin等等 /etc /bin /sbin 必须要在根上 只有创建文件系统后才能被挂载或者关联到根下的某个目录上,作为其访问入口 我们关联一个文件系统,可以是直接从根开始 mount /dev/sdb /mnt/usb 也可以在别的挂载点中关联(挂载)。 给自己讲linux 2016-12-30 评论 1464 次浏览
第二十九讲——特殊文件 链接文件:链接文件在linux中分为两种 硬链接:直接指向相同inode的不同路径,彼此之间成为硬链接。 软连接:又称为符号链接,当我们访问一个符号链接的时候,实际上符号链接指向的是访问文件的路径,按字符存放,软连接的权限为777,但是最终的权限决定于被访问的文件。 Ls –l 命令中的第二个字段为 被硬链接的次数,当硬链接的次数大于2的话,我们删除这个文件不会真的删除,当硬链接的次数小2才会彻底的删除文件。 ln [ -s -v ] SRC DEST 硬链接:ln /etc/passwd /tmp/pwd 创建一个硬链接文件 不能够对目录创建硬链接,避免ABCA的死循环。 目录的硬连接数默认为2,因为目录中有一个当前目录(.), 硬链接不能跨文件系统,因为路径指向的为同一inode,不同文件系统都有自己的管理方式。 创建硬链接会增加文件被硬链接的次数。 软连接:符号链接 ls –s /etc/issue /tmp/is -s 创建软连接 -v 显示过程 软链接可应用于目录 软连接可以跨文件系统 不会增加被链接的次数 其大小为所指向路径所包含的字符数。 设备文件: b:块设备文件,按块为单位,可以随机访问的设备 存储设备,如硬盘 c:字符设备文件,按字符为单位,线性设备文件(有先后次序)。如键盘和硬盘 硬盘可以是线性的,也可以是随机的。 /dev下的设备文件,没有大小。 设备有主设备号(major number) 用于标识设备类型 次设备号(minor number) 用于标识同类型的不同设备。 创建设备文件 mknod 用于创建块或者字符设备文件。 mknod [ option ]… NAME TYPE [ major minor] 设备名称 类型 主设备号 次设备号 -m 创建时自定权限 777/644等等 设备文件的主要目的是用于作为设备文件的访问入口的,一般来说,内核会自动识别设备。 我们发往设备文件的内容会被指定到对应的设备上。但是如果我们echo “hello” >>/dev/sda就会直接覆盖掉硬盘最开始的一部分,也就是MBR。 不要轻易的向一个设备发送文件,这是很危险的操作。而且设备文件命名的方式很独特,不建议随意命名,像tty、pts等是用于标识某个终端。 硬盘设备的识别: 硬盘的文件名和硬盘的类型相关,根据硬盘接口的不同,其文件的标识也不一样。 IDE(ATA),hd开头 SATA、SCSI、USB接口的硬盘以sd开头。 如果同一类型的硬盘有多块,则以a/b/c/d区分同一类型的不同设备。 IDE:比较老的接口了,一般在主板上有两个IDE接口,而一根线可以接两块IDE硬盘,第一个接口上的第一块硬盘称为主盘,had,第二块称为从盘,hdb 第二个接口上的第一块盘称为主盘 hdc 第二块盘称为从盘 hdd 当主机上既有SATA又有USB硬盘时,则以内核识别的先后顺序来标识。 也可以通过UDEV来实现SATA1,SATA2,USB1等分别来标识,只是UDEV很麻烦,暂不介绍。 我们在同一块硬盘上可以有多个分区,主分区加扩展分区最多只能有四个,这是由于硬件制造的限制只有64byte的分区表,每16byte标识一个分区。 通过1,2,3,4对主分区进行标识,扩展分区下可以建立多个分区,称为逻辑分区,扩展分区是一个指针,指向更大的分区,扩展分区在硬盘上只能有一个。 不论主分区有几个,逻辑分区的编号一定是从5开始,且不能选择编号。 查看当前操作系统识别了几块硬盘: fdisk –l 列出所有磁盘及其分区 63 sector/track 平均每磁道有63个扇区 Cylinder:柱面 fdisk –l /dev/sda 列出指定设备下的分区,粉底刷卡还可用于管理磁盘分区 du -s /etc 查看目录大小(对每个子目录都做评估。) du /etc 查看目录中所有文件的大小 df 显示整个磁盘分区的使用情况 -i 查看inode的使用情况 -P 使df命令的显示在同一行 不加参数是查看当前磁盘分区中磁盘块的使用情况。 给自己讲linux 2016-12-29 评论 1397 次浏览
date 命令 date命令在脚本编写中常常会遇到,格式多变 date +%Y-%m-%d 是常用的格式 date命令参数说明 date %Y 取四位数年份 date %y 取年份后两位 date %m 月份 mouth date %d 天 day date %H 小时 hour date %M 分钟 min date %S 秒 sec date %s 时间戳 从1970年1月1日0时0分0秒 到当前时间的总秒数 date %F 能实现年月日的格式 date %T 能实现时分秒的格式 date %w 星期几 date %W 一年中的第几周 date -d @时间戳(秒数) 可以进行时间的换算 时间回溯 date -d “-1 day” +%F %T 回到昨天的这一刻 date -d “+1 day” 还可以是 +1 mouth +1 year +1 week -10 min -10 sec ………… 随手笔记 2016-12-29 评论 1625 次浏览
awk初涉 awk是一个相当强大的工具,怎么使用是一门艺术也是技术,有人说过awk的能力是由使用人所掌握的知识决定的。 不瞎扯了,还是回顾一下所学,先巩固一下正则中的一点东西 . 匹配任意一个字符(包含特殊字符) * 匹配前一个字符一次或者任意多次 .* 匹配任意字符任意多次,通常称为贪婪匹配 ? 匹配前面的字符零次或一次,比较严谨的匹配 + 匹配前面的字符一次或多次。 多说一句,+和? 在grep中需要加-E参数或使用egrep,在sed中使用需加-r参数,均为使之支持正则 前方高能,请多留意,先介绍一下awk的几个参数 $0 表示所有域(一行),linux中回车符为$,指定换行使用\n -F 指定定界符,不指定时默认为空格或者tab键 FILENAME 作为参数可以被调用,意为输入awk的文件名 NR 浏览记录的个数(行) NF 浏览记录的域的个数(列) OFS 指定输出的分隔符 awk -F ‘:’ ‘$3==”0″‘ {print$1,$3,$4} 1.txt $3==”0″属于精确匹配,注意等于是两个‘=’,单个则是赋值,也支持表达式 ‘$1~/root/’ 属于泛匹配,只要有‘root’的行都满。 ‘$1=$3+$4’ 属于表达式,输出时$1会被新的值替代。 awk -F ‘:’ ‘$1~/root/’ {OFS “##”; print}1.txt 注:OFS后加分号,不常用 赋值后原结构会发生改变,但可以重新指定分隔符 print 后不跟参数默认为$0 随手笔记 2016-12-28 评论 1686 次浏览