Linux琐碎知识点总结

目录

1 开机启动流程

这里写图片描述

  1. 开机BIOS自检
    检查硬件是否正常
  2. MBR引导
    硬盘0柱面0磁道1扇区的前446byte(一扇区共512byte,没有读取完毕)后边还有66字节,其中64字节作为分区表使用,即4个分区表(每个分区表16字节),还有2字节(55AA标识)作为分区的结束
  3. grub引导菜单
    cat /etc/grub.conf
  4. 加载内核kernel
  5. 加载init进程,进程号为1,为第一个启动的进程。会读取/etc/inittab文件–>执行/etc/rc.d/rc.sysinit脚本(一些基本的设置)–>执行/etc/rc.d/rc脚本(/etc/rc*.d/ ,会选择对应的运行级别而后启动)–>启动mingetty进程

2 buffer和cache的区别(简单概述)

  1. 写入数据到内存里,这个数据的内存空间为缓冲区(buffer),称之为写入缓冲区
  2. 从内存读取数据,这个存数据的内存空间为缓存区(cache),称之为读取(内存)缓存区

3 sed -i.bak 在修改文件的时候备份

[root@linux-node1 ~]# mkdir RSQ
[root@linux-node1 ~]# cd RSQ
[root@linux-node1 RSQ]# cp /etc/passwd .
[root@linux-node1 RSQ]# ls
passwd
[root@linux-node1 RSQ]# sed -i.bak 's#root#rsq#g' passwd 
[root@linux-node1 RSQ]# ls
passwd  passwd.bak
[root@linux-node1 RSQ]# grep root passwd
[root@linux-node1 RSQ]# grep root passwd.bak 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4 find -maxdepth 1 指定查找的深度

[root@linux-node1 ~]# for i in /root/RSQ/stu{1..3}; do mkdir $i/{1..2} -p ; done
[root@linux-node1 ~]# tree RSQ/
RSQ/
├── passwd
├── passwd.bak
├── stu1
│   ├── 1
│   └── 2
├── stu2
│   ├── 1
│   └── 2
└── stu3
    ├── 1
    └── 2

9 directories, 2 files
[root@linux-node1 ~]# find RSQ/ -maxdepth 1 -type d 
RSQ/
RSQ/stu2
RSQ/stu3
RSQ/stu1
[root@linux-node1 ~]# find RSQ/ -maxdepth 2 -type d 
RSQ/
RSQ/stu2
RSQ/stu2/1
RSQ/stu2/2
RSQ/stu3
RSQ/stu3/1
RSQ/stu3/2
RSQ/stu1
RSQ/stu1/1
RSQ/stu1/2

5 目录及子目录

  1. /etc/profile
    此为全局的环境变量配置文件,在此配置的环境变量会在全局生效
  2. /etc/profile.d/
    此目录下的所有脚本在系统启动后都会执行,类似/etc/rc.local配置文件会被启动后执行。
  3. /etc/motd
    此文件支持字串,类似单引号”所见即所得,此文件中的所有内容在登录用户的时候都会输出。
# 测试
[root@linux-node1 ~]# cat /etc/profile.d/rsq.sh 
echo "I'm the man of Linux learning."
[root@linux-node1 ~]# cat /etc/motd 
echo "This all will be output."

# 重新登录
Last login: Sat Jul 14 15:40:20 2018 from 10.0.0.1
echo "This all will be output."
I'm the man of Linux learning.
[root@linux-node1 ~]# 

# 注意到/etc/motd的文件先/etc/profiled.d/目录下文件输出,且里面是啥内容就会输出什么内容

6 inode和block知识

  1. inode,中文意思是索引节点(index node)。在每个Linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘… …)被格式化为ext4(Centos6.x)文件系统,一般生成两部分:第一部分是Inode(很多个),第二部分是Block(很多个)。
  2. Block是用来存储实际数据用的,磁盘读取数据是按block为单位读取的。例如:照片、视频等普通文件数据。
  3. 而Inode就是用来存储这些数据属性信息的(也就是ls -l的结果),inode属性信息包括不限于文件大小、属主(用户)、归属的用户组、文件权限、文件类型、修改时间,还包含指向文件实体的指针的功能(inode节点–block的对应关系)等,但是,inode里面唯独不包含文件名,文件名一般在上级目录的block里。
  4. Inode除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,即可通过inode 的值最快的找到相对应的文件实体。
  5. 因为inode 要存放文件的属性信息,所以每个inode 本身是有大小的,Centos6系列inode 的默认大小是256 字节,inode 的大小在分区被格式化创建文件系统之后定下来,被格式化之后就无法更改inode的大小了,格式化前可以通过参数指定inode 大小,但是一般没这个需求。
  6. 一个文件可能占用多个block。但是每读取一个block就会消耗一次磁盘I/O。如果要提升磁盘IO 性能,那么尤要尽可能一次性读取数据尽量的多。一个block 只能存放一个文件的内容,无论内容有多小。如果block 4K,那存放1K 的文件,剩余3K就浪费了。
  7. Block 并非越大越好。Block 太大对于小文件存放就会浪费磁盘空间,例如:1000K的文件,BLOCK 大小为4K,占用250 个BLOCK;若BLOCK 为IK,要占1000个BLOCK。访问效率谁更高? 消耗IO 分别为250 次和1000 次。
  8. Block 的设置也是格式化分区的对候,(mkfs.ext4-b 2048-I 256 /dev/sdb)文件较大时,block 设置大一些会提升磁盘访问效率。ext3/ext4文件系统(Centos5和6),一般都设置为4K。
