1.软连接和硬链接的区别
1、本质不同
硬链接:同一个文件,多个名称。
软链接:不同的文件。
2、跨分区
硬链接:不支持跨分区。
软链接:支持跨分区。
3、目录
硬链接:不支持对目录创建。
软链接:支持对目录创建。
4、相互关系
硬链接:删除某一个硬链接,另一个硬链接不影响使用。
软链接:原始文件和软链接有依赖关系,原始文件删了,软链接就失效了。
5、inode编号
硬链接:inode编号是相同的。
软链接:inode编号不同。
6、链接数
硬链接:删除一个硬链接,硬链接的链接数会有变化。
软链接:删除一个软链接,链接数不会有变化,删除的相当于是一个文件(或快捷方式)。
7、相对路径:原始文件路径
硬链接:硬链接的相对路径,是相对的当前工作目录的相对路径。
软链接:软链接的原始文件路径是,相对的软链接的相对路径,而不是相对当前工作目录。
8、文件类型
硬链接:硬链接的文件类型是,原来是什么就是什么,例如:原来是普通文件,还是普通文件。
软链接:软链接的文件类型是L
9、命令的实现不一样
硬链接:ln
软链接:ln -s
2.Linux的目录结构
1. 根目录(/)
根目录是整个文件系统的顶级目录,所有其他目录和文件都是从根目录开始的。在Linux中,根目录用斜杠(/)表示。
2. /bin
/bin目录包含一些基本的可执行文件,这些文件是系统启动和运行所必需的。例如,/bin目录包含常用的命令如ls、cp、rm等。
3. /boot
/boot目录包含启动加载程序(bootloader)的相关文件,包括内核映像文件和引导配置文件。在启动过程中,系统会使用/boot目录下的文件来引导操作系统。
4. /dev
/dev目录包含设备文件,这些文件用于与系统中的设备进行交互。在Linux中,一切都被视为文件,设备文件用于访问硬件设备,如磁盘、键盘、鼠标等。
5. /etc
/etc目录包含系统的配置文件。这些配置文件用于设置系统的各种参数和选项,例如网络配置、用户账户配置、服务配置等。/etc目录中的文件对系统的正常运行至关重要。
6. /home
/home目录是用户的主目录,每个用户都有一个与其用户名相对应的子目录。用户可以在自己的主目录中存储个人文件和配置。
7. /lib和/lib64
/lib目录和/lib64目录包含共享库文件,这些库文件是应用程序和系统工具所需的共享组件。/lib目录用于32位系统,而/lib64目录用于64位系统。
8. /media
/media目录用于挂载可移动设备,如光盘、USB驱动器等。当插入可移动设备时,系统会自动将其挂载到/media目录下的子目录中。
9. /mnt
/mnt目录用于临时挂载其他文件系统或网络共享。管理员可以将其他设备或远程共享挂载到/mnt目录中,以便访问其内容。
10. /opt
/opt目录用于安装第三方软件包。一些应用程序将其安装在/opt目录下,以便与系统的其他部分分离。
11. /proc
/proc目录是一个虚拟文件系统,提供有关系统和进程的信息。系统管理员和开发人员可以通过读取/proc目录下的文件来获取关于系统状态、进程信息、硬件配置等的实时数据。
12. /root
/root目录是超级用户(root用户)的主目录。与普通用户的主目录(/home)不同,超级用户的主目录位于/root。只有root用户可以访问和操作/root目录。
13. /sbin
/sbin目录包含系统管理员使用的一些系统命令和工具。这些命令和工具通常用于系统管理和维护任务,例如启动和停止服务、网络配置等。
14. /srv
/srv目录用于存储系统服务提供的数据。例如,Web服务器可以将网站数据存储在/srv目录下。
15. /tmp
/tmp目录用于存储临时文件。该目录中的文件通常在系统重新启动后被删除。应注意定期清理/tmp目录,以确保不会占用过多的磁盘空间。
16. /usr
/usr目录包含用户的应用程序和文件。这是Linux系统中最大的目录之一,它通常包含共享的可执行文件、库文件、文档、图标等。
17. /var
/var目录用于存储可变数据,例如日志文件、缓存文件和临时文件。/var目录中的数据通常在系统运行时会频繁变化。
18. /run
/run目录是一个临时文件系统,用于存储在系统引导过程中需要保存的运行时数据。例如,PID文件、锁文件等。
19. /run/user
/run/user目录包含与用户相关的运行时数据。每个用户都有一个与其用户ID相对应的子目录,用于存储用户特定的运行时数据。
20. /sys
/sys目录是一个虚拟文件系统,用于提供关于系统硬件和设备的信息。它是与/sys目录下的文件进行交互的一种方法。
21. /srv
/srv目录用于存储系统服务提供的数据。例如,Web服务器可以将网站数据存储在/srv目录下。
3.Linux系统的启动流程
其过程可以分为5个阶段:
- 内核的引导。
- 运行 init。
- 系统初始化。
- 建立终端 。
- 用户登录系统。
具体可参考菜鸟:https://www.runoob.com/linux/linux-system-boot.html
4. 删除修改时间超过60分钟的.log格式的文件
find /var/log/nginx/ -mmin +60 -name "*.log" -exec rm {} \;
5.查看操作系统版本,内核版本等
uname
-a 或--all 显示全部的信息,包括内核名称、主机名、操作系统版本、处理器类型和硬件架构等。。
-m 或--machine 显示处理器类型。
-n 或--nodename 显示主机名。
-r 或--release 显示内核版本号。
-s 或--sysname 显示操作系统名称。
-v 显示操作系统的版本。
--help 显示帮助。
--version 显示版本信息。
-p 显示处理器类型(与 -m 选项相同)。
uname -v -r
6.Buffer 与 Cache
Cache
缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。
Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。
Buffer
缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据;通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。Buffer一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。
7. 设置用户下次登录必须修改密码
passwd -e 用户名
8.sudo和su的区别
su
su命令是Linux系统中用于切换到其他用户身份的命令。通常,它需要超级用户(root)的密码才能切换到其他用户。使用su命令时,用户可以切换到其他用户的账户,并获得该账户的权限,如同该账户本身的操作一样。
su 用户名 ,与su -用户名 的不同之处如下:
- su -用户名 切换用户后,同时切换到新用户的工作环境中。
- su 用户名 切换用户后,不改变原用户的工作目录,及其他环境变量目录。
sudo
sudo命令是Linux系统中的一个命令,用于以超级用户(root)的权限执行特定命令。与su命令不同,sudo命令允许普通用户以自己的密码执行特权操作,而无需知道超级用户的密码。使用sudo命令时,用户需要在命令前加上sudo关键字,并输入自己的密码来确认身份。
如何添加用户,使其拥有 sudo 权限?
vim /etc/sudoers
9. 配置dir目录下新建文件自动赋予user1用户的可读可写权限
setfacl -m u:user1:rx /dir
#不会继承父级目录的权限
setfacl -m d:u:user1:rx /dir
# 在前面加上一个d,就可以设置默认facl权限
10. 文件的特殊权限
suid
suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行
文件时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加 suid 权限,则会显示大
写S,属于无效。
chmod u+s 文件名
sgid
sgid 属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户
执行该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加 sgid 权
限,则会显示大写S,属于无效。
chmod g+s 目录名/文件名
sticky
sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限
是777或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅
对目录有效)。
chmod o+t 目录名
11. 僵尸进程和孤儿进程如何产生如何处理
子进程和fork( )系统调用
要想了解孤儿进程和僵尸进程,我们首先需要了解子进程这个概念。
- 进程在执行期间,可以通过fork( )系统调用来创建一个属于自己的子进程。这时,称调用fork的进程为父进程,由fork创建的进程为该父进程的子进程。一般而言,父子进程共享代码段,但对于数据段、栈段等其他资源,父进程在调用fork函数时会将该部分资源完全复制到子进程中去,父子进程对该部分的资源并不共享。
- 创建完子进程后,父进程从fork( )的返回点继续执行,而子进程也是从fork( )的返回点开始执行。一般而言,要么先执行子进程,要么父子进程并行执行(这取决于操作系统设计者的设计)。
- 父进程通过调用wait( )系统调用来将其子进程回收释放。
僵尸进程
进程已经终止,但其父进程仍未调用wait( )将其回收,则该进程为僵尸进程(此时父进程并没有终止)。一般而言,僵尸进程只是短暂存在,当其被父进程回收释放时,那么该进程便不再存在。
- 孤儿进程与僵尸进程的共同点是进程都是子进程,且都已执行完成,但仍未释放资源;区别在于其父进程是否已经终止。
- 僵尸进程有可能会变为孤儿进程。
孤儿进程
其父进程已经终止,但父进程没有调用wait( )将其回收,那么该进程为孤儿进程。
如何处理僵尸进程
处理僵尸进程,实际上就是父进程调用wait( )系统调用回收执行完的子进程的过程。
父进程在执行完成后都会通过调用exit( )系统调用来对自己进行释放回收。
在每一个进程的PCB中都存储了进程对应的状态,当进程执行完毕时,我们会将其状态设置为DEAD状态。
因此,僵尸进程可以通过下方方法进行处理:
- 当父进程执行完成后,调用exit( )前,首先调用wait( )来回收已执行完成的子进程。
- wait( )的实现规则为:
- (1)在wait函数中,它会一直循环查找调用wait系统调用的这一进程的子进程(每一个父进程都会有一个子进程队列,查找时顺序查找该队列)。如果所有进程都查找了一遍都没有当前进程的子进程,说明该进程已经不存在子进程,那么我们直接返回,结束函数;
- (2)如果查找了一遍发现存在子进程,但子进程的状态都不为DEAD,那么我们调用schedule( )函数去执行其他进程或线程,该进程等待下一次分配cpu时间再从头寻找子进程;(schedule函数是进程调度函数)
- (3)如果在查找的过程中发现了一个状态为DEAD的子进程,那么这就是我们要释放的子进程,我们将其释放;
如何处理孤儿进程
在这里我们需要知道,父进程是如何通过调用exit( )来回收自身的。
实际上,当父进程执行结束后(亦或者是时间片用完),会立即调用schedule函数来将就绪队列中的下一个进程换上cpu。而在schedule函数中,首先判断当前进程是否已执行完毕,即检查状态是否为DEAD,如果为DEAD则会调用exit( )将其回收释放,然后再换上就绪队列中的下一个进程。
据此,我们可以设置一个专门存放状态为DEAD的进程的队列,通过在schedule函数中回收该队列的进程来实现对孤儿进程的回收。
12. Linux中,ctrl+c的原理
在Linux终端上敲“Ctrl+c”,就产生一个“中断”,会产生SIGINT信号,终端将其发送到该终端的前台进程组中的每一个进程,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程)。
13.RAID0,1,5,01,10的区别和各自的优缺点
RAID0
数据存在多块硬盘,可以同时读多块硬盘,加快读的速度,但是缺点也明显,故障率也会提高

