废话不多说,直奔主题,磁盘常见的操作有创建、删除、查看磁盘分区,对磁盘进行软raid,创建磁盘阵列以及可以对磁盘重新组织,组建逻辑卷组以利于空间扩展。最后将创建的分区或者逻辑卷格式化后挂载使用。下边对相应的命令一一道来。

fdisk [-l]  [device...]

-l:查看硬盘挂载情况
[device]:所要操作的设备,例如/dev/sda
不使用-l 而直接后跟device则进入硬盘分区操作。
常用命令:
-m:使用帮助;
-p:显示指定磁盘的分区详细信息;
-a:创建新分区;
-d:删除分区;
-w:将操作写入到分区表中;

分区完成之后,内核不一定立即识别新建的分区,可以通过cat查看/proc/partitions,如果未识别,则使用如下命令进行手动同步操作,

~]# partx -a /dev/sda /dev/sdaX(创建的新分区)

mount [-t vfstype] [-o options] DEVICE  MOUNT_POINT

常用命令选项:

-a:自动挂载/etc/fstab文件中所有支持自动挂载的设备。
-r:只读挂载。
-w:读写挂载。
-n:不更新/etc/mtab,默认情况下/etc/mtab文件时刻跟踪当前系统的分区挂载情况,当使用mount,umount命令对设备操作时都会记录进mtab中,使用-n则不会将操作记录更新到mtab中。
-t:指定挂载设备的文件系统类型,常用挂载文件系统有:ext3、ext4、iso9660(光盘)、vfat(u盘,如果U盘含有中文名,则还需要-o iocharset=cp936选项来配合使用)。
 options:
  · async:异步模式;
  · sync:同步模式;
  · atime/noatime:包含目录和文件;
  · diratime/nodiratime:目录的访问时间戳;
  · auto/noauto:是否支持自动挂载;
  · exec/noexec:是否支持将文件系统上应用程序运行为进程;
  · dev/nodev:是否支持在此文件系统上使用设备文件;
  · suid/nosuid:是否支持在此文件系统上使用特殊权限;
  · remount:重新挂载;
  · ro:只读;
  · rw:读写;
  · user/nouser:是否允许普通用户挂载此设备;
  · acl:启用此文件系统上的acl功能;

DEVICE:指明要挂载的设备;

  方式一:/dev/sdaX

  方式二:-L 'LABEL'

  方式三:-U 'UUID'

MOUNT_POINT:

此参数使用时需要注意:

(1) 挂载点事先存在,但如果所要挂载的目录中有数据,则作为挂载点后原来的内容将会被“隐藏”,知道卸载之后才可继续访问原数据,建议使用空目录做为挂载点。

(2) 卸载挂载点时,需要保证该目录没有其他设备或进程所引用,否则将无法被卸载。


RAID

raid是Redundant Arrays of Independent Disks的缩写,中文称为独立冗余磁盘阵列,据说(见谅,本人头发长见识短)在实际生产环境中,都是使用磁盘阵列卡来对磁盘进行管理,那这里的raid是建立在系统之上,所以性能会降低不少,这里就简单介绍下raid的创建、删除、扩容等命令的用法。

目前较常用的raid级别有:raid0、raid1、raid5、raid10。划分了这么多的类型,他们之间有什么区别呢,那就比比看。

wKioL1h93LixB1n9AABmh2cCHxo191.png        

raid0

RAID0:就像是秉承了“武林”中的一贯套路,“天下武功唯快不破”,在所有raid级别中是读写速度最快的,追求速度的代价则是虽然将至少两块磁盘合并成一个大的磁盘来并行I/O,但并没有提供冗余功能,所以他的定级就是:

速度5颗星

防守1颗星

wKioL1h93ROyBS7wAABbPoEaWdI419.png

raid1

