第三十五讲——脚本编程中的控制结构 插一段脚本编程中的控制结构: 顺序结构 选择结构 if、case if 条件;then 循环语句 fi case 变量 in value1) 语句 ;; value2) 语句 ;; *) 语句 ;; esac 循环结构 for、while、until for 变量 in 队列; do 循环语句 done for ((expr1;expr2;expr3)); do 类似于C语言中的for循环 循环体 done expr1:第一个表达式,用于限定控制变量的初始值。 expr2:判定什么时候推出循环 expr3:修正这个变量的值 while 条件(满足条件循环); do 循环条件 done until 条件; do 循环语句 done 题外话:ping命令。 -W(大写):等多长时间响应,单位为秒,在等待时长中没有响应则假设其不在线。 -c :限定请求的次数 –c 1 只ping一次,linux中只要不停止就会一直ping。 给自己讲linux 2017-01-04 评论 1405 次浏览
第三十四讲——文件系统的挂载 我们要知道一点,linux操作系统没有写入配置文件的操作都是临时生效,重启后之前的操作不生效。所以,我们使用mount命令挂载的文件系统,在系统重启之后不会自动挂载,系统在开机的时候,内核会分析/etc/fstab这个表,并将写入这张表中的设备自动挂载起来。 我们使用df –h 可以看到当前操作系统已经挂载的设备。 在/etc/fstab文件中一共有六个字段 第一个字段:设备(要挂载的设备) 可以使用卷标来指定,也可以使用设备文件来指定,还可以通过UUID进行指定 第二个字段:设备的挂载点,设备的挂载点必须是目录,如果挂载之前目录中有文件存在,则目录中的文件会暂时隐藏。 第三个字段:文件系统类型,格式化为什么类型就是什么类型 第四个字段:挂载选项,默认为defaults(defaults为mount命令中的复合命令。)若文件系统要开启acl权限,则要在此处声明,默认是不开启acl权限的。如果要开启acl,在defaults,acl (中间使用逗号隔开) 第五个字段:转储频率,转储频率和文件系统的备份相关,备份有完全备份和增量备份,转储频率用于定义文件系统多少天做一次完全备份。 0 为不备份 1 每天都做一次完全备份 2 两天一次完全备份 一般来讲,我们自己添加的文件系统都不备份,设置为零 第六个字段:文件系统开机时文件系统的检测顺序,一般来说,只有根为1,其他都可以为2(同时进行),0 表示不检查。 文件系统挂载要求: 挂载目录存在 挂载目录没有其他进程使用 如果目录中有文件,则挂载文件系统后,原目录中的文件会被隐藏。 挂载成功后需要通过挂载点访问对应的文件系统。 mount 命令的用法: mount [option] [-o option] DEVICE MOUNT_POINT [option] 为mount的选项。 [-o option] 为挂载文件系统的功能选项。 mount -a 挂载定义在/etc/fstab中的所有文件系统。 mount 不加任何参数时,可以查看当前系统中挂载的所有文件系统(mount命令是查看/etc/mtab中的信息),当我们挂载成功一个设备的时候,会自动保存在/etc/mtab文件中,如果我们在挂载是可以指定不将信息写入文件则文件中就不会存在设备的挂载信息。 mount /dev/[sh]d[a-z]# 挂载点 也可以使用卷标,或者UUID挂载文件系统。 -t 指定文件系统类型,大多情况下会调用blkid命令获取对应的文件系统类型。 -r 只读挂载(挂载光盘的常用选项) -p 读写挂载(一般都为读写挂载) –n 挂载时不将信息写入/etc/mtab文件。 -o 指定额外的挂载选项,即指定文件系统启用的属性。 async 异步写入(这个概念很重要),为默认的挂载选项。CPU对数据操作是先将数据加载进内存,并将数据保存在内存中,再写入磁盘,这个过程称为异步写入。一般来说,次哦按都为异步写入。 defaults (/dev/fstab中定义的选项)defaults包含很多其他的默认的选项,是一个选项的集合。 defaults中默认的选项为: dev:如果挂载设备上有设备文件是否启用(允许),也就是说,被挂载的文件系统中存在挂载点,或者设备文件。 exec:允许这个分区上具有可执行权限的可执行文件运行起来,挂载U盘时可使用noexec不启用,这样可以避免绝大部分的U盘病毒。 async 异步写入。 -o选项下的其他选项: _netdev: 如果一个网络设备连接不上可自行跳过,这个在网络文件系统中非常有用,因为linux操作系统当挂载不上网络文件系统,会一直尝试,直至挂载成功。 remount 重新挂载当前文件系统(先卸载,再挂载) ro(read only):挂载为只读 sync 同步写入 suid:一定不要给外来设备启用SUID,使用nosuid不启用,危险操作。 atime:每访问一次就更改其时间戳,但是这是相当耗费I/O资源的。在服务器被频繁访问时,atime无意义,所以关闭:noatime 在使用-o 下的多个选项的时候,使用逗号将每个选项分隔开。 很多时候我们会遇到一个设备无法卸载,说这个设备正忙,有时候就会很头疼,忙啥忙啊,能不能愉快的玩耍了? fuser –v 设备文件 当一个设备正在使用中无法卸载时 -v 查看文件上有哪个进程正在使用 -k 将正在访问文件的进程杀掉 -m 如果是一个挂载点的话-k需要加-m选项。 fuser -km /mnt/yum 将挂载点上正在访问的进程结束,这就意味着将访问用户的bash结束,此用户将被踢出操作系统。 给自己讲linux 2017-01-03 评论 1529 次浏览
echo语法加亮规则 echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串。 linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时 候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段 文字,一般起到一个提示的作用。 echo(选项)(参数) 选项 -e:激活转义字符。使用-e选项时,若字符串中出现以下字符, 则特别加以处理,而不会将它当成一般文字输出: \a 发出警告声; \b 删除前一个字符; \c 最后不加上换行符号; \f 换行但光标仍旧停留在原来的位置; \n 换行且光标移至行首; \r 光标移至行首,但不换行; \t 插入tab; \v 与\f相同; \\ 插入\字符; \nnn 插入nnn(八进制)所代表的ASCII字符; 参数 变量: 指定要打印的变量。 用echo命令打印带有色彩的文字: 文字色: echo -e"\e[1;31mThis is red text\e[0m" This is red text \e[1;31m 将颜色设置为红色 \e[0m 将颜色重新置回 颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33, 蓝色=34,洋红=35,青色=36,白色=37 背景色: echo -e "\e[1;42mGreed Background\e[0m" Greed Background 颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43, 蓝色=44,洋红=45,青色=46,白色=47 文字闪动: echo -e"\033[37;31;5mMySQL ServerStop...\033[39;49;0m" 红色数字处还有其他数字参数:0 关闭所有属性、 1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐 随手笔记 2017-01-03 评论 1633 次浏览
第三十三讲——文件系统的格式化 我们怎么知道当前操作系统内核支持什么文件系统? cat /proc/filesystems 可以查看当前操作系统支持的文件系统,实际上远远不止这些,由于内核编译时可能没有选择将文件系统编译,就需要重新编译内核或者使用第三方的软件来支持文件系统。 我们在给一个分区上创建文件系统的时候,它会把分区中5%的block预留给root用户,一旦当分区填满之后,管理员做一些修复工作时还会有多余的空间可用,对于一个大的分区来说,5%的预留是非常浪费的,一般来说预留1G的空间就足够了,因此百分比是比较粗糙的,将来我们可以知自己指定。 我们在格式化一个分区的时候会显很多的信息,例如有多少个块,有多少块组,每个块组中有多少个块,每个块组中有多少inode,块大小等等。 我们通过比对可以发现,我们默认的块大小为4K,块的个数大约是inode个数的两倍,所以可以推算出来大概每两个块一个inode,我们还可以看到super block以及super block备份到了哪些磁盘块上。 在日志文件系统中我们还可以看到有一个journal(日志)空间的创建。 mkfs命令对分区进行格式化,我们使用which mkfs可以发现mkfs是一个独立的命令,但是我们使用-t指定文件系统类型的时候会调用其他程序,例如: mkfs –t ext2 = mkfs.ext2 mkfs –t ext3 = mkfs.ext3 我们指定文件系统类型后调用的是后面的命令。除了ext系列的文件系统,mkfs是用于所有内核支持的文件系统,mkfs –t vfat 创建一个fat32格式的文件系统。 任何内核支持的文件系统都可以通过mkfs来进行指定文件系统的类型。但是如果我们要专门管理ext系列的文件系统,我们还有一个专门的命令:mke2fs mke2fs /dev/不跟任何参数时,默认创建的是ext2文件系统 mke2fs –j 创建为ext3文件系统 mkse2fs –t ext2/ext3/ext4 -t选项可指定文件系统 -b 指定blocksize的大小,默认为4096字节,-b可用的取值为1024/2048/4096. -L 指定文件系统的卷标(分区的名称),指定卷标的好处是,如果系统上同时挂载了SATA、SCSI、USB等硬盘设备,挂载之后重启时内核对其识别的顺序可能不一样,也就是说设备名称乱掉了,但是哟了卷标之后,我们直接使用卷标访问,或者使用卷标进行自动挂载都是可以的,卷标还可以通过其他命令重新指定、修修改。 -m # 指定预留给超级用户的 -i 指定字节同inode的比率,也就是说,给多少个块创建一个inode,默认为8K,字节数应当为块的倍数 -N 指定要创建的inode的个数 -F 强制格式化,当一个文件系统处于挂载状态是不允许格式化(创建文件系统的),若需要格式化,可以使用-F选项。 -E 用指定额外的文件系统属性 blkid 命令,查看查看磁盘分区相关属性。用于显示block设备的属性,或者定位block属性。 UUID:全局的统一标识符,UUID是由操作系统命令自动生成的一串随机数,用于唯一标识磁盘。 TYPE:文件系统的类型 在磁盘设备非常多的情况下,使用UUID来标识唯一的文件系统,在有的分区上会看到 SEC_TYPE=”ext2” :安全类型为ext2 TYPE=”ext3”:实际类型为ext3 blkid命令还可以用于查看卷标。 对于ext系列的文件系统,还有专门的命令用于修改卷标 e2label /dev/sd[a-z]# LABEL 指定的设备文件 指定卷标 调整文件系统属性(无损数据进行调整) 将ext2 升级为ext3 tune2fs -j /dev/sd[a-z]# 将文件系统加上日志功能,创建为ext3,不损害原数据,将ext2升级为ext3. 对文件系统的降级是不可以的,但是我们可以不启用日志功能。 块大小接近物理属性,不能更改 tune2fs 还能够调整文件系统信息。 -L 用于设定卷标(或修改) -m 调整管理员预留百分比 -r 指定预留块数(不能同-m一起使用) -o 设定默认挂载选项 -c 指定达到多少次挂载次数自检 0或者-1 表示不自检(关闭自检功能) -i 指定每挂载使用多少天自检 0或者-1 表示不自检(关闭自检功能) -l 显示超级块中的信息(当前分区中super block里的信息) acl,挂载时如果不指定acl,文件系统时不支持acl的。 我们默认安装文件系统的时候,文件系统是有自检设置的,按挂载次数和挂载天数自检,如果我们数据库很庞大,文件系统突然启动自检,会发现磁盘I/O被自检大量占用,正常访问都无法进行。 tune2fs –l /dev/sd[a-z]# 显示超级块中的信息。 其中filesystem state状态为clean则不需要修复。 dumpe2fs /dev/sd[a-z]# 显示文件的属性信息,相当详细,除了super block中的信息,还有块组的信息,以及超级块的备份位置等等。 super block一般在0.1.3.5.7.9组中有备份, dumpe2fs –h /dev/sd[a-z]# 只是查看分区中超级块的信息。 如果文件系统出现了错误应当自检,如果不自检,可以手动检查。 fsck 检查并修复文件系统,不指定文件系统是,fsck会通过blkid命令识别文件系统类型。 -t 指定文件系统类型 -a 自动修复(不询问) 如果不指定-a选项,会询问是否修复。 e2fsck 专用修复ext系列文件系统 -f 强制检测 -a(-p) 自动修复,-a为了兼容fsck命令。 fsck与mkfs对于不同的文件系统都适用。 给自己讲linux 2017-01-02 评论 1568 次浏览
第三十二讲——磁盘的分区 磁盘的分区命令:fdisk fdisk /dev/sda 会产生一个交互式界面 m:帮助信息 p: 显示分区信息 n:新建磁盘分区 d:删除磁盘分区 w:保存并退出 q:不保存退出 l: 查看文件系统类型 t:修改文件系统类型 在此选项下也可使用l/L查看支持的文件系统类型 新建分区时指定起始柱面。一般为默认即可 结束柱面的指定,一般使用大小指定,单位为M、G 建立好一个分区时,系统内核并不会立即识别,我们需要通知内核联系当前系统上的所有磁盘 partx /dev/sda 也可指定某一磁盘 partprobe 老版本的命令 更新内核识别后我们可以查看/proc/partitions cat /proc/partitions 会列出当前内核识别的分区 任何一个分区想要使用都要创建文件系统,要想创建文件系统就意味着,我们要利用内核中内核的文件系统模块,在对应的设备上划分出组织结构。 swap分区 在早期内存算是一种比较昂贵的资源,在此场景下物理内存无法满足我们的需要。 我们的操作系统内核是一个虚拟机,它将我们底层硬件所提供的计算能力虚拟成接口,能够让多个进程并行运行。将资源通过分时共享:time share,或者多路复用:matiplex,将资源分成几份,然后每个进程都可以使用一份。 CPU的虚拟,将CPU的计算能力划分成时间片,time slice。CPU所提供的计算能力是按照时间的流逝来完成的。 I/O设备是通过多路复用来完成 X86系列CPU上(32位),尤其是从80286开始,我们的内存当中引入了所谓的虚拟地址的概念,也称为线性地址、内存就是可编址的存储单元,所以进程在访问内存设备的时候,我们内存中的存储空间每一个字节被称为一个cell(存储单元,存储格),每一个存储格都是由地址的,所以CPU到内存中访问数据时是根据地址来查找的。 地址总线就是负责寻址的,CPU通过地址总线能够找到对应地址的存储单元,而后通过数据总线将数据读取出来,(读取数据是在控制指令的控制下完成数据读取的。),进程是跑在内核之上的,虽然线性空间是4G(32位CPU),但内核会占用一部分,这就意味着进程并不能直接使用4G,而是划分为两段,这个地址空间是虚拟出来的,假的、不存在的,真正的数据还是存放在物理内存当中,虽然出去内核占用的空间,进程都能够使用,但并不代表进程会完全占用整个剩余空间(进程管理),大多数进程空间是分页的(页框,page)。 在物理内存上,内存空间被分成一个一个的页框,每4K一个页框,可以放一个页面的数据,而后每一个进程真正使用的数据会被转换映射到内存空间中去。 数据在物理内存空间中很可能是不连续的,数据是交替存放的。 虚拟地址是假的,每一个进程都以为自己使用了全部的地址空间,而事实上由内核将虚拟地址空间转换到物理内存当中。 进程在虚拟地址上上是看不到其他进程的存在的。万一物理内存中没有页框了,但是进程还需要使用内存,进程是意识不到内存快占满了,进程会继续向内核申请地址空间来装数据。这个时候内核会采取折中的办法,将硬盘中的虚拟内存(特殊分区,linux中为swap分区)划分为一个一个的页框,模拟成物理内存,将物理内存中较少使用的页框挪到虚拟内存当中,然后就腾出一段空间。 当内存中的数据,被挪到虚拟内存中时,内核会消除其物理内存的指向关系,但是内核会维护一张表,里面保留了数据的指向关系。当进程使用的数据存放在虚拟内存中时,内核会将进程的申请拦截,并再次将其他暂时不使用的数据挪到虚拟内存中去,将要使用的数据挪到物理内存中,并像进程给出指向关系。 这个过程就称为换进换出的过程,这个硬盘上的空间称为交换空间,交换空间的存在允许我们的内存过载使用。 在linux上,交换空间是一个分区(swap分区) 我们将内存中的数据放到磁盘上的过程称为page out,将内存中的数据取回的过程称为page in 相对应的,站到swap的角度来说,内存中的数据存入swap分区为swap in,将swap分区的数据读入内存叫做swap out。 当操作系统频繁有页面数据换进换出,很有可能是由于物理内存太小,虚拟内存只能用于应急使用,数据换进换出的效率低下,且硬盘的读取写入相比内存会慢很多。 CPU中的寄存器是存储空间中速度最快的,大概是1纳秒完成访问,一级缓存和二级缓存大概需要10纳秒左右,内存的完成访问时间在10毫秒左右,硬盘的访问时间可能是以秒为单位。 当我们使用交换分区的时候,会使系统的性能大受影响,如果不得不使用swap交换空间,我们应将swap分区放到靠外的磁道上。 free 命令,查看当前系统物理内存和交换分区的使用情况,默认是以字节为单位显示空间大小 -m选项以M为单位显示内存和swap交换分区的使用情况。 free 命令结果的中的buffers和cached buffers:缓冲,缓冲是避免慢的设备遭受冲击。 buffer中通常存储元数据,例如使用过的inode放在buffer中。 cached:缓存,缓存是快速设备向低速设备读取数据的中介(中间设备) cached中通常存储数据,保存元数据对应的数据。 缓存中也涉及交换,但是缓存中的数据只是往外交换,并不影响数据本身。 buffer、cached是为了提高计算机的性能而设定的。 创建交换分区(swap分区) 在fdisk中新建分区,并调整为linux swap类型(82),而后使用mkswap命令(交换分区的格式化命令) mkswap /dev/sda# 将新建的linux swap类型的分区格式化为交换分区。 也可以在格式化的时候指定卷标 swap:-L LABLE 创建分区----高级格式化----挂载 swap交换空间的挂载和格式化都较为特殊。 swap分区的挂载点比较独特:swap 挂载点为swap 文件类型为swap 挂载:swapon /dev/sda# 启动swap分区 swapoff /dev/sda# 关闭swap分区 当swap空间不够使用,且磁盘上已经没有空闲空间来创建新分区,但是某个已经挂载的设备上还有空闲的空间,在这个空闲的空间上使用软件的方式模拟硬件来创建一个镜像文件,将这个镜像文件当做设备来使用。模拟出来的镜像文件甚至可以分区格式化,挂载,很可能镜像文件看起来不到20M大小,但是fdisk查看却有120G。 无论是Windows还是linux都支持本地回环设备,loopback,回环设备。 dd 命令: dd命令是用于复制文件的,用法格式比较特殊。 dd if=input file of=output file 输入的文件或者数据(指定数据来源) 保存到什么地方(存储目标) dd和cp不同之处在于: cp命令是通过文件系统读取出来(内存中),再粘贴到我们制定的位置。cp命令是通过VFS接口,以文件为单位读取到内存中,然后保存到另一个文件所对应的区域。 对于dd命令来讲,它不通过VFS,二是直接将文件所对应的1.0代码复制。 dd命令可以只复制文件的几个字节, bs=1024(字节)bs为blocksize count=2(以bs为单位,一共复制两次) dd命令强大到无以复加的地步,甚至可以帮助我们备份MBR dd if=/dev/sda of=/tmp/MBR.backup bs=512 count=1 这里直接指定的硬盘,没有指定文件,那么就会从硬盘最开始处开始复制,当我们需要还原MBR的时候: dd if=/mnt/MBR.backup of=/dev/sda bs=512 count=1 dd命令还可以直接将光盘中的数据抽取出来做成iso文件,cat命令也可以实现 cat /dev/cdrom >/tmp/test.iso 没有指定文件,直接指定设备的时候,cat会一个字节一个字节的取读取。 linux中有两个特殊的设备 一是/dev/null 这个脚本里经常用到,是一个数据黑洞 二是/dev/zero 这个称为泡泡设备,能有向外吐0,要多少有多少。 我们可以借助泡泡设备,创建一个确定大小的虚拟镜像文件,这个文件可以直接被mkswap并且启用。 dd if=/dev/zero of=/tmp/swapfile bs=1M count=1024 使用dd命令实实在在创建一个大小为1024M的镜像文件,只是其中填满了0,所以硬盘会高速运转,,此处用于应急swap空间的添加。 dd 命令还可以用于测试磁盘的性能测试 dd if=/dev/zero of=/dev/test bs=1M count=1024 可以查看创建镜像文件时磁盘每秒完成的数据量。 dd命令有一个选项能跳过中间需要创建的空间。 seek 可用于创建一个假的文件。 dd if=/dev/zero of=/tmp/test bs=1 seek=1023 count=1 即创建一个假的1G镜像文件,使用fdisk命令对其格式化时会看见其空间大小为1G,实际上只有几M。 使用du命令还可以查看其实际大小。 挂载镜像文件设备: mount –o loop /mnt/.....iso /mnt/test 挂载镜像文件(回环设备) swapon -a 启用所有的交换设备(此处为定义在/etc/fstab下的交换设备) 给自己讲linux 2017-01-01 评论 1501 次浏览
tee 命令 功能说明:读取标准输入的数据,并将其内容输出成文件。 语 法:tee [-ai][–help][–version][文件…] 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。 参 数: -a或–append 附加到既有文件的后面,而非覆盖它. -i-i或–ignore-interrupts 忽略中断信号。 –help 在线帮助。 –version 显示版本信息。 [root@localhost ~]# who | tee who.out root pts/0 2009-02-17 07:47(123.123.123.123) [root@localhost ~]# cat who.out root pts/0 2009-02-17 07:47(123.123.123.123) [root@localhost ~]# pwd | tee -a who.out /root [root@localhost ~]# cat who.out root pts/0 2009-02-17 07:47(123.123.123.123) /root 随手笔记 2016-12-31 评论 1746 次浏览