# 查看系统每个inode和block的大小
[root@linux-node1 ~]# dumpe2fs /dev/sda1 |egrep -i "inode size|block size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               1024
Inode size:               128

# 查看系统inode和block的使用情况
[root@linux-node1 ~]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      249488 69743 179745   28% /
tmpfs           60748     5  60743    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot
[root@linux-node1 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       3.7G  2.0G  1.6G  57% /
tmpfs           238M   16K  238M   1% /dev/shm
/dev/sda1       190M   35M  146M  19% /boot

# 查看文件inode位置点(ls -i或stat file)
[root@linux-node1 ~]# ls -i test.sh 
42885 test.sh
[root@linux-node1 ~]# stat test.sh 
  File: `test.sh'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d      Inode: 42885       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-07-14 15:22:34.020324203 +0800
Modify: 2018-07-14 15:22:34.020324203 +0800
Change: 2018-07-14 15:22:34.021324178 +0800

7 软硬链接的区别

  1. 默认不带参数的情况下,ln命令创建的是硬链接,带 -s 参数的ln命令创建的是软链接。
  2. 硬链接文件与源文件的inode节点号相同,而软连接文件的inode节点号与源文件不同。
  3. ln命令不能目录创建硬链接,但是可以创建软链接,对目录的软链接会经常被用到。
  4. 删除软链接文件,对源文件及硬链接文件无任何影响。
  5. 删除文件的硬链接文件,对源文件及软链接文件无任何影响
  6. 删除链接文件的源文件对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状)
  7. 同时删除源文件及其硬链接文件,整个文件才会被真正的删除
  8. 很多硬件设备中的快照功能,使用的就类似硬链接的原理

8 删除文件原理

linux的文件名是存在父目录的bolck里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的bolck 的数据块。我们删除一个文件,实际上并不清除inode 节点和block 的数据。只是在这个文件的父目录里面的bolck 中,删除这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode 节点,当没有文件名指向这个inode 节点的时候,会同时释放inode 节点和存放这个文件的数据块,并更新inode MAP和block MAP 今后让这些位置可以用于放置其他文件数据。

9 磁盘满的两种原因(inode或block满)

  • 有时候我们会遇到一种情况,当我们df -h显示磁盘还有剩余使用率,但是我们就是不能创建文件,这个时候可以用df -i查看一下inode的使用率,很有可能是inode使用完毕。

10 ls -l –time-style=long-iso可以显示顺序格式时间戳

[root@linux-node1 RSQ]# ls -l
total 8
-rw-r--r-- 1 root root 1473 Jul 14 15:23 passwd
-rw-r--r-- 1 root root 1477 Jul 14 15:23 passwd.bak
[root@linux-node1 RSQ]# ls -l --time-style=long-iso
total 8
-rw-r--r-- 1 root root 1473 2018-07-14 15:23 passwd
-rw-r--r-- 1 root root 1477 2018-07-14 15:23 passwd.bak
[root@linux-node1 RSQ]# ls -l --time-style=full   # 可以显示更详细的信息
total 8
-rw-r--r-- 1 root root 1473 2018-07-14 15:23:46.865324237 +0800 passwd
-rw-r--r-- 1 root root 1477 2018-07-14 15:23:12.111324629 +0800 passwd.bak

11 sed 的模式空间及sed 基于正则的后向引用

  • sed在进行替换或修改文件的操作时都会先在一个空间进行操作,不会影响到源文件,操作完毕后若不加-n则会把源文件及修改过的文件信息打印出来,而这个空间就被称之为sed的模式空间。

sed的后向引用

格式:sed -nr 's#(.*)(.*)(.*)#\1\2\3#gp'

# 测试:以取IP地址为例子,用sed取出10.0.0.77
[root@linux-node1 ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:AF:BB:6D  
          inet addr:10.0.0.77  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feaf:bb6d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2263273 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1645554 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:407328527 (388.4 MiB)  TX bytes:174104374 (166.0 MiB)

[root@linux-node1 ~]# ifconfig eth0|sed -nr '2s#^.*addr:(.*) Bcas.*$#\1#gp'
10.0.0.77 

12 rename更改文件名 格式rename from to …

# 举个简单例子,我们模拟一组数据,更改某一目录下所有目录名
[root@linux-node1 RSQ]# touch stu{1..5}_rsq_finished.txt
[root@linux-node1 RSQ]# ls
stu1_rsq_finished.txt  stu3_rsq_finished.txt  stu5_rsq_finished.txt
stu2_rsq_finished.txt  stu4_rsq_finished.txt
[root@linux-node1 RSQ]# ls *.txt|sed -nr 's#^(.*)_finished(.*)#mv & \1\2#gp'
mv stu1_rsq_finished.txt stu1_rsq.txt
mv stu2_rsq_finished.txt stu2_rsq.txt
mv stu3_rsq_finished.txt stu3_rsq.txt
mv stu4_rsq_finished.txt stu4_rsq.txt
mv stu5_rsq_finished.txt stu5_rsq.txt
[root@linux-node1 RSQ]# ls *.txt|sed -nr 's#^(.*)_finished(.*)#mv & \1\2#gp'|bash
[root@linux-node1 RSQ]# ls
stu1_rsq.txt  stu2_rsq.txt  stu3_rsq.txt  stu4_rsq.txt  stu5_rsq.txt

# rename改名更简单
[root@linux-node1 RSQ]# rename "rsq" "rsq_finished" *
[root@linux-node1 RSQ]# ls
stu1_rsq_finished.txt  stu3_rsq_finished.txt  stu5_rsq_finished.txt
stu2_rsq_finished.txt  stu4_rsq_finished.txt

13 Linux初始化目录:/etc/skel/ 和用户初始化设置文件/etc/login.defs

/etc/skel/目录下的所有文件在系统新用户创建后都会拷贝至其家目录中

[root@linux-node1 ~]# ls -a /etc/skel/   # 默认的目录下的文件,都是隐藏文件
.  ..  .bash_logout  .bash_profile  .bashrc
[root@linux-node1 ~]# echo "This is a test." >/etc/skel/test.txt  # 创建一个test文件
[root@linux-node1 ~]# ls -a /etc/skel/
.  ..  .bash_logout  .bash_profile  .bashrc  test.txt
[root@linux-node1 ~]# useradd test   # 新建用户测试
[root@linux-node1 ~]# su - test
[test@linux-node1 ~]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  test.txt
[test@linux-node1 ~]$ cat test.txt   
This is a test.

# 初始化用户的设置
[root@linux-node1 ~]# egrep -v "^(#|^$)" /etc/login.defs 
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
UID_MIN                   500
UID_MAX                 60000
GID_MIN                   500
GID_MAX                 60000
CREATE_HOME     yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512 

14 忘记root密码修改的3种方法

  1. 单用户,在启动的时候编辑内核文件,在其后加入 1 or single等进入单用户模式修改密码;
  2. 救援模式(根默认在/mnt/sysimage)把/mnt/sysimage/etc/passwd文件中的x删掉,重启,此时root没有密码了;
  3. 救援模式下chroot /mnt/sysimage,然后直接passwd root修改密码,然后手动关机即可。

15 shell 中多行注释

Shell中默认是只能用#号单行注释,没有自带的多行注释符号,若是想多行注释就需要用些技巧了,下边给一种方法(有许多种)。

使用冒号配合追加输入重定向

其实冒号在Bash里也是一个命令,表示啥都不做,<<是输入重定向,两个EOF(可用其它特殊成对字符替代)之间的内容通过<<追加给冒号(:),但是冒号对它们啥都不做,就相当于没做任何处理和输出,就相当于注释了,和cat命令追加多行文本是一个原理。

[root@linux-node1 ~]# cat test.sh 
#!/bin/bash
:<<EOF
echo "This will not be output."
echo "This will not be output."
echo "This will not be output."
EOF
echo "This will be output."
echo "This is a test."
[root@linux-node1 ~]# bash test.sh
This will be output.
This is a test.

16 shell 2>&1 解释

  • shell的标准输入默认的是键盘,也可以是文件或者管道|
  • 标准输出默认是终端同样也可以是文件或者管道
  • 标准错误默认也是终端,可以试文件等
  • 标准的输入、输出、和错误输出分别表示STDIN STDOUT STDERR也可以用数字表示0 1 2

2>&1

  • 2>代表的是标准输出的重定向
  • & 是等同于的意思
  • 2>&1意思是标准错误输出等同于标准输出,故也就是标准输出和标准错误输出都输出至某一个文件。

——未完待续——

猜你喜欢

转载自blog.csdn.net/Mr_rsq/article/details/81052048