RAID1:借鉴了前辈raid0的优点,由至少两块磁盘并成偶数块增长的套路,增加了冗余的同时读取速度较好,写入速度一般,那他有没有致命的缺点呢?有!虽然是“双胞胎”类型但真正上“战场”的永远只有一个,还有一个在后方给予“精神上”的鼓励(因为加入了冗余,数据写入磁盘时会写入两份,一份作为备份)。所以他的定级为:

速度3星半

防守3颗星

wKiom1h93ceRcxFKAAGhvleqeGM654.jpg

raid5


RAID5:自古长江后浪推前浪,前浪一般都没好下场对吧,但在计算机上一切皆有可能的(就看你的追求了,速度与防守不可能都达到极致的骚年)。5充分吸取了前两位的内力之后终于练成了葵花宝典,攻守愈发的平衡(组成raid5至少需要三块磁盘,加入了奇偶校验机制,将校验信息分散存储在各个磁盘中,I/O速度、磁盘利用都不错),所以给他的定级为:

速度4颗星

防守4颗星

wKioL1h93hOR-HpaAADwxkSfreM985.png

raid10

RAID10:万事都有特例,两大高手联姻的结果就是基因突变功力大增,速度上来了,防守更强了(先将4快硬盘分两组,每组组成raid1引入防守阵型,有备份了,然后组成的两个raid1再合体组成了速度大杀四方的raid0),因此给其定级为:

速度4星半

防守4颗星

扯了半天不知所云的东东,接下来看看怎么操作他吧(江湖都不靠谱,还是实际点好)

创建软件RAID的指令是mdadm,允许将任何块设备做成RAID。

mdadm是一个模式化的命令,有如下几种工作模式:     

         创建模式:Create  对应的选项:-C 或--create
      管理模式:Manage  对应的选项:--add、--fail、--remove
      监控模式:Monitor 对应的选项:-F或--monitor
      增长模式:Grow    对应的选项:-G或--grow
      装配模式:Assemble  对应的选项:-A或--assemble

 创建模式中的专用选项: 

     -l:指定raid level。长选项:--level=
    -n:RAID磁盘的个数。长选项:--raid-devices=
    -x:备用磁盘的个数。长选项:--spare-devices=
    -a:自动创建设备文件。长选项:--auto= 。默认为--auto=yes
    -c:指定chunk的大小,即每一次分配数据块的大小。长选项:--chunk。默认为64KB



****===我是分割线===*****===我是分割线===*****===我是分割线===*****


前提设置:假定服务器中有5块scsi硬盘分别为sda-sde

1、创建一个10G分区,并格式为ext4文件系统;

(1) 要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl;

(2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳;

步骤一、创建分区

~]# fdisk /dev/sda
Command (m for help): m #可以查看所有可用命令
Command (m for help): n  #创建新分区
Command action
   e   extended
   p   primary partition (1-4)  #选择分区类型,e为扩展分区,P为主分区,总共可以分4个主分区,或者三个主分区一个扩展分区,再从扩展分区划分更多的逻辑分区。
   #继续重复创建分区的命令n,这次选择创建逻辑分区,大小为10G
   Command (m for help): n
First cylinder (931-2610, default 931): 
Using default value 931
Last cylinder, +cylinders or +size{K,M,G} (931-2610, default 2610): +10G
Command (m for help): w #进行保存写入分区表
~]# partx -a /dev/sda

步骤二、格式化分区

~]# mkfs -t ext4 -b 2048 -m 2 -L "MYDATA" /dev/sda5
~]# tune2fs -o acl /dev/sda5 #修改默认挂载属性
~]# dumpe2fs -h /dev/sda5 #通过dumpe2fs命令可查看分区默认挂载属性变为acl

步骤三、挂载新建分区

~]# mkdir -pv /data/mydata
~]# mount -o remount,noatime,noexec /dev/sda5  /data/mydata

2、创建一个大小为1G的swap分区,创建好文件系统后,进行启用;

