第二十八讲——磁盘及文件管理 磁盘存储是个比较重要的东西,包括磁盘的物理结构,数据管理形式,虽然比较繁复,但是用心整一整还是能够理解的。 磁盘: 磁盘还是比较常见的,现在主流硬盘还是机械硬盘,虽然固态硬盘已经兴起,但是其高价格低容量还是让不少人观望,特别是受产能影响,价格攀升较大。 像我们常见的U盘,光盘,还有以前的软盘,磁带等都属于存储介质 我们常用的机械硬盘有机械结构,像内存等是电子设备,没有机械结构。 硬盘属于I/O设备,机械硬盘中有若干盘片,每个盘片都是双面可读写的,其每一面都有一个磁头,磁头是悬浮在磁盘表面几个微米的地方,所以当机械硬盘受到震动极易损坏。 机械硬盘中将盘片划分为若干个同心圆,每一盘片的每一个同心圆称为磁道,为了方便于数据管理,磁道是划分为扇区的。 扇区:sector,扇区中存储用户的数据和扇区自己的编号(扇区的位置:扇区号,磁头号,磁道号,碟片号等等)。一般来说每一扇区的大小为512bytes Sector size:512bytes 512字节 机械硬盘的发展过程中,容量的变化很大,但是速度上却没有什么变化。 当我们存储较大的数据时,会向所有的盘片上同时写入数据。 所有盘面上相同编号的磁道称为柱面:cylinder。 我们为什么要分区? 分区是在逻辑上将物理磁盘划分为多个分区,每个分区可以是一个单独的文件系统,如果不划分分区,那么一个磁盘上只能存储一个文件系统,分区实际上就是整个磁盘的逻辑边界。 磁盘的分区是按照柱面进行的,而文件系统为了加速存储也是按照柱面进行存储的,所有的磁头都是固定在一个机械臂上的 机械硬盘上的读写延迟: 一是磁头的移动速度 二是盘片的旋转速度(速度越快,散热也就越大) 一般硬盘: 5400r/min 7200r/min 工业级(SCSI) 10k/min 15k/min 衡量磁盘的一个重要指标:平均寻到时间 机械硬盘中是真空的,并且不能有杂质,避免灰尘的干扰,高速运转会产生摩擦。 I/O ps 每秒钟完成的数据读取量,磁道越是靠外,读取速度越是快。 硬盘的格式化分为两种 一是低级格式化,低级格式化是厂商完成的。 二是高级格式化,就是在分区上创建文件系统。 硬盘的第一个扇区我们称为(MBR)master boot record 主引导记录 MBR的大小为一个扇区的大小:512bytes 512bytes划分为三个片段: 第一个片段:446 byte 这一段空间中写入了一段程序,boot loader引导加载器 第二个片段:64 byte 每16 byte标识一个分区,所以一共只能标识四个分区 第三个片段:2 byte 魔数,magic number 用于标记MBR是否有效 当MBR损坏时,操作系统将无法启动。 数据存储方式: 文件系统是一个软件,其本身不是在某个分区上,但是文件系统中的数据是在分区上的,文件系统是一个管理软件。 首先我们在分区上建立一个文件系统,也就是安装一个软件,文件系统在逻辑上将底层的扇区整合成若干个逻辑存储单元(block),方便文件管理,然后再此基础上划分出元数据存储区和数据存储区(为了方便理解这样划分,其实际上比这个复杂得多),数据我们知道,但是元数据是什么? 元数据: 百度百科里是这么说的,为描述数据的数据,主要是描述数据的属性的信息,又称为中介数据,中继数据。元数据是一种电子式目录,为了达到编制目录的目的,必须描述并收藏数据的内容或特色,进而达成协助数据检索的目的。 元数据关于数据的组织,数据域及其关系的信息,简而言之,元数据就是关于数据的数据。在linux中,我们可以认为inode就是元数据。 元数据(inode)中存放了每一文件的属主、属组,扩展属性,权限大小,时间戳和文件数据无关联的数据。 Inode可以直接指定磁盘快,当文件太大的时候,还可以间接指定磁盘快,有二级间接目录,三级间接目录,来制定存放数据的磁盘块在哪个位置,因此这个条目无论是通过直接还是间接,最终能够引用多少个磁盘块决定了单个文件的大小,例如fat32单文件最大限制为4G。 在大型数据库中,单文件达到TB、EB是很常见的,一个文件系统对单个文件大小的支持是一个基本衡量标准,选择文件系统时,要考虑到将来磁盘要扩展到多大。 在linux操作系统中,所有文件都是从根(/)开始,内核会自引用根。 文件名是保存在目录中的,而目录也是文件。 我们需要注意的是inode中是不存储文件名的。 那么问题来了,我们在文件系统划分出来的元数据区域上怎么才能知道哪些块已经使用,哪些没有使用,逐个遍历的方法固然有效,但是每次都去遍历会极大的耗费时间,于是就将元数据区域的一个块拿出来做成元数据位图(bit map),元数据位图中的每一位与一个元数据块对应,并用0或者1标记,已使用为1,未使用为0,然后只需要查看元数据位图就可以知道哪些使用哪些没有使用。相应的,为了方便数据查找数据区的有无,也适用于数据块,在涉及到的时候再详细讲。 我们上面讲到了,文件名是放在目录中的,目录是文件,所以目录也会占据磁盘块,目录不是容器。 目录文件中会存储对应文件的文件名,以及其inode号。目录只是一个路径的映射表。 当我们需要找到/var/log/messages时 先在元数据存储区上找到根所对应的条目,这个条目指向了根的存储空间,在其中找到var及其inode号,再回头从分区上的元数据区通过inode号找到var所对应的条目,找到var的存储空间,在var的存储空间中找到log以及其对应的inode号,返回元数据区通过log的inode号找到log的存储空间,在log的存储空间中找到messages以及对应的inode号,再返回元数据区通过messsges的inode号找到对应的条目指向的存储空间(存储块)。 Linux操作系统会将访问过的条目放入缓存,减少重复操作,提升效率。 好了,我们现在有了数据访问的大概形式,实际上在我们建立好分区后,并不是直接划分出元数据区,位图区,而是将我们的整个磁盘分区划分为几个逻辑组,可以理解为分区下的子分区,但是这个子分区对用户是不可见的,我们称之为 块组(block group),每一个块组的第一个块称为超级块(超级块:全局描述信息),即每一个块组都有自己的块位图,inode位图等等。 我们在目录上新建一个文件,首先要扫描文件的父目录是否存在,扫描inode表的位图,寻找空闲的inode占用,再找到目录对应的inode,通过inode信息找到其指向的存储块,在这个磁盘块上有一个目录表,将刚刚找到的空闲inode和文件名写入目录表,扫描空闲磁盘块(块位图),拿出八个块存储数据,(为保证数据在存储空间上的连续性,避免跳跃读取,避免交叉存放降低访问速度,没有使用的磁盘块会被释放。)当我们不断地创建不断删除文件,会使不连续的空间增多(磁盘碎片)。 删除一个文件: 首先将目录上对应的条目删除 再将对应inode号标记为空。 也就是说,我们删除一个文件,实际上只是删除了其文件名和inode位置零,其数据还是存在,这就使数据恢复成为了可能。 我们可能会用到一个叫做文件粉碎机的软件,它的作用不仅仅是删除对应的条目,还会使用一堆随机数将原来的数据覆盖掉。 我们在同一个文件系统上,剪切比复制快,因为剪切只是将目录对应的路径放到其他相应的地方。其inode磁盘块都不变,只是将文件名和inode号转移到其他目录。 给自己讲linux 2016-12-28 评论 1477 次浏览
第二十七讲——随机数和case语句 在这之前我们先来讲一讲随机数,这个同存储关系不大,只是把这一块内容放在了这里。 随机数对于加密机制很重要,产生的数据数越是随机越是安全。在配置服务器集群时验证会用到大量的随机数,当随机数使用完的时候,程序可能会让你干点别的什么事情,比如随便输一点什么,敲敲键盘,以此产生随机数。 在linux操作系统中,有一个生成随机数的变量RANDOM,其产生的随机数是0-32768,这个是通过软件的形式产生随机数,RANDOM是一个内置的环境变量。 除了软件产生的随机数,我们还有随机数生成器 在随机数生成器使用时会有一个熵池的概念。 熵池:一些硬件的中断,发起请求的次数或者是时间的间隔当做随机数,保存在熵池中,当需要的时候到熵池中去取,熵池中的随机数拿走一个就少一个,所以会有随机数不足的情况。 随机数生成器: /dev/random:当熵池中的随机数抽取空后会阻塞进程。(更安全) /dev/urandom:当熵池中的随机数取空后,会以软件的形式生成随机数(更方便),在安全要求不严格的情况下使用。 在面向过程的编程语言中,通常有这么几种结构,顺序结构,选择结构(单分支,双分支,多分支if语句,在多分支时使用if语句的效率是比较低的,还有case语句可以选择),循环结构。 Case switch(变量的值) in Value1) value可以使用正则 [0-9] [a-z] Statement ;; Value2) 当value为字符串时使用单引号引起来。 Statement ;; Value3) Statement ;; *) Statement ;; esac 给自己讲linux 2016-12-27 评论 1476 次浏览
第二十六讲——查看用户登录情况 查看用户的登录情况有三个命令 whoami who w Who命令一共有四个字段 第一字段:用户名称 第二字段:用户从哪个终端登录 第三字段:时间 第四字段:注释,从哪个IP连接 用户要登录操作系统,要么是借助远程接入物理设备登录,要么是本地接入键盘显示器登录,所以登录操作系统必须要关联到某个硬件上面,这就是所谓的终端。 早期没有PC机,几乎所有使用计算机的人都是拿着键盘和显示器,通过一些分频的接口接入,大多都是模拟、虚拟出来的。 终端的类型: 控制台:直接连接到当前物理设备上的硬件和键盘,控制台不是终端,它只是一个连接到物理设备的显示界面。 我们所说的终端,都是用户可以登录的,可以验证用户身份的硬件设备,是一个软硬件的结合。 Console(VGA)控制台 当开机时没有用户时显示的一些信息的界面 Pty (VGA)物理终端 当计算机没有用户时显示的一些信息的界面 tty 虚拟控制台,通常都在本地,并且是附加在某个物理终端上的虚拟终端 tty就是以软件的形式附加在VGA卡的终端上的。 对于一个纯字符界面来讲,么有显卡也是可以正常输出字符信息的。 ttys 串行终端,没有VGA芯片的主机。 Pts/# 伪终端(假的,不存在的),在伪文件系统上生成的。 使用远程登录连接的,或者图形界面中的shell都是伪终端,当我们进入操作系统(用户)启动一个shell进程,并且与系统进行交互,这个shell一定是关联到某个终端上的,或者说关联到控制台上的。 Who -H 显示头部信息(每个字段对应的解释信息) -r 显示运行级别 我们需要注意的是 su过去的用户并非是登录用户 Sleep 让程序睡眠指定的时间单位为秒 w:显示的信息比who更为详细 和系统用户登录的相关文件及命令: last:显示/var/log/wtmp文件中登录历史,以及系统重启历史 -n# 只显示最近#次的登录信息 last:显示/var/log/btmp文件中的错误登录历史(错误的登录尝试) -n# 只显示最近n次的登录信息 lastlog: 显示每一个用户最近成功登录的信息 -u username 指定用户名查看,(显示指定用户) 文件管理相关: basename :直接取路径的基名,即最后一段,文件名或者目录名。 $0 为脚本文件的文件名。(脚本路径及名称)为特殊变量 mail 本机中的所有用户之间的通信,系统中有很多的自动任务,这些自动任务会监控系统资源的使用状况,一旦有信息就会发邮件提醒管理员,所以内部信息都是通过邮件发送的,当前系统的每一个用户都可以收邮件,都有自己的邮箱。 mail 接收邮件,如果有邮件直接输入编号查看,看完后退出 d删除邮件 r回复邮件 邮件存放于~/mbox文件中 mail –s 指定邮件标题 echo “how are you?” |mail -s “Hi‘’ root 邮件正文 指定标题 收件人 邮件的正文也可以cat一个文件,也可以输入重定向 mail –s “Hi” root < cat /etc/fstab 主机名信息查看 hostname: 显示当前主机名(实时) 也可以 echo $HOSTNAME hostname:也可以用于修改主机名 hostname www.linuxhobby.top 修改主机名为www.linuxhobby.top 当主机名为空、’none’ 时将主机名修改为linuxhobby.top [ -z `hostname` ] || [ `hostname` == ‘(none)’ ] –o [ `hostname` == ‘localhost’ ] && hostname linuxhobby.top 给自己讲linux 2016-12-26 评论 1424 次浏览
sed中的贪婪匹配 还是拿/etc/passwd练手,虽然我有点不厚道,但是这个文件是个绝好的靶子,罪过罪过,copy谨慎操作。 首先整一个目标文件 cd /tmp for i in `seq 1 3`; do cat /etc/passwd>>./1.txt; done 解释以下,seq作为一个数列 开始进入正题,贪婪匹配,先来上一个例子 sed -n -r ‘s/([^:]+)(:.*:)([^:]+$)/\3\2\1/’ 1.txt -n 仅输出sed处理的行 -r 使sed支持正则 () 小括号的作用是划分字段,第一个字段为开始到第一个冒号前,第二字段为第一个冒号后到最后一个冒号前,第三个字段为最后一个冒号后。 \3\2\1 数字代表第几字段,此处将1/3字段调换位置。 + 匹配前面一个字符一次或者多次,[^:]+此处为匹配非冒号字符一次或者多次 再举一个例子,本来想整个谐音字,但是想了想,还是要正规用词,毕竟我是个有理想有追求的人,哈哈哈 echo abc123abc 使输出为123abc 和123 echo “abc123abc” |sed -r‘s/([a-z]+)([0-9]+)([a-z]+$)/\2\3/’ 123abc echo “abc1223abc” |sed -r‘s/([^0-9]+)([0-9]+)([^0-9]+$)/\2\3/’ 123 随手笔记 2016-12-25 评论 1753 次浏览
第二十五讲——文件系统访问列表 在linux中用户之间共享文件时,只能修改other权限,特殊权限一般情况下不使用,如果使用的话文件的风险将会大大增加。 我们要知道,对普通用户来说是不能改变文件的属主属组的(只有root用户才可以)。 所以,普通用户不能通过修改文件的属组来完成文件的共享。 FACL:文件系统控制访问列表就解决了普通用户间共享文件的问题。 FACL是利用文件的隐藏属性或者扩展属性保存额外的访问控制权限,这个访问控制权限可以被再次定义。 当我们对一个拥有扩展属性的文件进行复制或者是归档的时候,其扩展属性可能不会被复制,需要特殊选项或者命令。 Setfacl 设置facl getfacl 获取facl setfacl -m 设置 u:UID 设定用户权限 g:GID 设定组的权限 d:u d:g 对目录的访问控制列表,用的很少 setfacl -m u:hadoop:rw /etc/passwd 设定Hadoop用户对/etc/passwd文件具有读写权限(额外的权限) Setfacl -m g:mygroup:rw /tmp/test 添加mygroup对/tmp/test的rw权限(额外权限) 安全上下文中权限次序的确定 Ownergroupother Ownerfacl,usergroupfacl,groupother 将一个文件被调用时的权限应用次序。 facl的设定不能超出mask权限,超出会被减去 setfacl -m mask::r - - /tmp/test 设定/tmp/test的facl权限最大为r - - facl的权限取消 setfacl -x u:username(UID)|g:groupname(GID) 给自己讲linux 2016-12-25 评论 1484 次浏览
第二十四讲——特殊权限 特殊权限在umask中为第一位所以umask为四位 SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者。 SGID:运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者的属组 Sticky:在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人的文件。 当一个用户启动一个程序时,系统会判定这个用户是不是这个文件的属主,或者这个文件的属组,都不是的话看其他人是否具有执行权限,如果其他人有执行权限,则程序运行产生一个进程。这个进程的属主为执行这个程序的用户,属组为这个用户的基本组,对其他文件的访问权均依照该属主的权限。 这个进程的属主为执行这个程序的属主,属组为这个用户的基本组,对其他文件的访问权限均依照该属主属组的权限。 但是,当这个程序(文件)具有了SUID权限的话,当启动一个进程后则是以该程序属主执行,该进程的属主也是源文件的属主。 当我们期望一个用户以管理员的权限或者另一个身份运行某个进程的时候,才给与的特殊权限。 给文件添加特殊权限。 添加SUID: Chmod u+s filename Chmod u-s filename 如果源文件本身就有执行权限,则显示为小写s 如果源文件本身没有执行权限,则显示为大写S 当我们写一个脚本,期望它获取系统的某些属性时,要给予SUID权限 添加SGID权限: Chmod g+s Chmod g-s 在目录有了SGID权限后,用户在目录下创建的文件的属组不再是用户的基本组,而是目录的属组 添加sticky权限:通常是针对目录而言 Chmod o+t Chmod o-t 原来有执行权限显示为小写t 原来没有执行权限显示为大写T SUID SGID sticky 三位凑成umask的第一位权限, SUID 4 SGID 2 Sticky 1 给自己讲linux 2016-12-24 评论 1430 次浏览