RAID1
数据多块磁盘放相同的数据,可以用来进行备份冗余,保障数据的安全,但是不会对读的速度有帮助

RAID5
当RAID5的一个磁盘数据损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
写性能较差,每次在写的时候要先读其他盘,来确定奇偶校验位,读性能较好,可以多块盘一起读。

RAID10
先做RAID1再做RAID0
这种架构的优势在于既兼顾了系统冗余有拥有读取分块加速能力,故障率较低,缺点是由于该架构较为复杂,一份数据需要至少四块硬盘才能够架构,比较费盘。

RAID01
先做RAID0再做RAID1
这种架构的安全性低于raid10,而两者由于IO数量一致。读写速度相同,使用的硬盘数量也一致。
所以raid10比raid01是一种更为先进的架构。

14.LVM中几个组件的关系(LV,PV,PE,VG)
先创建PE,然后把PE整合为VG,之后再把VG变为LV,LV就可以被拿去挂载使用了

15.selinux,iptables,firewalld的关系和区别
16.iptables中的五链四表
五链
iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。
PREROUTING
- 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
INPUT
- 处理入站的数据包
OUTPUT
- 处理出站的数据包
FORWARD
- 处理转发的数据包
POSTROUTING
- 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
四表
iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
raw表
- 确定是否对该数据包进行状态跟踪
mangle表
- 为数据包设置标记(较少使用)
nat表
- 修改数据包中的源、目标IP地址或端口
filter表
- 确定是否放行该数据包(过滤)