~]# fdisk /dev/sda
Command (m for help): m 
Command (m for help): n  
First cylinder (931-2610, default 931): 
Using default value 931
Last cylinder, +cylinders or +size{K,M,G} (931-2610, default 2610): +1G
Command (m for help): t#修改分区类型
Partition number (1-5): 5 #指定所要修改分区
Hex code (type L to list codes): l #查看内核支持文件系统类型
Hex code (type L to list codes): 82
Changed system type of partition 5 to 82 (Linux swap / Solaris)
~]# partx -a /dev/sda #同步到内核
~]# mkswap /dev/sda #格式化交换分区
~]# swapon /dev/sda #激活新建交换分区

3、写一个脚本,要求如下:

(1) 获取并列出当前系统上的所有磁盘设备;

(2) 显示每个磁盘设备上每个分区相关的空间使用信息;

#!/bin/bash
#
#Program: Use this script to view disk usage information
#History: 2017/01/16 14:11  0.0.1  BING
declare -i total=0
declare -a disk=[]
fdisk -l |grep -E -o "/dev/[a-z]+.*GB"|awk -v FS=": " 'BEGIN{printf "\tDISK\t\t Total space\n"}{printf "%d\t%s\t%s\n",NR,$1,$2}'
disk=(`fdisk -l|grep -E -o "/dev/[a-z]+\>"`)
total=`fdisk -l|grep -E -o "/dev/sd[a-z]\>"|wc -l`
read -p "select a disk number which you want view : " choice
choice=${choice:=q}
until [ $choice == "q" ];do
    `echo $choice|grep "[[:alpha:]]" &>/dev/null`
    flag=$?
    if [ $flag -eq 1 ];then
        if [ $choice -le $total -a $choice -ge 1 ];then
            choice=$[$choice-1]
            df -lh|grep "${disk[$choice]}"|sort -t' ' -k 15  
        else
            echo "wrong number $choice"
        fi  
    else
        echo "please input a number!"
    fi  
    read -p "select a disk number which you want view: " choice
    choice=${choice:=1}
 done

4、总结RAID的各个级别及组合方式和性能的不同;

在开头已讲


5、创建一个大小为10G的RAID1,要求有一个空闲盘,而且CHUNK大小为128k;

(1) 使用fdisk创建3个5G大小分区sda3,sdb3,sdc3,更改其分区类型为FD

(2)

~]# mdadm -C -a y /dev/md0 -l1 -n2 -x1 -c 128 /dev/sd{a,b,c}3

6、创建一个大小为4G的RAID5设备,chunk大小为256k,格式化ext4文件系统,要求可开机自动挂载至/backup目录,而且不更新访问时间戳,且支持acl功能;

raid5至少需要三块磁盘或分区,所以在磁盘sda,sdb上创建2个1G分区,sdc上创建一个2G分区,然后再从sdd上建一个2G分区作为热备。

~]# mdadm -C /dev/md1 -a y -l5 -n3 -x1 -c 256 /dev/sd{a,b,c,d}4
~]# mdadm -E -s -v >>/etc/mdadm.conf #创建mdadm的配置,以便下次开机后可以直接使用
~]# vim /etc/fstab #在文件新加一条
/dev/md1              /backup            ext4 defaults,noatime        0 0

7、写一个脚本,要求如下:

(1) 传递两个以上字符串当作用户名;

(2) 创建这些用户,而且密码与用户名相同;

(3) 总结说明共创建了几个用户;

