Linux磁盘分区与文件系统

时间:2020-12-15 05:13:24

一 Linux磁盘分区与文件系统

在Linux中常见的操作系统有:ext2 ext3 ext4 xfs btrfs reiserfs等
文件系统的作用主要是明确磁盘或分区上的文件存储方法以及数据结构,Linux系统中数据分为元数据区和数据区,元数据区用于表示数据的属主属组,时间戳,访问权限,数据大小以及数据块指针等,每个文件的元数据会使用一个inode来标识。
在数据区中每个数据都会给它分配相应的数据块并通过inode来指向所对应的数据块。为了能够加快对数据块的索引,同时还会创建一个块位图来标识可用的数据块。
为了更加便于管理inode和block,所以就产生了块组的概念。块组是将同一个系统的块分成多个组进行管理,每个组都有独立的block以及inode并使用superblock来标识每个块组。

1 创建一个10G分区,格式化为ext4.块大小为2048,预留空间比%2,卷标Mydata挂载到/data/mydata且禁止程序自动运行并不更新文件访问时间戳

(1)[root@localhost ~]# fdisk /dev/sda 通过fdisk命令在sda上新创建一个10G分区
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
Partition number (3,4, default 3): 3
First sector (66004992-251658239, default 66004992):
Using default value 66004992
Last sector, +sectors or +size{K,M,G} (66004992-251658239, default 251658239): +10GB
Partition 3 of type Linux and of size 9.3 GiB is set
(2)[root@localhost ~]# partx -a /dev/sda 让内核识别磁盘中的新分区
(3)[root@localhost ~]# mke2fs -b 2048 -m 2 -L mydata -t ext4 /dev/sda3 创建了一个ext4的分区,每个块2k,给管理员预留%2的空间
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=mydata
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
612352 inodes, 4882944 blocks
97658 blocks (2.00%) reserved for the super user 预留给管理员的块数
First data block=0
Maximum filesystem blocks=273678336 总共的块数
299 block groups 总共的块组
16384 blocks per group, 16384 fragments per group 每个块组16384个block
2048 inodes per group 每个块组有2048个inode
Superblock backups stored on blocks: 超级块所在的块组
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104,
2048000, 3981312

(4)[root@localhost ~]# mount -t ext4 -o acl,noexec,noatime /dev/sda3 /data/mydata/ 挂载至/data/mydata并且支持acl,禁止程序自动运行以及不更新访问时间戳
(5)[root@localhost ~]# df -h /data/mydata/ 查看挂载后的结果
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 9.2G 13M 8.9G 1% /data/mydata

2 创建一个大小为1G的swap分区
[root@localhost ~]# fdisk /dev/sda 创建一个1G分区并将类型给为82(Linux swap)
Command (m for help): t
Partition number (1-5, default 5): 5
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'

[root@localhost ~]# mkswap /dev/sda5 创建为swap分区
mkswap: /dev/sda5: warning: wiping old swap signature.
Setting up swapspace version 1, size = 1048572 KiB

[root@localhost ~]# swapon /dev/sda5 启用该swap分区

二 RAID磁盘阵列
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。是将多块磁盘接口使用以实现提升IO能力以及冗余的存储方式

RAID的级别:RAID分为6钟不同级别,其中常见的有0,1和5以及10结合使用
RAID 0:0级别又称之为条带,在存储同一个数据时会切分为多个chunk分别存储到不同的设备,可提高IO读写能力但无法提供冗余能力。至少需要两块硬盘,其中一块盘损坏数据就会丢失,可用空间为N*min
RAID 1:1级别又成为镜像,是将同一份数据在2个或多个硬盘硬盘上同时存储多分,可实现对数据的冗余性并且读能力也会略有提升。至少需要两块硬盘可用空间为1*Min
RAID 5: 5级别是通过校验码,多块盘中会有一块盘轮流做校验盘实现冗余以及IO能力的提升,至少使用三块盘,最多只能容错一块盘。可用空间:(N-1)*min
RAID 10: RAID10是将1级别和0级别结合使用,这样既可以提升读写性能又可以实现冗余。先建每组硬盘做成1级别,再将每个磁盘组做成0级别,做多只允许同组里的一块盘损坏,可用空间是N*min/2

使用mdadm模块化工具创建软RAID

