s3.运维经典面试题(一)

208 阅读10分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

第一章 计算机基础和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仍然看到空间不足,为什么?如何解决?

011.jpg

012.jpg

013.jpg

[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