linux磁盘及文件系统(二)

设备文件:
b: 按块为单位,随机访问的设备;
c:按字符为单位,线性设备;
b: 硬盘
c: 键盘

/dev
主设备号 (major number)
标识设备类型
次设备号 (minor number)
标识同一种类型中不同设备

mknod
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
-m MODE

硬盘设备的设备文件名:
IDE, ATA:hd
SATA:sd
SCSI: sd
USB: sd
a,b,c,...来区别同一种类型下的不同设备

IDE:
第一个IDE口:主、从
/dev/hda, /dev/hdb
第二个IDE口:主、从
/dev/hdc, /dev/hdd

sda, sdb, sdc, ...
hda:
hda1: 第一个主分区
hda2:
hda3:
hda4: 主分区只能有4个
hda5: 第一个逻辑分区
fdisk -l 查看当前系统识别了几个硬盘 fdisk

管理磁盘分区:
fdisk /dev/sda
p: 显示当前硬件的分区,包括没保存的改动
n: 创建新分区
e: 扩展分区
p: 主分区
d: 删除一个分区
w: 保存退出
q: 不保存退出
t: 修改分区类型
L:
l: 显示所支持的所有类型

创建分区完成后用fdisk -l 可以查看到,但是内核没有识别,可用cat /proc/partitions 查看识别分区;用partprobe命令重读分区表,然后内核才能识别

linux磁盘及文件系统(一)

扇区(Sector)是最小的物理存储单位,硬盘分区表主要有两种格式,一种是限制较多的 MBR 分区,一种是限制较少的 GPT 分区。
MBR 分区中,一个扇区最重要,包括主要开机区(MBR)和分区表(partition table)。
MBR: 主引导记录 (512byte) Master Boot Record
446byte:BootLoader 引导加载(是一个程序)
64byte: 16byte标示一个分区(也就是一个磁盘最多分4个主分区)
2byte:Magic Number 标记MBR是否有效

开机顺序:先读取加载BIOS开机顺序MBR,有光盘先读取光盘MBR(如果损坏,就不能开机,而不是往下读取),然后读取硬盘MBR,加载BootLoader,然后读取分区表,读取某个分区的内容并加载,依次读取文件系统、找到需要运行的程序,操作系统完成启动

硬链接:
1、只能对文件创建,不能用于目录
2、不能跨文件系统
3、创建硬链接会增加文件链接次数
ln SRC DEST

符号链接(软链接):
1、可用于目录
2、可以跨文件系统
3、不会增加被链接的次数
4、大小为制定路径包含的字符数
ln -sv SRC DEST symbolic符号 verbos 冗长的 (打印出链接记录)

df 报告文件系统磁盘使用情况
df

w和who等几个命令

w:显示谁登陆了,并且正在做什么
who:显示谁登陆了 -H 打印行标题栏
sleep:延迟一定时间
whoami:打印当前登陆用户
last:显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
-n #: 显示最近#次的相关信息
lastb,/var/log/btmp文件,显示用户错误的登录尝试
-n #:
lastlog: 显示每一个用户最近一次的成功登录信息;
-u USERNAME: 显示特定用户最近的登录信息
basename
$0: 执行脚本时的脚本路径及名称
hostname: 显示主机名 hostname modys 更改主机名为modys
random:生成随机数 0-32768
随机数生成器:熵池(计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。
内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。)--来自百度百科
/dev/random:熵池中取完会中断,需要填充
/dev/urandom:熵池中取完不会中断,用软件模拟生成随机数,不会中断、阻塞用户进程

Linux特殊权限详解

SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
chmod u-s FILE
如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;
SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
chmod g-s FILE

Sticky: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR

umask:3755 代表sgdi和sticky 755
umask: suid=4 sgid=2 sticky=1

特殊权限用法:5个人共同开发一个项目project,建立一个目录,把5个用户加入附加组develop,这样个人建立的文件还是自己的属主和数组,不能相互修改;可以设置project超级权限组sgid,这样建立的文件都属于develop,弊端是可以任意删除别人的文件;然后可以设置sticky+t,可以任意访问修改文件,但不能删除别人的文件

find命令详解笔记

find、locate:查找文件命令
locate:非实时,模糊匹配,速度快,查找是根据全系统文件数据库进行的;如果刚装系统用locate查找文件,需使用updatedb, 手动生成文件数据库才可使用
find:实时、精确、支持众多查找标准、遍历指定目录中的所有文件完成查找,速度慢
find 查找路径 查找标准 查找到以后的处理运作 (find后必须先跟路径,否则报错)
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示
匹配标准:
-name 'FILENAME':对文件名作精确匹配
文件名通配:
*:任意长度的任意字符
?
[]
-iname 'FILENAME': 文件名匹配时不区分大小写
-regex PATTERN:基于正则表达式进行文件名匹配
-user USERNAME: 根据属主查找
-group GROUPNAME: 根据属组查找
-uid UID: 根据UID查找
-gid GID: 根据GID查找
-nouser:查找没有属主的文件
-nogroup: 查找没有属组的文件
-type :f 普通文件 d c b l p s
-size [+|-] #k #M #G

find . -siez +1k -type f #查找当前目录下大于1k的文件

组合条件:
-a 且
-o 或
-not 非 等同 !

find . ! \( -user modys -a -type d \) #查找当前目录下**不是**属主为modys并且为目录的文件

-mtime 修改时间 天 [+|-]#
-ctime 改变时间 天
-atime 访问时间 天

find /home/modys -mtime +5 -name "*.txt"  #查找modys目录下5天之前修改的txt文件

