1 Linux磁盘和文件系统管理
理解inode,要从文件储存说起。文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。包括了
- Size 文件的字节数
- Uid 文件拥有者的User ID
- Gid 文件的Group ID
- Access 文件的读、写、执行权限
文件的时间戳,共有三个: - Change 指inode上一次变动的时间
- Modify 指文件内容上一次变动的时间
- Access 指文件上一次打开的时间
- Links 链接数,即有多少文件名指向这个inode,删除时要用到
- Inode 文件数据block的位置
- Blocks 块数
- IO Blocks 块大小
- Device 设备号码
inode满了有可能磁盘未满导致无法存入
inode的内容
inode包含文件的元信息,具体来说有以下内容:
Size 文件的字节数
Uid 文件拥有者的User ID
Gid 文件的Group ID
Access 文件的读、写、执行权限
文件的时间戳,共有三个:
Change 指inode上一次变动的时间
Modify 指文件内容上一次变动的时间
Access 指文件上一次打开的时间
Links 链接数,即有多少文件名指向这个inode
Inode 文件数据block的位置
Blocks 块数
IO Blocks 块大小
Device 设备号码
可以用stat命令,查看某个文件的inode信息:
2 文件系统的简单操作
df查看文件系统整体磁盘使用量
du查看文件系统磁盘使用量
硬连接:同一个文件的两个入口,可以用来备份,删除时把包括自身的硬链接都删除了,即硬链接数为0,只针对没有进程访问的静态文件
软连接:类似于windows的快捷方式,可以作为对外开放的一个路径的接口,即更新前后使用相同的软链接名
3 磁盘分区
我们在之前分区时除了主分区以外还剩下了一部分空间,利用这部分空间先添加一个扩展分区,然后利用fdisk规划这个扩展分区为多个逻辑分区。
分区步骤
主要步骤:gdisk分区,mkfs格式化,mount挂载,设置自动挂载,修改权限
挂载
利用nano或者vim修改/etc/fstab,实现自动挂载
4 压缩和打包
gzip命令:解压gzip -d
bzip2参数和gzip一致
打包tar命令:-zcvf是压缩命名参数,然后是压缩后的名字,最后是需要压缩的文件
解压:-zxvf是解压参数,然后是需要解压文件名,-C后面接需要的目录
仅备份比某个时刻还新的文件 tar -jcv -f /root/etc.newer.then.file1 --newer-mtime=“2020/11/18” /etc/*
4 vim
一些常用的:
不退出vim的前提使用命令command:!command
撤销:u
删除vim的缓存文件:rm .filename.swp 以.开头表示隐藏文件
复制n行:nyy;p是粘贴
n1到n2行间替换: n1,n2s/word1(regexp)/word2(regexp)/gc
打开一个新的vim窗口sp filename
切换窗口:ctrl+w然后上下键
自动补全:ctrl+p查看可以选择的,ctrl+n选择哪一个
5 shell
之前的版本有sh,K shell,和我们linux现在用得最多的Bash
变量的赋值使用变量名=值的方式,特殊的一些情况
- 在PATH后追加:PATH=$PATH:/home/tzq/bin
- 对其他变量的引用:var2=$var1
- 在复制语句中,双引号直接的$var是有效的,单引号是无效的
环境变量:
利用env查看环境变量: - PATH:决定了shell将到哪些目录中寻找命令或程序
- HOME:当前用户主目录
- MAIL:是指当前用户的邮件存放目录。
- SHELL:是指当前用户用的是哪种Shell。
- HISTSIZE:是指保存历史命令记录的条数。
- LOGNAME:是指当前用户的登录名。
- HOSTNAME:是指主机名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
- LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
- PS1:是基本提示符,对于root用户是#,对于普通用户是$。PS2:是附属提示符,默认是“>”。
set命令可以查看所有的变量
expert命令将自定义变量转换成环境变量,注意,自定义变量只局限里当前这个shell(PID),这里自定义变量=局部变量,环境变量=全局变量
declare命令可以声明变量类型,常用的如下:
STDIN是标准输入,默认从键盘读取信息;
STDOUT是标准输出,默认将输出结果输出至终端;1>或者1>>file可以写到文件之中
STDERR是标准错误,默认将输出结果输出至终端。同理2>或者2>>file可以写到文件之中,写入同一个文件的话使用2>&1
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo ‘2’
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo ‘yes’ | wc -l,只能接受前一个命令的stdout
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail”
6 正则表达式
正则表达式字符合集
字符 | 说明 |
---|---|
\ | 将下一个字符标记为特殊字符、文本、反问引用或八进制转义字符。如\n换行等。 |
^ | 匹配输入字符串开始的位置。 |
$ | 匹配输入字符串结尾的位置。 |
* | 零次或多次匹配前面的字符或子表达式,如zo*匹配"z“和”zoo“。 |
+ | 一次或多次匹配前面的字符或子表达式,如zo+匹配"zo”和“zoo”,但“z”不匹配。 |
? | 零次或一次匹配前面的字符或子表达式,如do(es)?匹配“do”或“does”。 |
{n} | n为非负整数,正好匹配n次。 |
{n,} | 至少匹配n次。 |
{n,m} | 匹配至少n次,至多m次。 |
? | 当?紧随其他限定符(*,+,?,{n},{n,},{n,m}后时,匹配是“非贪心的”,即匹配尽可能短。 |
. | 匹配除"\n"外的任何单个字符。 |
x|y | 匹配x或y。 |
[xyz] | 字符集,匹配xyz中的任一字符。 |
[^xyz] | 反向字符集,匹配未包含的任何字符。 |
[a-z] | 字符范围,匹配a到z字母。 |
[^a-z] | 反向范围字符,匹配非a到z的字母。 |
sed 主要分两种,n1,n2分别表示开始的行号,然后接操作类型[acdips] 接内容
例如
- sed ‘n1,n2d’
- sed ‘n1,n2awhat you want insert’
- sed ‘n1,n2c what you want’
或者是在替换中使用正则表达式sed ‘s/regular expression/what you want/g’
awk配合print,例如:
awk ‘print $1 “\t” $3’ 意思是输出第一列,水平tab,第三列
还可以配合单列进行逻辑运算:
awk ‘NR==1{ print “%10s %10s %10s %10s %10s\n” ,$1,$2,$3,$4,“total” }
NR>2 { total= $2+$3+$4 print “%10s %10d %10d %10d %10.2f” ,$1,$2,$3,$4,total}’
意思是在第一行输出1,2,3,4列,加上字符串“total”,在第二行以后,计算total=2+3+4,然后逐列输出,格式化即:
awk ‘condition1 {operation} condition2 {operation}’
7 shell脚本
变量 var = $(operation) 例如:sum=$((1+2))
测试命令 test -(参数) 对象,对象可以说文件名,是整数,是字符串,例如:test - e /filename,test -r /filename, test n1 -eq n2
判断符号[ ]组成一个条件,注意其中的空格:[ “HOME” == “$MALL” ]
shell默认参数,即输入时以空格为分界输入的参数,分别用 $1到 $n进行引用, $n表示个数
特殊字符
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
条件判断:例如
if [ a == b ] then
echo ${a}
elif [ b==c ] exit 0
else echo ${b}
fi
Case语句
case ${a} in
1)
echo -n "1"
;;
2)
echo -n "2"
;;
*)
exit 0
;;
esac
程序段
function print(){
echo -n "hello world"
}
print
循环:
sum = 0
while [ i != 100]
do
sum = $((sum+i))
done
until [ i == 100 ]
do
sum = $((a+b))
done
for i in ${seq 1 100}
do
sum = $((sum+i))
done
for((i=1;i<=100;i=i+1))
do
s = $((s+i))
done
常用命令:
指定输出年月日时分秒:date +%Y_%m_%d\%H:%M:%S
查看cpu信息:cat /proc/cpuinfo