#!/bin/bash
#
#
declare -i count=0
if [ $# -eq 0 ];then
    echo "no argument!"
else
    for i in "$@";do
        if [ ! `id $i &>/dev/null` ];then
            useradd ${i} && echo "${i} create success!" && let count++
        fi
    done
    echo "${count} users had been added."
fi

8、写一个脚本,分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/fstab文件中以#号开头的行数之和,以及总的空白行数;

#!/bin/bash
#
declare -i Hashtag=0
declare -i spaces=0
declare -a files=("/etc/rc.d/rc.sysinit" "/etc/rc.d/init.d/functions" "/etc/fstab")
for (( i=0;i<${#files[*]};i++ ));do
    Hashtag=`cat ${files[$i]}|grep "^#"|wc -l`
    echo "the file ${files[$i]} have $Hashtag # lines."
    let spaces+=`cat ${files[$i]}|grep "^$"|wc -l`
done
echo "Total blanks have $spaces lines."

9、写一个脚本,显示当前系统上所有,拥有附加组的用户的用户名,并说明共有多少此类用户;

#!/bin/bash
#
cat /etc/group|awk -F: 'BEGIN{printf "The additional group user has\n"}{sum=0;if($NF!="") users[$NF]++}END{for(i in users){sum++;print i};printf "total %s users have additional group\n",sum}'

10、创建一个至少两个物理卷组成的大小为20G的卷组,要求PE大小为8M,而且在卷组中创建一个大小为5G的逻辑卷mylv1,格式化为ext4文件系统,开机自动挂载至/users目录,支持acl;

新建3个大小均为10G的分区,/sda5,/sdb5,/sdc5,将其文件系统类型改为8e。

~]# pvcreate /dev/sd{a,b,c}5 #将三个分区加入到物理卷中
~]# pvscan #使用pvscan命令可以查看添加物理卷状态
~]# vgcreate myvg -s 8M /dev/sd{a,b}5 #创建物理卷组
~]# vgdisplay #查看卷组状态
~]# lvcreate -L 5G -n mylv1 myvg
~]# lvdisplay #查看逻辑卷状态
~]# mkfs -t ext4 /dev/myvg/mylv1
~]# vim /etc/fstab #在文件中加入一行记录
/dev/myvg/mylv1  /users  ext4 default,acl 0 0

11、扩展mylv1至9G,确保扩展后原有数据完全可用;

~]# lvresize -L +4G  /dev/myvg/mylv1 # 增加逻辑卷容量
~]# lvdisplay #查看扩展之后的状态
~]# resize2fs /dev/myvg/mylv1 #一般扩展完逻辑卷后,文件系统并不会因此而增加,需要使用resize2fs来将扩展后的空间同步至文件系统中

12、缩减mylv1至7G,确保缩减后原有数据完全可用;

警告:缩减逻辑卷的容量是件比较危险的事情,一般情况下在生产环境中减少这种操作。

缩减空间与扩展正好是相反的操作,要想缩减容量,第一个要减少的就是文件系统的大小,先通过e2fsck -f来强制检测磁盘,然后通过resize2fs命令进行缩减,前提是剩余的空间必须要能保证已有的数据可以存储下,否则会失败。

~]# umount /users
~]# e2fsck -f /dev/myvg/mylv1
~]# resize2fs /dev/myvg/mylv1 7000M #要将缩减后的容量换算成M为单位,因为好像不支持小数点形式
~]# lvresize -L -2G /dev/myvg/mylv1#将2G的空间从mylv1卷组中减掉,操作完成
~]# lvdisplay #查看调整后的状态

13、对mylv1创建快照,并通过备份数据,要求保留原有的属主属组等信息;

目前mylv1卷还有7G的空间,myvg物理卷组还有13G的空间,可以在其中划出5G来作为快照。

~]# lvcreate -s -L 5G -n mylvss /dev/myvg/mylv1  #创建mylv1卷快照
#mylv1修改过的文件原始数据会被移动值mylvss中,此时将快照中的所有内容保存至/backup目录中
~]# mkdir -p /mnt/snapshot && mount /dev/myvg/mylvss /mnt/snapshot #创建快照挂载目录,并将快照挂载
~]# mkdir -p /backup/mylvss && cp -a * /backup/mylvss #通过cp可以将修改过的文件备份至/mylvss目录中	

14、如何将Linux主机接入到TCP/IP网络中,请描述详细的步骤。

1、主机要想在网络中访问其他主机或被其他网络主机访问,则需要有网络上的一个身份,那就是IP地址;

