本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
第一章 计算机基础和Linux安装
1.冯·诺依曼体系结构组成部分
计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
2.Linux哲学思想(或Liunx基本原则、思想、规则)
- 一切都是一个文件(包括硬件)。
- 小型,单一用途的程序。
- 连接程序,共同完成复杂的任务(脚本)。
- 避免令人困惑的用户界面。
- 配置数据存储在文本中。
第三章 Linux文件管理和IO重定向
1.Linux有几种文件类型
-
- 普通文件
- d 目录文件
- b 块设备
- c 字符设备
- l 符号链接文件
- p 管道文件pipe
- s 套接字文件socket
2.批量修改文件名
[root@centos8 /data]#touch f{1..10}.conf
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
[root@centos8 /data]#mv *.conf *.conf.bak
mv: target '*.conf.bak' is not a directory
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
范例:为所有的conf文件加上.bak后缀
[root@centos8 /data]#rename conf conf.bak *
[root@centos8 /data]#ls
f10.conf.bak f2.conf.bak f4.conf.bak f6.conf.bak f8.conf.bak
f1.conf.bak f3.conf.bak f5.conf.bak f7.conf.bak f9.conf.bak
范例:去掉所有的bak后缀
[root@centos8 /data]#rename .bak "" *
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
3.什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
链接分硬链接和符号链接。
符号链接可以建立对于文件和目录的链接。符号链接可以跨文件系统,即可以跨磁盘分区。符号链接的文件类型位是l,链接文件具有新的i节点。
硬链接不可以跨文件系统。它只能建立对文件的链接,硬链接的文件类型位是-,且硬链接文件的i节点同被链接文件的i节点相同
4.硬链接和软链接区别
1.本质
硬链接:本质是同一个文件
软链接:本质不是同一个文件
2.跨设备
硬链接:不支持
软链接:支持
3.inode
硬链接:相同
软链接:不同
4.链接数
硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
软链接:创建或删除,链接数不会变化
5.文件夹
硬链接:不支持
软链接:支持
6.相对路径
硬链接:原始文件相对路径是相对于当前工作目录
软链接:原始文件相对路径是相对于链接文件的相对路径
7.删除源文件
硬链接:只是链接数减一,但链接文件的访问不受影响
软链接:链接文件将无法访问
8.文件类型
硬链接:和源文件相同
软链接:链接文件,和源文件无关
5.提示空间满 No space left on device,但 df 可以看到空间很多,为什么?
[root@rocky8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 309 523979 1% /boot
[root@rocky8 ~]# mkdir /boot/testdir
[root@rocky8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 310 523978 1% /boot
#创建一个目录,节点编号也相应增加
[root@rocky8 ~]# touch /boot/testdir/file{1..523978}
bash: /usr/bin/touch: Argument list too long
[root@rocky8 ~]# echo /boot/testdir/file{1..523978} |xargs touch
[root@rocky8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 524288 0 100% /boot
#节点编号使用完了
[root@rocky8 ~]# touch /boot/testdir/new{1..100}.txt
touch: cannot touch '/boot/testdir/new32.txt': No space left on device
touch: cannot touch '/boot/testdir/new33.txt': No space left on device
touch: cannot touch '/boot/testdir/new34.txt': No space left on device
touch: cannot touch '/boot/testdir/new35.txt': No space left on device
touch: cannot touch '/boot/testdir/new36.txt': No space left on device
touch: cannot touch '/boot/testdir/new37.txt': No space left on device
touch: cannot touch '/boot/testdir/new38.txt': No space left on device
touch: cannot touch '/boot/testdir/new39.txt': No space left on device
touch: cannot touch '/boot/testdir/new40.txt': No space left on device
touch: cannot touch '/boot/testdir/new41.txt': No space left on device
#inode用完了为啥还能创建文件,因为系统可能默认保留了多少inode,用完了,彻底不能创建文件,提示设备没有空间
[root@rocky8 ~]# df /boot
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 1038336 454572 583764 44% /boot #但是/boot分区只使用了44%利用率
[root@rocky8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524320 524320 0 100% /boot
#空间不足不是磁盘使用率没有了,而是节点编号使用率100%了
[root@rocky8 ~]# rm -rf /boot/testdir/
[root@rocky8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524320 309 524011 1% /boot
#删除了数据才能释放节点编号
6.提示空间快满,使用 rm 删除了很大的无用文件后,df仍然看到空间不足,为什么?如何解决?
[root@rocky8 data]# dd if=/dev/zero of=/boot/dir/bigfile bs=1M count=700 #在/boot分区创建一个700M文件
700+0 records in
700+0 records out
734003200 bytes (734 MB, 700 MiB) copied, 2.81391 s, 261 MB/s
[root@rocky8 data]# ll -h /boot/dir/bigfile
-rw-r--r--. 1 root root 700M Nov 18 17:27 /boot/dir/bigfile
[root@rocky8 data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#/boot分区空间使用了98%,快使用完了
[root@rocky8 data]# tail -f /boot/dir/bigfile #文件正在被使用
[root@rocky8 data]# rm -f /boot/dir/bigfile #把这个文件删除了
[root@rocky8 data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#但是/boot分区空间还是没有被释放
[root@rocky8 data]# tail -f /boot/dir/bigfile
^C
#把这个程序访问停了
[root@rocky8 data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 191M 719M 21% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#现在/boot分区空间被释放了
[root@rocky8 data]# dd if=/dev/zero of=/boot/dir/bigfile bs=1M count=700 #模拟环境创建一个700M的大文件
700+0 records in
700+0 records out
734003200 bytes (734 MB, 700 MiB) copied, 0.525512 s, 1.4 GB/s
[root@rocky8 data]# ll -h /boot/dir/bigfile
-rw-r--r--. 1 root root 700M Nov 18 17:34 /boot/dir/bigfile
[root@rocky8 data]# f -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#现在/boot 空间已经使用98%
[root@rocky8 data]# tail -f /boot/dir/bigfile #模拟文件正在被使用
[root@rocky8 data]# lsof /boot/dir/bigfile #lsof查看这个文件是否被访问
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 5288 root 3r REG 8,1 734003200 309 /boot/dir/bigfile
#现在显示文件正在被使用
[root@rocky8 data]# cat /dev/null > /boot/dir/bigfile #把文件清空
[root@rocky8 data]# ll /boot/dir/bigfile
-rw-r--r--. 1 root root 0 Nov 18 17:38 /boot/dir/bigfile
#现在文件大小为0
[root@rocky8 data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 191M 719M 21% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#/boot空间也被释放了
[root@rocky8 data]# rm -f /boot/dir/bigfile
#现在删除文件,不管它文件是否被使用,它文件已被清空,也就不占空间了
7.linux系统文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。
8.下面4中写法哪种写法和别的效果不同
ls a.txt xxx > all.log 2>&1
ls a.txt xxx 2>&1 > all.log #这个效果不同
ls a.txt xxx 2> all.log 1>&2
ls a.txt xxx &> all.log
9.计算1+2+3+...+99+100的总和
[root@centos8 ~]#echo {1..100} | tr ' ' + | bc
5050
[root@centos8 ~]# seq -s + 100 | bc
5050
#计算1-100之间的奇数和
[root@centos8 ~]# echo {1..100..2} |tr ' ' '+' |bc
2500
##计算1-100之间的偶数和
[root@centos8 ~]# echo {2..100..2} |tr ' ' '+' |bc
2550