1 创建一个10G raid1设置chunk为128有一块空闲盘
[root@localhost ~]# mdadm -C raid1 -c 128 -l 1 -n 2 -x 1 /dev/sda{6,7,8} 创建一个RAID1
[root@localhost ~]# mdadm -D /dev/md/raid1 / 查看RAID信息
/dev/md/raid1:
Version : 1.2
Creation Time : Sat Sep 2 16:19:05 2017
Raid Level : raid1
Array Size : 10477568 (9.99 GiB 10.73 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Sat Sep 2 16:21:33 2017
State : clean, resyncing
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

Resync Status : 57% complete

Name : localhost.localdomain:raid1 (local to host localhost.localdomain)
UUID : f16b9b94:3c463cab:c2d70272:8d1e3577
Events : 9

Number Major Minor RaidDevice State
0 8 6 0 active sync /dev/sda6
1 8 7 1 active sync /dev/sda7

2 8 8 - spare /dev/sda8

[root@localhost ~]# mdadm -f /dev/md/raid1 /dev/sda6 将其中一块磁盘模拟为坏盘

Number Major Minor RaidDevice State
2 8 8 0 spare rebuilding /dev/sda8
1 8 7 1 active sync /dev/sda7

0 8 6 - faulty /dev/sda6 再次查看时会将备份盘自动添加进去

2 创建一个4G的RIAD5,chunk为256并格式化为ext4文件系统,开机自动挂载至/backup目录

[root@localhost ~]# mdadm -C myraid5 -c 256 -l 5 -n 3 /dev/sda{6,7,8} 创建一个RIAD5 (此前先创建了3个分区,每个分区2GB)
[root@localhost ~]# mke2fs -L raid5 -t ext4 /dev/md/myraid5 将此设备格式化为exit4
LABEL=raid5 /backup ext4 defaults,acl,atime 0 0 编辑/etc/fstab文件实现开机自动挂载
[root@localhost ~]# mount -a 挂载fstab中的分区
[root@localhost ~]# df -h /backup/ 查看该分区
Filesystem Size Used Avail Use% Mounted on
/dev/md127 3.9G 16M 3.7G 1% /backup

三 shell脚本练习

1 列出当前系统上所有的磁盘设备并显示每个磁盘上每个分区的相关信息

#!/bin/bash

disk=`fdisk -l | grep -E -o "^Disk /dev/sd[a-z]" | cut -d" " -f2` 提取出系统上有多少硬盘
echo this system disks list: $disk

for i in $disk; do 通过fdisk命令遍历磁盘每个分区
fdisk -l $i
done

2 接受一个以上的文件路径作为参数,显示每个文件的行数并说明本次为几个文件统计了其行数

#!/bin/bash

if [ $# -lt 1 ]; then
echo "At one more arguments"
exit 1
fi

for i in $*; do
lines=`wc -l $i | cut -d" " -f1 `
echo $i lines:$lines
done
echo files:$#
[root@localhost scrpit]# ./file_lines.sh /etc/fstab /etc/passwd /etc/fuse.conf /etc/fstab
/etc/fstab lines:13
/etc/passwd lines:42
/etc/fuse.conf lines:2
/etc/fstab lines:13
files:4

3 传递两个以上字符串当作用户名,创建这些用户密码通用户名,总结说共创建了几个用户
#!/bin/bash
declare -i sum=0
if [ $# -lt 1 ]; then 判断如果参数小于1就退出
echo "At least one arguments"
exit 1
else
for user in $*; do
[ `echo $user|wc -m` -le 4 ] && echo "Users name at leaset 3 string" && exit 2 如果用户字符小于三个就退出脚本
if ! id $user &> /dev/null; then
useradd $user
echo "$user" | passwd --stdin $user &> /dev/null
let sum++ 每添加一个用户让sum变量加1
else
echo "$user is exist"
fi
done
fi

echo add users:$sum

4 写一个脚本新建20个用户,visitor1-visitor20并计算他们UID和

#!/bin/bash
declare -i uidsum=0
for user in {1..20}; do
id vistor$user &> /dev/null && echo vistor$i is exist && exit 1
useradd vistor$user
uid=`id -u vistor$user`
uidsum=$[$uidsum+$uid]
done
echo uidsum:$uidsum