2、主机与其他不在同一网络的主机通信时,还要指定一个设备转发数据来完成通信,这个设备就是网关(GATEWAY)。

3、数据在网络上传输时需要经过路由器交换机等各种的网络设备,经过这些设备时,他们中的一些策略或者设置还需要认证这个IP地址符不符合“放行”要求,那判断的标准就是加入一个子网掩码(MASK)来和IP地址进行运算后得出该主机所在的网段是不是在“放行”的白名单中。

4、通常情况下有以上3点配置完成,该Linux主机应该是可以接入TCP/IP网络中了,如果还有通过域名来访问互联网中的主机的需求,则需要有将域名转换至IP地址的域名解析服务器(DNS)来完成。

15、为Linux主机配置网络信息的方式有哪些,请描述各个过程;

修改网络配置的方式有修改/etc/sysconfig/network-scripts/目录下对应网卡的配置信息、通过DHCP服务器动态获取IP地址和手动配置网络信息三种方式。

1、修改配置信息方法最有效,下次重启后不会丢失,使用vim 编辑配置文件,修改或添加以下几项后保存

ONBOOT=yes#修改网卡为开机启动
BOOTPROTO=static#ip地址获取方式为静态获取,改为DHCP则由DHCP服务器动态分配获得
IPADDR=192.168.8.120 #IP地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.8.2 #网关
DNS1=202.106.0.20 #DNS服务器IP 也可以通过 /etc/resolv.conf文件来配置DNS
~]# service network restart #修改完成之后重启网络服务来重读配置生效

2、通过DHCP服务器获取网络配置比较简单

ONBOOT=yes#修改网卡为开机启动
BOOTPROTO=dhcp #修改此项为dhcp即可

3、使用IP命令来配置

~]# ip addr add 192.168.8.120/24 dev eth0 #使用ip addr add命令参数来为网卡添加ip地址
~]# vim /etc/resolv.conf
nameserver 202.106.0.20 #添加dns服务器IP地址
~]# ip addr show #查看网卡信息

16、写一个脚本,使用Ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;在线主机使用绿色显示,不在线的主机使用红色显示;

~]# vim ipstatus.sh
#!/bin/bash
#
#History:2017-01-17
#Auther:BING
NET=172.16.250.
format="\033[60G"
UP="${format}\033[32monline\033[0m"
DOWN="${format}\033[01;31moffline\033[0m"
for i in {1..254};do
    if `ping -c 1 -w 1 ${NET}$i &>/dev/null`;then
        echo -e "${NET}${i} is ${UP}"
    else
        echo -e "${NET}${i} is ${DOWN}"
    fi       
done

17、常用的网络管理类工具有哪些,并用示例形式描述他们的使用方法。

(1) ping:通常用来测试与目标主机的连通性,

使用格式 ping [option] IP

常用选项:

-c #:发送报文的个数
-w #:等待响应报文的超时时长
示例:ping -c 1 -w 1 172.16.250.10

(2) netstat:用于显示各种网络相关信息,如网络连接,路由表,接口状态等

使用格式:netstat [options]

常用选项:

-a:显示所有状态的连接
-t:显示tcp相关信息
-u:显示udp相关信息
-n:显示数字格式的地址
-p:显示会话中的进程程序名及进程号
-l:显示处于监听(listen)状态的连细节
-r:显示路由表,一般与-n共同使用
示例:netstat -tulnp 
#查看当前系统已在监听的tcp和udp连接

(3) ss与netstat功能相同,但效率却高于后者,应该算是netstat的加强版

常用选项组合:

-nat
-tanl
-tanlp
-uan
示例:ss -tunlp

(4) nmap:Network Mapper,网络探测和安全审核工具

常用选项:

-p#:扫描目标主机上指定端口是否开放,可以跟多个使用逗号隔开。
-iL /PATH/TO/IP.txt:扫描文本文件中所有列出的主机。
-sT:TCP connect()扫描,这种方式会在目标主机的日志中记录大批的链接请求以及错误信息。
-sP:ping扫描,加上这个参数会使用ping扫描,只有主机存活,nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping,却实际存在。
-sS:半开扫描,一般不会记入日志,不过需要root权限。

注意:默认情况下系统不会安装此工具需要手动安装

~]# yum install syssat -y
示例:nmap 172.16.250.12  #没有加任何参数表示扫描目标主机所有的端口状态
  nmap 172.16.250.1-100 #扫描指定地址段的主机
  nmap -p80,21,22 172.16.250.10 #扫描目标主机指定端口的状态

(5) ip:显示设备、路由表、策略路由以及设置相关工具

ip [-s] addr show:显示网卡相信信息,使用-s选项可以显示更详细的信息。
ip addr add 172.16.250.200/24 dev eth0   #为eth0设置IP地址
ip addr add 172.16.250.200/24 dev eth0 label eth0:1  #为eth0设置IP地址
ip addr del 172.16.250.200 dev eth0
ip route add 172.16.0.0/16 via 192.168.8.120 dev eth0  #添加路由
ip route del 172.16.0.0/16 #删除路由

(6) ncat:连接与重定向套接字

使用格式:ncat [OPTIONS...] [hostname] [port]

常用选项:

-m:最大同时连接数,linux默认是100,windows是60
-l:连接和收听到来的连接,此选项是将目标主机作为服务器来工作。
-u:使用udp替代默认的TCP。
-4:仅使用IPV4
-v:显示调试信息,默认情况是不显示
-k, --keep-open:接受多个听模式的连接,一般只接受一个连接,当连接关闭时则退出。这个选项使得它可以接受多个同时连接,并等待更多的连接,并等待他们都关闭,它必须和监听模式一起使用。在该模式下ncat是无法知道输入是否完成,所以它不会关闭输出流,所有的ncat程序一直会在寻找EOF挂起。
示例:
~]# ncat -l 8080  #将本机作为tcp的服务器端监听8080端口
~]# ncat -v localhost 8080 #新建一个终端使用此命令测试

18、写一个脚本,完成以下功能:

(1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干;

(2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串;

(3) 显示所有以S开头的文件的文件名,并且给其附加一个start的字符串;

(4) 分别统计S开头和K开头的文件各有多少?

~]# vim countfiles.sh
#!/bin/bash
#Program:This program calculates the total number of files
#History:2017-01-17
#Auther:BING
dir="/etc/rc.d/rc3.d/"
ls $dir |awk '{if ($1~/^K/){k++;kfiles[k]=$1}else{s++;sfiles[s]=$1}}END{for(i in kfiles){printf "%-30s\t\t",kfiles[i]"stop";if(i%4==0)printf "\n"};{printf "\n"};for(i in sfiles){printf "%-30s\t\t",sfiles[i]"start";if(i%4==0)printf "\n"};{printf "\n"};{printf "There are %s files starting with k\nThere are %s files starting with S\n",k,s}}'

19、编写脚本,用ping命令测试172.16.250.20-172.16.250.100以内有哪些主机在线,将在线主机IP显示出来。

~]# vim ipstatus.sh
#!/bin/bash
#
#History:2017-01-17
#Auther:BING
NET=172.16.250.
for i in {20..100};do
    if `ping -c 1 -w 1 ${NET}$i &>/dev/null`;then
        echo -e "${NET}${i} is online"
    fi       
done

20、打印九九乘法表。

~]# vim calc.sh
#!/bin/bash
#
#History:2017-01-17
#Auther:BING
function calc(){
    row=$1
    row=${row:=9}
    for ((i=1;i<=${row};i++));do
        for ((j=1;j<=i;j++));do
        echo -n -e "${j}X${i}=$[j*i] \t"      
      done
        echo ""
    done
}
read -p "input a number: " num
calc $num