-mmin 修改时间 分钟 [+|-]#
-cmin 改变时间 分钟
-amin 访问时间 分钟

find . /home/modys -amin +60 #查找modys目录下60分钟之前访问的所有文件

-perm MODE:精确匹配
/MODE: 任意一位匹配即满足条件
-MODE: 文件权限能完全包含此MODE时才符合条件

find . -perm -002 -type f #查找当前目录下其他用户有可执行权限的普通文件

查找后可执行的动作:
-print: 显示
-ls:类似ls -l的形式显示每一个文件的详细
-ok COMMAND {} \; 每一次操作都需要用户确认
-exec COMMAND {} \;

find . -perm -002 -type f -exec mv {} {}.py \; #查找出来后并且重命名为.py
find . -name '*.sh' -a -perm -111 ok chmod o-x {} \; #找出当前目录下所有.sh结尾并且都有执行权限的文件,然后去掉其他用户的执行权限
find . -name '*.sh' -a -perm -111 | xargs chmod o-x #命令效果同上

Linux bash脚本编程(四)

组合测试条件
-a: 与关系
-o: 或关系
!: 非关系
if [ $# -gt 1 -a $# -le 3 ] 等同于 if [ $# -gt 1 ] && [ $# -le 3 ]

a=a+$b 等于 a+=$b
a=a-$b 等于 a-=$b
...
let a+=1 等于 a++ (必须是1才能是++)
let a-=1 等于 a-- (必须是1才能是--)

declare命令用于声明shell变量
+/-  "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
-f  仅显示函数。
r  将变量设置为只读。
x  指定的变量会成为环境变量,可供shell以外的程序来使用。
i  [设置值]可以是数值,字符串或运算式。

找出1-100以内奇数、偶数的和

#!/bin/bash
#
declare -i evenum=0
declare -i oddnum=0
for I in {1..100};do
    if [ $[$I%2] -eq 0 ];then
        let evenum+=$I
    else
        let oddnum+=$I
    fi  
done
echo "even sum is:$evenum"
echo "odd sum is:$oddnum"

sed命令详解

sed命令学习
sed:用于过滤和转换文本的流编辑器(Stream Editor);行编辑器

sed: 模式空间
默认不编辑原文件,仅对模式空间中的数据做处理;处理结束后,将模式空间打印至屏幕;
选项:
sed [options] 'AddressCommand' file ...
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件(慎用)
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT
sed -f /path/to/scripts file
-r: 如果使用扩展正则表达式需要加-r

Address:
1、StartLine,EndLine
比如1,100
$:最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行;

命令Command
d: 删除符合条件的行;

sed '1,12d' /etc/inittab #删除1-12行内容,显示剩余行
sed '5,$d' /etc/inittab #删除5到最后一行,显示1-4行内容

p: 显示符合条件的行;

sed -n '1,12p' /etc/inittab #要加-n,否则1-12行的内容会显示两次,其他内容一次

a \string: 在指定的行后面追加新行,内容为string
\n:可以用于换行

sed '3,4a \This is new word!' /etc/grub.conf #在第3和4行后面添加内容This is new word!
sed '7a \#This is new word!\nThis is second line!' /etc/grub.conf  #在第7行后面添加This is new word!并且换行添加his is second line!

i \string: 在指定的行前面添加新行,内容为string #用法同上
r FILE: 将指定的文件的内容添加至符合条件的行处

sed '4r /etc/issue' /etc/fstab #将/etc/issue内容添加到/etc/fstab的第4行后面(也就是第5行开始)并显示出来
sed '$r /etc/issue' /etc/fstab #将/etc/issue内容添加到/etc/fstab的最后一行显示出来

w FILE: 将地址指定的范围内的行另存至指定的文件中;

sed '/OS/w /root/a.txt' /etc/issue #把issue文件中包含OS的行,写到a.txt
sed '2,$w /root/a.txt' /etc/issue #把issue文件中第2行到最后一行内容,写到a.txt

s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
修饰符
g: 全局替换
i: 忽略字符大小写
&: 引用模式匹配整个串
s/content1/content2/g = s#content1#content2#g = s&content1&content2&g

sed 's/i..t/&TTT/g' /etc/inittab #查找inittab文件里全部i..t的内容,并且替换为后面加TTT
sed 's#\(i..t\)#\1TTT#g' /etc/inittab #同上
sed 's#\(/.*t/\)#\1TTTTT#g' /etc/inittab 查找inittab文件里全部/.*/的内容,并且替换为后面加TTT
#sed命令是行编辑器

删除/etc/grub.conf文件中行首的空白符;

sed 's#^[[:space:]]*##g' /etc/grub.conf 

替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;

sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab

Linux bash脚本编程(三)

Linux bash脚本编程

shell中如何进行算术运算:
A=3
B=6
1、let 算术运算表达式
let C=$A+$B

A=10
B=12
let C=$A+$B
22

2、$[算术运算表达式]
C=$[$A*$B]
3、$((算术运算表达式))
C=$(($A-$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=expr $A / $B

多分支的if语句:
if 判断条件1; then
statement1
...
elif 判断条件2; then
statement2
...
elif 判断条件3; then
statement3
...
else
statement4
...
fi

文件测试:
-e FILE:测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户对指定文件是否有读取权限;
-w
-x

exit: 退出脚本
exit #
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码

#!/bin/bash
#
if [ $# -lt 1 ]; then
    echo "Usage:$0 ARG1 [ARG2 ...]"
    exit 4
elif [ -e $1 ]; then
    echo 'There is this file'
else
    echo 'No such file'
fi

P.S:由于在公司和家里两个地方,并且bash时间太长,也没有保存图片