分类 "给自己讲linux" 下的文章

  磁盘存储是个比较重要的东西,包括磁盘的物理结构,数据管理形式,虽然比较繁复,但是用心整一整还是能够理解的。

磁盘:

  磁盘还是比较常见的,现在主流硬盘还是机械硬盘,虽然固态硬盘已经兴起,但是其高价格低容量还是让不少人观望,特别是受产能影响,价格攀升较大。

  像我们常见的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操作系统中,有一个生成随机数的变量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

查看用户的登录情况有三个命令 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中用户之间共享文件时,只能修改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权限(额外权限)




安全上下文中权限次序的确定

Ownergroupother

Ownerfacl,usergroupfacl,groupother

将一个文件被调用时的权限应用次序。




facl的设定不能超出mask权限,超出会被减去

setfacl -m mask::r - - /tmp/test

设定/tmp/test的facl权限最大为r - -

facl的权限取消

setfacl -x u:username(UID)|g:groupname(GID)

特殊权限在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

先瞎扯淡两句

常用变量的赋值:

  let sum=$sum+1-等价于 let sum+=1 -等价于let sum++




文件查找:

  locate:(很少使用)非实时,模糊匹配,查找是根据全系统文件数据库进行的,可能在刚装完数操作系统后无法执行该命令,因为数据库尚未生成,但是我们可以手动生成。

updatedb:手动生成文件数据库,执行此命令耗时较长,因为要将系统中的每一个文件记录下来。

  虽然locate是非实时的,并且是模糊匹配的,但是locate是基于数据库查询的,速度上比find更快。

  对于一个文件来说,如果属主被删除,那么该文件的属主将会变成属主的id号。




Find命令的特点:

  实时查找

  精确查找

  支持众多的查找标准

  遍历指定目录中的所有文件

  完成查找速度慢




find命令格式

  find 查找路径 查找标准 查找到以后的处理动作

  查找路径:不填写则默认为当前目录

  查找标准:默认为指定路径下的所有文件




-name 根据文件名查找(精确匹配)

-name ‘filename’ 文件名通配 * 任意长度任意字符 ?一个或零个字符 []括号内任意一个字符

-iname 文件名匹配不区分大小写

-regex parttern基于正则表达式查找

-user 查找,通过文件属主查找

-grep 根据文件属组查找

-uid 根据用户uid

-gid 根据用户gid

-nouser 查找没有属主的文件,我们应当定期执行此命令

-nogroup 查找没有属组的文件




-type 根据文件类型查找

f 文件

d 目录

c字符设备

b 块设备

l 链接文件

p 管道文件

s 套接字文件

-size 根据文件大小查找

-size xxK/M/G 默认单位为字节

-size +10K 大于10K

-size -10K 小于10K

-size -1M 满足0.xM的文件统统被认为满足1M

-size -10M 9.x-10M的文件都会显示

find /etc –size 10K –ls




组合查找:

-a 与 -o 或 -not 非 如果我们给了两个条件,则默认连接方式为-a

摩根定律:

find /etc –not -user1 -a -not -user user2

等价于 find /etc –not (-user user1 –o –user user2) 对括号内取反。

整个取反等价于单个取反把括号内的符号反过来(-a或者-o)

根据文件的时间戳查找

-mtime 修改时间

-ctime 改变时间

-atime 访问时间




-mtime # 在#天前(刚好#天前)访问过。

-# #天内访问过

+# 至少#天没有访问过

-atime +5 至少有五分钟没有访问过。




-perm mod(权限)权限精确匹配

  mod 精确匹配权限(九位)

-perm 644 精确匹配权限

  /mod 九位任意权限匹配则符合

-perm /644 任何一位

  -mod 包含权限内的文件全部在内,例如755包含644.

-prem -644 所有包含在644权限的所有权限




处理动作:默认为显示到屏幕

  默认为 –print(显示)

  -ls 类似于ls –l 显示文件的详细信息

  -ok command {} \;

  -ok 每一个操作都需要用户的确认

  -exec command {} \; {}为文件定位符

  -exec 不需要用户的确认,直接执行

  xargs 使用管道连接,xargs是从标准输入接收命令并执行

find /etc -size +1M |xargs echo {} >>/tmp/test.txt

  将查找到的文件路径写入文件,并且之间以空格隔开

find /etc –size +1M –exec echo {} >>/tmp/test.txt \;

  将找到的文件路径写入文件,每个文件占一行