规则表的先后顺序:raw→mangle→nat→filter
规则链的先后顺序:
入站顺序
- PREROUTING→INPUT
出站顺序
- OUTPUT→POSTROUTING
转发顺序
- PREROUTING→FORWARD→POSTROUTING
17.firewalld如何放行端口
firewall-cmd --permanent --zone=public --add-port=8080
18.cron计划任务的表达式(分时日月星期)
分 时 日 月 星期 命令
* 表示任何数字都符合
0 2 * * * /run.sh # 每天的2点
0 2 14 * * /run.sh # 每月14号2点
0 2 14 2 * /run.sh # 每年2月14号2点
0 2 * * 5 /run.sh # 每个星期5的2点
0 2 * 6 5 /run.sh # 每年6月份的星期5的2点
0 2 2 * 5 /run.sh # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
0 2 2 6 5 /run.sh # 每年6月2号或者星期5的2点
* /5 * * * * /run.sh # 每隔5分钟执行一次
0 2 1,4,6 * * /run.sh # 每月1号,4号,6号的2点
0 2 5-9 * * /run.sh # 每月5-9号的2点
* * * * * /run.sh # 每分钟
0 * * * * /run.sh # 每整点
* * 2 * * /run.sh # 每月2号的每分钟

可参考:https://zhuanlan.zhihu.com/p/560949944?utm_id=0
19.bash中管道和重定向的作用
管道
command1 | command2 | command3...
上面command1的(标准)输出会作为command2的(标准)输入,而command2的(标准)输出会作为command3的(标准)输入。由此各命令通过 【输出】 -> 【输入->输出】-> 【输入->输出】…的方式实现级联。
输出重定向(覆盖,追加)
正确输出: 1> 1>> 等价于 > >>
错误输出: 2> 2>>
输入重定向
标准输入: < 等价 0<
20.日志切割相关知识点
如果没有日志轮转,日志文件会越来越大
将丢弃系统中最旧的日志文件,以节省空间
logrotate本身不是系统守护进程,它是通过计划任务crond每天执行
日志轮转状态/var/lib/logrotate/logrotate.status
日志轮转规则按照/etc/logrotate.conf
21.cpu使用率会超过100%嘛,为什么
会。
在Linux系统中, CPU使用率通常是以百分比来衡量的,每个CPU核心的使用率上限为100%。但是,当系统执行高负载而且多线程应用程序时, CPU使用率就可能会超过100%。这是由于Linux在计算多个CPU核心的总使用率时,将所有核心的使用率相加,导致总使用率高于100%.例如,当一个应用程序使用了2个CPU核心,并且每个核心的使用率均达到了100%,那么系统的总CPU使用率将会是200%。这意味着,当一个应用程序使用多个CPU核心时,它可以使用超过100%的CPU使用率,这在Linux系统中是一个常见的现象。
理论上cpu总共有N个核,top查看的%CPU就可以显示到上限 N*100%。
22.进程运行级别,优先级如何计算
nice命令用来修改程序的优先级别,如果未指定程序,则会显示目前程序的优先级别,默认的nice值为0,范围为 -20(最高优先级别)到 19(最低优先级别)。
nice数字越小,表示程序会越优先被处理,在系统运行缓慢的时候,nice值越小的进程会有越高的优先处理级别
23.shell和其他语言有什么区别
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一
种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的
服务。(翻译官,帮你翻译命令给内核执行)。
shell是一种解释型语言,在脚本里面,如果有一步执行出现错误,后面的不受影响会继续执行。
shell使用变量需要加$符号。
24.如何查看系统负载
Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。
使用 top 查看进程的 CPU 负载
交互模式快捷键

25.什么是内核态什么是用户态
内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。
用户态:处于用户态的 CPU 只能访问受限资源,不能直接访问内存等硬件设备,不能直接访问内存等硬件设备,必须通过「系统调用」陷入到内核中,才能访问这些特权资源。
26.有一块新硬盘,如何挂载
[root@localhost ~]# parted /dev/sdb mkpart primary 1 200M
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# vim /etc/fstab
/dev/sdb1 /mnt/volume1 ext4 defaults 0 0
[root@localhost ~]# mount -a