Linux基础
Linux系统安装
Linux基础知识
1. 系统的启动顺序
进入系统
1.bois------hard disk--------硬盘MBR(第一个扇区512字节 0磁道0扇区)
2.512字节 446字节引导程序 64字节分区表 2字节 magic number
[root@localhost ~]# dd if=/dev/sda of=MBR bs=512 count=1
stage1------stage1.5------stage2
3.读取grub配置文件grub.conf,找到系统内核和启动文件
手动引导操作系统
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/sda2
initrd /initramfs-2.6.32-358.el6.x86_64.img
boot
修复引导程序
破坏引导程序[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=446 count=1
进入光盘修复模式
grub
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
reboot
grub加密
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
$1$9pAZW$20S3QIC8GXROmsdwy0POh.
[root@localhost ~]# vim /boot/grub/grub.conf
password --md5 $1$9pAZW$20S3QIC8GXROmsdwy0POh.
4.将内核,启动文件加载内存并释放,由内核启动第一个进程init
5.启动init进程,读取init的配置文件
/etc/inittab 设置系统的默认启动级别
/etc/init/rcS.conf----/etc/rc.d/rc.sysinit 初始化系统文件
/etc/init/rc.conf 运行对应运行级别的服务器脚本(脚本位置/etc/rc.d/init.d/)
/etc/init/control-alt-delete.conf 声明ctrl+alt+delete键作用
/etc/init/tty.conf 定义tty
6.进入系统前最后一个执行脚本rc.local
7.login登录
8.加载图形资源
9.login登录
10.加载环境变量
2. 常见的目录
Windows:以多根的方式组织文件 C:\ D:\ E:\
Linux:以单根的方式组织文件 \
/ 目录结构:FHS(Filesystem Hierarchy Standard)
目录名 | 作用 |
---|---|
/bin | 存放二进制可执行文件,常用的命令一般都在这里 |
/etc | 存放系统管理和配置文件 |
/home | 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 |
/usr | 用于存放系统应用程序,比较重要的目录 /usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。/usr/x11r6 存放x window的目录,/usr/bin 众多的应用程序,/usr/sbin 超级用户的一些管理程序,/usr/doc linux文档,/usr/include linux下开发和编译应用程序所需要的头文件,/usr/lib 常用的动态链接库和软件包的配置文件,/usr/man 帮助文档,/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里, /usr/local/bin 本地增加的命令,/usr/local/lib 本地增加的库 |
/opt | 额外安装的可选应用程序包所放的位置。一般情况下,我们可以把tomcat等都安装到这里 |
/proc | 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息 |
/root | 超级用户(系统管理员)的主目录 |
/sbin | 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等 |
/dev | 用于存放设备文件 |
/mnt | 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。 |
/boot | 存放用于系统引导时使用的各种文件 |
/lib | 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需要的共享文件 |
/tmp | 用于存放各种临时文件,是公用的临时文件存储点。 |
/var | 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等)等。 |
/lost+found | 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里 |
/media | 媒介目录(光盘,u盘) |
3. Linux文件属性
文件类型
在 Linux 中区分文件类型不能依靠扩展名,因为 Linux 并不像 Windows 一样会识别扩展名
# 方法一:ls -l
# 查看第一个字母
- # 普通文件(文本文件,二进制文件,压缩文件,电影,图片...)
d # 目录(一般显示为蓝色)
b # 设备文件(块设备),例如存储设备硬盘,U盘,/dev/sda
c # 设备文件(字符设备),例如打印机,终端 /dev/tty1,/dev/zero
s # 套接字文件
p # 管道文件
l # 链接文件(一般显示为淡蓝色,类似于Windows中的快捷方式)
# 方法二:file命令
[yang@tianyun ~]$ file /etc/hosts
/etc/hosts: ASCII `text`
[yang@tianyun ~]$ file /bin/ls
/bin/ls: ELF 64-bit LSB `executable`, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped
[yang@tianyun ~]$ file /dev/sda
/dev/sda: `block special`
[yang@tianyun ~]$ file /dev/tty1
/dev/tty1: `character special`
[yang@tianyun ~]$ file /etc/grub2.cfg
/etc/grub2.cfg: broken `symbolic link` to `../boot/grub2/grub.cfg'
[yang@tianyun ~]$ file /home
/home: `directory`
[yang@tianyun ~]$ file /run/dmeventd-client
/run/dmeventd-client: `fifo` (named `pipe`)
普通文件和设备文件
ll /dev/null /dev/sda1 /etc/hosts
crw-rw-rw- 1 root root 1, 3 8月 1 06:36 /dev/null
# c:字符设备(无缓存) 1, 为主设备号 3为从设备号
brw-rw---- 1 root disk 8, 1 8月 1 06:36 /dev/sda1
# b:块设备 (块设备中有缓存,可暂时理解为硬盘) 8, 为主设备号 1为从设备号
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hos
文件时间
# 使用 ls -l 查看到的时间只是文件的修改时间
# Linux中文件的时间分为四类,可以使用 stat 文件名 查看
atime # 访问时间(Access),查看文件会改变该时间
mtime # 修改时间(Modify),修改文件内容会改变该时间
ctime # 改变时间(Change),修改文件属性(如权限)会改变该时间
dtime # 删除时间,文件被删除的时间
# 红帽6以后 atime 的修改必须满足以下其中一个条件:
# 1. 自上次atime修改后,已达到86400秒 (一天);
# 2. 发生写操作时;
# (即仅仅读操作时一天之内不会改变,减轻磁盘的负担)
文件权限
详看权限设置章节
4. 管道符、通配符、重定向
管道
管道符
# 管道符号 |
# 可以将多个命令联合起来使用,命令1(管道符右边)的正确输出会作为命令2(管道符左边)的操作对象
# 管道符左右并无严格规定要求有 空格
# 命令1|命令2
# 栗子,查看一个文件,并过滤关键字
cat log.log | grep ok
命名管道和匿名管道
匿名管道,无需给管道起名字,只能用在子进程与父进程之间的通信,因为他们共享资源
命名管道,需要给管道一个名字,用在不同进程之间的通信
通配符
通配符
? 匹配一个任意字符
* 匹配0个或者任意字符,也就是可以匹配任意内容
[] 匹配括号中任意一个字符
[-] 匹配括号中任意一个字符,-代表范围,例如[1-9]
[^] 匹配不是中括号中的一个字符
其他符号
'' 单引号,在单引号中所有的特殊符号,例如 $ 和 ` 都没有特殊含义
"" 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` \例外,拥有调用变量值,引用命令和转义的含义
`` 反引号,括起来的是系统命令,即可以执行系统命令
$() 同反引号
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值
\ 反转义符号,取消取消特殊符号的效果
单引号的神奇现象:
当使用双数的单引号括住变量时,变量是可以被正确解析的
重定向
# 将命令的输出结果重定向到指定的文件里或垃圾桶(/dev/null)里
> 覆盖重定向
>> 追加重定向
1> 正确重定向,将命令的正确输出重定向
2> 错误重定向,将命令的错误输出重定向
&> 所有的重定向,将命令的正确输出与错误输出一起重定向,也可以使用: >xxx 2>&1
5. Linux命令
命令提示符
[root@xiaoming ~]#
- root 当前登录的用户
- xiaoming 主机名
- ~ 表示当前工作目录,~代表当前用户的家目录(root用户就是 /root 其他用户就是 /home/xxx)
- # 提示符 超级用户是 # ,普通用户是$
花里胡哨的提示字符 PS1
命令提示符是可以更换的,可以显示更多的内容,更加实用,想要修改这个就需要涉及到一个环境变量
ps1
默认的PS1值为 [\u@\h \W]$ 显示出来的效果如上所示,其中以
\
开头后面跟字符的叫做提示字符,不同的提示字符有不同的含义,除了提示字符外,还可以进行颜色的设置。可用的提示字符及其他们的含义:
• \d :可显示出“星期 月 日”的日期格式,如:“Mon Feb 2”• \H :完整的主机名称。如
www.sharkyun.com
• \h :仅取主机名称在第一个小数点之前的名字,
www
• \t :显示时间,为 24 小时格式的“HH:MM:SS”
• \T :显示时间,为 12 小时格式的“HH:MM:SS”
• \A :显示时间,为 24 小时格式的“HH:MM”
• @ :显示时间,为 12 小时格式的“am/pm”样式
• \u :目前使用者的帐号名称,如“dmtsai”;
• \v :BASH 的版本信息
• \w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;
• \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
• # :下达的第几个指令。
• $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $
颜色设置有固定的格式
\[\e[F;Bm\]
,其中F为字体颜色编号,B为背景色编号,可选择其中一个即可,背景色没有搞明白,不重要,不推荐使用取消设置的颜色
\[\e[m\]
,固定格式需要注意的是,在你最后一次设置完颜色后一定要取消颜色的设置,否则你后续输入的命令也会是你最后一次设置的颜色
颜色编号对应关系:
字体颜色 背景颜色 对应颜色 30 40 黑色 31 41 红色 32 42 绿色 33 43 黄色 34 44 蓝色 35 45 紫红色 36 46 青蓝色 37 47 白色
还可以设置字体格式,使用 ;
分割,可以跟多个,每个必须同颜色一样必须要有取消(设置0)否则后面的格式就会套用到后面的
代码 | 意义 |
---|---|
0 | OFF |
1 | 高亮显示 |
4 | underline下划线 |
7 | 反白显示 |
8 | 不可见 |
设置PS1 的小栗子
栗子1:普通情况下比较好用的设置
# 注意最后的\$前面必须再多跟一个\ 这样才能生效 PS1="\[\e[31m\][\[\e[36m\]\t \[\e[37m\]\u@\h \[\e[35m\]\W \[\e[32m\]\#\[\e[31m\]]\[\e[m\]\\$ "
栗子2:带格式的
# 设置格式如下,不管是格式、字体颜色还是背景色,都是通过;来分割,不区分前后 PS1="\[\e[31m\][\[\e[7;36m\]\t \[\e[0;4;1;37m\]\u@\h \[\e[0;1;35m\]\W \[\e[32m\]\#\[\e[31m\]]\[\e[m\]\\$ "
栗子3:如果你有git,可以试试这个
# 可以显示git状态的 function parse_git_dirty { [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*" } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/git:\1$(parse_git_dirty)/" } export PS1="\[\e[36m\]○\[\e[33m\]\$(parse_git_branch)\[\e[m\] {\[\e[36m\]>\#< \[\e[34m\]\u@\h \e[33m\]\[\e[m\]}\n \[\e[31m\]\w○\$ →\[\e[m\]"
命令格式
- 命令 [选项] [参数]
- 命令:整条shell命令的主体
- 选项:会影响并微调命令的行为,通常以 - 和 – 开头
- 参数:命令作用的对象
- 当有多个选项时,可以写在一起
- 一般参数有简化和完整两种写法
-a
和--all
等效
命令生效的顺序(从上到下)
- 绝对路径或相对路径
- 别名
- bash内部命令
- 按照$PATH环境变量定义的目录查找顺序找到的第一个命令
多命令顺序执行
; 分号,没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都会一条一条执行下去。
|| 逻辑或,当用此连接符连接多个命令时,前面的命令执行成![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1602e9ae8784432eb44d9818d1bb497a.png#pic_center)
功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行。
&& 逻辑与,当用此连接符连接多个命令时,前面的命令执行成功,才会执行后面的命令,前面的命令执行失败,后面的命令不会执行,与||正好相反。
| 管道符,当用此连接符连接多个命令时,前面命令执行的正确输出,会交给后面的命令继续处理。如果前面的命令执行失败,则会报错,若后面的命令无法处理前面命令的输出,也会报错
6. 用户及用户组
相关配置文件
/etc/group
# 存储当前系统中所有用户组信息
root:x:0:
# 组名称:组密码占位符:组编号:组中用户列表
# root组编号为0,1-499 为系统预留的编号,预留给安装的软件和服务,所以用户手动创建的用户组从500开始,但一般来说,普通用户是从1000开始的
# 组密码占位符都是x
/etc/gshadow
#存放当前系统中用户组的密码信息,和group中的记录一一对应
root:::
# 组名称:组密码:组管理者:组中用户名
/etc/passwd
#存放当前系统中所有用户的信息
root:x:0:0:root:/root:/bin/bash
# 用户名:密码占位符:用户编号:用户属组编号:用户家目录:shell类型
/etc/shadow
#存放当前系统中用户的密码信息
# 加密算法$id:
$1: MD5
$5: SHA-256
$6: SHA-512
禁止root远程登陆
vim /etc/ssh/sshd_config
# 找到 PermitRootLogin 参数,将其注释取消,并将值改为 no,保存退出后重启sshd服务
进入单用户模式修复系统
# 在内核选择页面,先选中在使用的内核,然后按 e 进入内核配置界面
# 找到 末尾为 UTF-8 的那行,在最后加上 rd.break tty=console
# ctrl + x
# 即可进入单用户模式,进入后需要重新挂在根目录, mount -o remount,rw /sysroot
# 切换根目录 chroot /sysroot
# 然后想干嘛干嘛
# 修改密码,进入单用户模式后直接修改即可,不过要注意,如果 selinux 没有关闭的话需要在修改完密码后再加一步
touch /.autorelabel
普通用户提权
普通用户可使用的命令极少,也没有更改一些配置的权限,但有时我们却不得不使用普通用户来进行一些操作,这时候就需要为我们使用的普通用户进行提权
# 需要修改的配置文件为 /etc/sudoers
踢出登录的用户
设置用户密码有效期
# 修改账号和密码的有效期限
chage 用户名
# 可用参数
-m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M 密码保持有效的最大天数
-w 用户密码到期前,提前收到警告信息的天数
-E 账号到期的日期。过了这天,此账号将不可用
-d 上一次更改的日期
-i 停滞时期。如果一个密码已过期这些天,那么账号将不可用
-l 列出当前的设置。由非特权用户来确定他们的密码或账号何时过期
# 栗子
chage -l root
Last password change : Jul 09, 2022
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
chage -M 60 root
chage -l root
Last password change : Jul 09, 2022
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
chage -l 5 root
chage -l root
Last password change : Jul 09, 2022
Password expires : Jul 14, 2022
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
新用户创建的模板
# 在添加一个用户时,会依照 /etc/login.defs 文件中的相关项来设置用户的各个属性,具体参考下表
# 该文件修改后立即生效,但是不会影响已有的用户,只会影响新建用户
设置项 | 含义 |
---|---|
MAIL_DIR /var/spool/mail | 创建用户时,系统会在指定的目录 中创建一个用户邮箱 |
PASS_MAX_DAYS 99999 | 密码有效期,99999是自 1970 年1月1日起密码有效天数,相当于273年,可以理解为密码始终有效 |
PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认为0 |
PASS_MIN_LEN 5 | 指定密码的最小长度,默认不小于5位,但是现在用户登录时验证已被 PAM 模块取代,所以这个选项并不生效 |
PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通知用户密码即将到期,默认为7天 |
UID_MIN 500 | 指定最小 UID 为500,也就是说,添加用户时,默认 UID 从500开始。注意,如果手工指定了一个用户的 UID 是550,那么下一个创建的用户的 UID 就会从551开始,哪怕 500-549 之间的 UID 没有使用 |
UID_MAX 60000 | 指定用户最大的 UID 为60000 |
GID_MIN 500 | 指定最小 GID 为500,也就是在添加组时,组的 GID 从500 开始。 |
GID_MAX 60000 | 用户 GID 最大为 60000 |
CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes表示创建,no则不创建,默认是yes |
UMASK 077 | 用户主目录的权限默认设置为077 |
USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准确的说,这里指的是删除用户的初始组,此项的默认值为yes |
ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的Linux只能用 DES 或 MD5 加密 |
# 新建用户的默认shell
vim /etc/default/useradd
SHELL=/sbin/nologin
# /etc/default/useradd
# 同样也是新建用户时的默认配置文件
# useradd defaults file
GROUP=100 #当login.defs中的USERGROUPS_ENAB为no时,使用此选项,新建用户的组的GID为100
HOME=/home #普通用户家目录的位置
INACTIVE=-1 #是否启用账户过期停权,-1为不启用
EXPIRE= #用户的过期时间,不设置表示未启用
SHELL=/bin/bash #新建用户默认的shell类型
SKEL=/etc/skel #用户家目录的模板
CREATE_MAIL_SPOOL=yes #创建用户时,是否创建mail文件
7. 权限设置
针对于某个文件或者目录,限定某个用户或者用户组对于该文件或目录的权限
基础权限(ugo)
# 什么是 ugo 权限???
# ugo 是一个文件最基础的权限,它限定了三种用户对于一个文件或目录的权限。
# 三种用户分为:u表示属主(文件是谁的),g表示属组(文件所有人在的用户组),o表示其他人(不属于前两类的所有人)
# 对于每一种用户权限都分为三类:r 表示读取权限,w 表示写入权限,x 表示执行权限
--------------------------------------- 注意啦 -------------------------------------------------------
# 针对文件来说(r 能看到里面的内容,w 可以编辑、修改内容,x 可以执行(像命令一样被使用))
# 针对目录来说(r 能看到里面的文件名,x 可以进去目录,w可以修改里面的内容、创建、删除文件),x是目录的基本权限,目录要先能 x 执行,才能 w 写
--------------------------------------- 很重要 -------------------------------------------------------
# 目录有w权限便可删除其中的文件,与所删除的文件自身无关
# 注:存在 A/B/d,现在对A有w权限、对B没有w权限,想直接删除B,操作不成功,原因是B中有d;若有A/C,C中没有子文件,则C可以被删除。
# 注意事项:
# 文件: x 权限小心给予
# 目录: w 权限小心给予
# 权限示例
# 查看用户的 ugo 权限,使用 ls -l (ll)即可查看
ll 1.txt
-rw-r--r--. 1 root root 0 Aug 25 17:44 1.txt
# 这个输出的结构为:文件类型 权限 ? 属主 属组 ? 更改时间 文件名
# -rw-r--r--. 这个就是文件的权限及文件的类型,总共分为五部分,第一个字符代表文件的类型(详细请参考文件类型),后面的三个为一组共三组(第一组为属主权限,第二组为属组权限,第三组为其他用户权限),最后一个字符标识是否具有 ACL 权限(.为没有,+为具有acl权限,acl 权限相关请查看下面那个)
# 故 -rw-r--r--. 解释为,这是一个普通类型的文件,属主具有读写权限,属组具有读权限,其他人具有读权限,没有设置acl 权限
# 每组权限固定为 rwx,三个字符位置不变,如没有该权限,则用 - 表示
# 权限更改
# 更改权限使用 chmod 来进行
# 具体使用方法查看 chmod 命令的使用
# 注:
# 1.目录的默认最大权限777,文件的默认最大权限666; 文件一般不给 x 执行权限 。
# 2.系统
# 例如:掩码是022(掩码即要去除的权限) 则创建出目录的权限755,创建出文件的权限644;
# 掩码是235(掩码即要去除的权限) 则创建出目录的最大权限542,创建出文件的最大权限442。)
更改权限可查看
chmod
的使用方法
基础权限(ACL)
UGO 只能针对属主,属组和其他人三类设置权限,但日常生活中,我们可能会遇到需要给一些特殊的用户一些特殊的权限,例如,一个账本文件,属主是会计拥有rwx权限,属组是会计组拥有rwx权限,其他人没有任何权限。这时总裁想查看账本却没有权限,你总不能让总裁加入会计组或者变成会计吧。ACL权限就是来解决这个问题的,它可以给特定的用户和用户组一些区别于属主、属组、其他人的权限。
只有文件所在的分区支持 ACL 权限,用户才可以使用 ACL
啥是 acl 权限
# 查看分区是否开启 ACL 权限
dumpe2fs -h 分区
# 该命令是查询指定分区详细文件系统信息的命令
# 分区可使用 df -h 查看 对应的 filesystem 值就是
# 虚拟机执行会出错,具体是否可用 acl 权限需询问虚拟机发放者
咋查看有没有捏
# 如果说使用 ll 命令查看时,发现文件权限最后是个 + 就表示他有设定 ACL 权限
[root@tianyun ~]# ll /dir10/file1
-rwxrwxrwx+ 1 root root 0 3月 11 18:37 /dir10/file1
# 查看 acl 权限
getfacl 文件或目录
# 会同时查出 ugo 权限,如果未设置 ACL 权限则会只显示 ugo 权限
# 栗子
getfacl 1.txt
# file:1.txt
# owner:root
# group:root
user::rwx
group::r--
other::r--
咋设置捏
# 设置 acl 权限
setfacl [选项] 文件或目录
# 可用参数
-m 设置 acl 权限
u:用户名:权限模式
g:用户组:权限模式
# 示例
setfacl -m u:song:rwx 1.txt
setfacl -m g:songgroup:6 1.txt
# 更多用法查看 setfacl 的用法
ACL的高级特性
mask
# mask
# 用于临时降低用户或组(除属主和其他人)的权限,mask决定了他们的最高权限
# 建议:为了方便管理文件权限,其他人的权限置为空
--------------------------- 在不设置 mask 权限时 ------------------------------------------
[root@localhost ~]# touch /home/a
-rw-rwxr--+ 1 root root 0 Jun 10 17:06 /home/a
[root@localhost ~]# setfacl -m g:root:rw /home/a
[root@localhost ~]# getfacl /home/a
getfacl: Removing leading '/' from absolute path names
# file: home/a
# owner: root
# group: root
user::rw-
group::r--
group:root:rw-
mask::rw-
other::r--
# 此时mask权限跟随除所有者root以外的最大权限属组root组,为rw-
[root@localhost ~]# setfacl -m u:zz:rwx /home/a
[root@localhost ~]# getfacl /home/a
getfacl: Removing leading '/' from absolute path names
# file: home/a
# owner: root
# group: root
user::rw-
user:zz:rwx
group::r--
group:root:r--
mask::rwx
other::r--
# 此时mask权限跟随除所有者root以外的最大权限的zz用户的权限,为rwx
------------------------------ 结论 ----------------------------------------------------------
# 注:不修改mask权限时,mask权限跟随除所有者以外的,属组和其他人的最高权限
------------------------------ 当设置了 mask 权限时 -------------------------------------------
# 但是mask为掩码当设置了mask权限之后,属组和其他人的最高权限会被限制为mask权限
[root@localhost ~]# setfacl -m mask::- /home/a
[root@localhost ~]# getfacl /home/a
getfacl: Removing leading '/' from absolute path names
# file: home/a
# owner: root
# group: root
user::rw-
user:zz:rwx #effective:---
group::r--
group:root:rw- #effective:---
mask::r--
other::r--
# 注:#effective:--- 表示:有效权限为---
---------------------------------------- 结论 ---------------------------------------------
# 验证发现:用户zz和属组root对于文件/home/a的权限并不是---,而是r--,因为此时他们变成了其他人other
[root@localhost ~]# chmod o=- /home/a
或
[root@tianyun ~]# setfacl -m o::- /home/file100.txt
[root@localhost ~]# getfacl /home/a
getfacl: Removing leading '/' from absolute path names
# file: home/a
# owner: root
# group: root
user::rw-
user:zz:rwx #effective:---
group::r--
group:root:rw- #effective:---
mask::r--
other::---
# 再次验证发现此时用户zz和属组root对于文件/home/a的权限已经变成---
# 总结:因此mask权限影响的是紫色部分用户(掐头去尾:除去所有者user和其他人other以外的所有用户)
# mask决定了除去所有者user和其他人other以外用户的最高权限。因此为了方便管理文件权限,建议将其他人other的权限设置成---(空)
# mask用于临时降低用户权限
再次:
[root@localhost ~]# setfacl -m u:zz:rwx /home/a
[root@localhost ~]# getfacl /home/a
getfacl: Removing leading '/' from absolute path names
# file: home/a
# owner: root
# group: root
user::rw-
user:zz:rwx
group::r--
group:root:r--
mask::rwx
other::r--
# 总结:此时,mask权限再次变成mask::rwx,对用户在此设置权限时,mask权限会失效。
# 因此mask用于临时降低用户权限
default
# default
# 继承
mkdir /A
mkdir /A/B
ll /A 得出:-rwx r-x r-x
sefacl -m d:u:zz:rwx /A
su zz
cd /A/B
touch b 提示权限不足
# 注:以上操作是先创建的文件B,后设置的继承权限,提示权限不足,继承只针对于设置了继承权限之后,创建出的文件的权限有效
mkdir /A
ll /A 得出:-rwx r-x r-x
sefacl -m d:u:zz:rwx /A
mkdir /A/B
su zz
cd /A/B
touch b 创建成功
# 注:以上操作是先设置的继承权限,后设置的继承权限,创建成功,设置过继承权限之后,再创建出的文件会继承其相应权限
# 继承权限命令之前创建出的文件,不会有所设置的权限,现在想要让其拥有权限,不要加 d:。
# 想现在拥有权限,不要加 d;想以后创建出的有权限与要加 d。
高级权限
权限其实是四位,在777前面还有一位,表示高级权限,默认为0777
各高级权限的八进制数:
- suid 4
- sgid 2
- sticky 1
t 权限和 sgid 只能作用于目录,suid 只作用与文件,因此7777权限没有实际意义
当添加高级权限后,执行
getfacl
可以看到多一个 flags ,后面对应的就是高级权限的拥有情况
suid
作用:任何用户在执行拥有 suid 的二进制可执行文件(命令)时,都以该文件拥有者的身份执行
chmod u+s 命令
sgid
作用:任何用户在拥有 sgid 的目录下创建文件时,创建的文件都会继承目录的属组
chmod g+s 目录
stickybit(sbit)
作用:任何用户在拥有 t 权限的目录下创建的文件,都属于创建者本人,其他人无权删除。 即当一个目录被设置粘滞位时,则该目录下的文件只能由超级管理员删除 ,该目录的所有者删除 ,该文件的所有者删除。
又名:粘滞位
如果其他人无x(可执行)权限时,设置粘滞位后,最后一位出现的是大写的**‘T’**,它代表的就是“空的”。
chmod o+t 目录
特殊权限
除去以上的三种权限以外,还有一个特殊的权限,这个权限针对所有用户,包括root
# 查看特殊权限
lsattr 文件名
i
i 权限是特殊权限中的一种,当文件有此权限时,该文件不能删除、剪切、修改、重命名、修改权限,只能查看和cp。当目录具有此权限时,该目录(包括该目录下的),不可以删除、创建、剪切、重命名,但是可以修改文件内容、权限,属主、属组
简洁的说,具有 i 权限的无法修改
chattr +i 文件名
a
a 权限时特殊权限中的另一种,当文件具有此权限时,该文件不可以修改、剪切、删除、重命名、修改权限,只能查看、cp和追加内容。当目录具有此权限时,该目录(包括该目录下的),不可以删除、剪切、重命名,但是可以修改文件内容、权限,属主、属组,创建文件
简洁的说,具有 a 权限的只能追加
chattr +a 文件
进程掩码
简介
在Linux系统中,我们创建一个新的文件或者目录时,这些新的文件或目录都有默认的访问权限,umask 命令和为文件与目录的默认访问权限有关。用户创建文件的默认权限为 -rw-rw-rw- ,创建目录的默认权限为 drwxrwxrwx ,而umask值 表明了需要从默认权限中去掉那些权限来成为最终的默认权限值。
查看
# 查看 umask 值的命令
umask
# 使用符号的形式显示结果
umask -S
# 输出解释
0002
# 第一个 0 与高级权限有关,后面三位与普通权限有关
# 第二个 0 与属主权限有关,表示从属主权限减 0 ,也就是权限不变,所以文件的创建者默认权限为 rw
# 第三个 0 与属组权限有关,其他同上
# 第三个 0 与其他用户权限有关,表示从其他人权限减 2(w) ,也就是去掉写(w)权限,所以其他人的权限为 r
更改
# 临时修改
umask 值
# 栗子,将umask 改为222
umask 222
8. 进程
什么是进程?
进程是已启动的可执行程序的运行实例,进程由以下组成部分:
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
运行时间短的进程有:ls cd cp passwd mkdir 等
守护进程:sshd httpd vsftpd
程序和进程?
程序:二进制文件,是静态的,例如:/bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/nginx
进程:是程序运行的过程,是动态的,有生命周期及运行状态
进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
各个版本 Centos 的第一个进程
Centos5/6: init
Centos7: systemd
注:子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
进程状态
在多任务处理操作系统中,每个CPU(或核心:CPU可能有多核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。
中文版
STAT 进程状态 | 解释 |
---|---|
R | 运行状态 |
S | 可中断睡眠 Sleep |
D | 不可中断睡眠(usually IO) |
T | 停止的进程 |
Z | 僵尸进程 |
X | 死掉的进程 |
Ss | S进程的领导者,父进程 |
S< | <优先级较高的进程 |
SN | N优先级较低的进程 |
R+ | +表示是前台的进程组 |
SI | I表示以多线程的方式运行 |
一图流解释进程
进程控制信号
中文解释
数字 | 信号 | 含义 |
---|---|---|
1 | HUP | 重新加载配置,PID不变 |
2 | INT | 键盘中断,相当于 ctrl + c |
3 | QUIT | 键盘退出 |
9 | KILL | 强制终止 |
15 | TERM | 终止(正常结束),缺省信号 |
18 | CONT | 继续 |
19 | STOP | 停止 |
20 | TSTP | 暂停 |
进程优先级
Linux进程调度及多任务
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的印象。
相对优先级NICE
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略为 SCHED_OTHER (也称为SCHED_NORMAL),但还有其它一些调度策略用于不同的目的。
SCHED_OTHER 调度策略运行的进程的相对优先级称为进程的 nice 值,可以有40种不同级别的nice值。
( 普通(屌丝)调度策略:nice值 -20是优先级最高的(最牛的屌丝),19优先级最低(最差的屌丝) )
注:
nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。
(nice值在 top [PR] 中对应数字:nice -20 对应 PR 0;nice 19 对应 PR 39 。)
查看进程的NICE级别
# 1. 使用top查看nice级别
NI: 实际nice级别
PR: 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
# 2. 使用ps查看进程的当前nice值
[root@tianyun ~]# ps axo pid,command,nice --sort=-nice
[root@tianyun ~]# ps axo pid,command,nice,cls --sort=-nice
TS 表示该进程使用的调度策略为SCHED_OTHER
启动和更改nice级别
# 注意:启动进程时,通常会继承父进程的 nice级别,默认为0。
[root@tianyun ~]# sleep 5000 & (不设置进程的nice值时,进程会继承其父进程bash的nice值)
[root@tianyun ~]# nice -n -5 sleep 6000 & (设置进程的nice值为-5)
[root@tianyun ~]# ps axo command,pid,nice |grep sleep
[root@tianyun ~]# nice -n -20 systemctl start httpd (设置进程的nice值为-20)
[root@tianyun ~]# ps axo pid,command,nice,cls |grep httpd
11116 /usr/sbin/httpd -20 TS
11119 /usr/sbin/httpd -20 TS
11120 /usr/sbin/httpd -20 TS
11121 /usr/sbin/httpd -20 TS (TS表示进程策略为(普通)调度策略)
11122 /usr/sbin/httpd -20 TS
11123 /usr/sbin/httpd -20 TS
11124 /usr/sbin/httpd -20 TS
11125 /usr/sbin/httpd -20 TS
11126 /usr/sbin/httpd -20 TS
更改现有进程的nice级别
1. 使用top更改nice级别
r 调整进程的 优先级(Nice Level) (-20高) ---0--- (19低)
2. 使用shell更改nice级别
[root@tianyun ~]# sleep 7000 &
[3] 10089
[root@tianyun ~]# renice -20 10089
10089: old priority 0, new priority -20
9. 软链接与硬链接
要说清楚软连接(symbolic link)和硬链接(hard link)的区别,首先我们需要了解 Linux 的一个重要概念,inode(i 节点)。
在 Linux 系统中,任何一个独立的(注意:这里强调是独立的文件)文件,都会为其分配一个 inode ,它们是对应的,当我们查看文件时,是通过 inode 找到对应文件的实际存储内容。
过程1
# 手动观察发现
touch 1.txt # 创建一个新文件
ln 1.txt 2.txt_hd # 创建一个硬链接
ln -s 1.txt 3.txt_soft # 创建一个软连接
# 观察
ll -i
27099 -rw-r--r-- 2 root root 0 Sep 5 09:33 1.txt
27099 -rw-r--r-- 2 root root 0 Sep 5 09:33 2.txt_hd
37884 -rw-r--r-- 2 root root 5 Sep 5 09:33 3.txt_soft
# 观察后发现,硬链接(2.txt_hd)与源文件(1.txt)的 inode (结果第一列)一样。而软连接(3.txt_soft)则拥有一个独立的 inode 节点。每一个 inode 节点对应一个实际的文件,所以可以发现,硬链接与源文件是同一个文件,而软连接则是建立了新的文件。
结论1
- 硬链接的本质就是一条文件名与 inode 的关联记录而已
过程2
# 继续观察可以发现,硬链接(2.txt_hd)与源文件(1.txt)的大小都是一样的(0),但软连接却是 5 ?
# 因为硬链接关联着源文件,所以源文件多大,它就是多大。软连接的大小则是创建软链接时源文件的文件名,一个字符一个字节,所以是 5 个字节,所以软连接的大小是 5,不信?我们可以向源文件中添加点内容
echo "test12345678" > 1.txt
cat 1.txt
test12345678
cat 2.txt_hd
test12345678
cat 3.txt_soft
test12345678
ll -i
27099 -rw-r--r-- 2 root root 13 Sep 5 09:33 1.txt
27099 -rw-r--r-- 2 root root 13 Sep 5 09:33 2.txt_hd
37884 -rw-r--r-- 2 root root 5 Sep 5 09:33 3.txt_soft
ln -s /tmp/1.txt 4.txt_soft # 创建一个软连接
ll -i
27099 -rw-r--r-- 2 root root 13 Sep 5 09:33 1.txt
27099 -rw-r--r-- 2 root root 13 Sep 5 09:33 2.txt_hd
37884 -rw-r--r-- 2 root root 5 Sep 5 09:33 3.txt_soft
49854 -rw-r--r-- 2 root root 10 Sep 5 09:33 4.txt_soft
# 源文件和硬链接的大小都改变了(13),而软连接依旧不变(5),新的软链接(4.txt_soft)大小变成了 10 ,也应证了我们的结论
# 当我们删除源文件后,会发生什么
rm -rf 1.txt
ls
2.txt_hd 3.txt_soft#(在系统里我们会看到这个文件底色变红,且一直在闪烁)
cat 2.txt_hd
test12345678
cat 3.txt_soft
cat: 3.txt_soft: No such file or directory
# 我们可以发现,当删除源文件(1.txt)后,硬链接(2.txt_hd)依旧可以显示文件内容,而软连接则会提示文件不存在
# 这是因为软连接是建立了一个新的独立的文件,它指向源文件,因为源文件没了,所以它不能正常指向了,而硬链接则是一条文件名与 inode 的对应记录,所以在删除源文件时,系统会将链接数减一,当链接数为0的时候,inode就会被系统回收,文件的内容才会被删除.
ll -i
27099 -rw-r--r-- 1 root root 13 Sep 5 09:33 2.txt_hd
37884 -rw-r--r-- 2 root root 5 Sep 5 09:33 3.txt_soft
# 第三列就是文件的链接数
总结
- 硬链接的本质就是一条文件名与 inode 的关联记录而已。软连接则是创建一个新独立的文件。
- 硬链接文件的大小与源文件的大小相同,而软连接的大小则与源文件指定的路径所包含的字符总数相同(源文件的文件名每有一个字符,则增加1个字节的大小)。
- 源文件删除后,软连接不可用,硬链接依旧可用
- 在删除源文件时,系统会将链接数减一,当链接数为0的时候,inode就会被系统回收,文件的内容才会被删除。
- 目录不能创建硬链接
- 软连接可以跨文件系统,硬链接不能
- 硬链接不占用实际空间
10. 环境变量
这种变量是会影响bash环境操作的,会在真正进入系统前由一个bash程序读入到系统中。通常都环境变量的名字以大写字符命名。
1.常见的环境变量
-
PATH
系统命令存放目录 -
HOME
当前用户的家目录 -
MAIL
-
SHELL
-
PWD
当前所在目录 -
USER
当前用户 -
UID
当前用户的uid -
ID
当前用户的组id -
RANDOM
随机数 -
PS1
提示字符
2.列出shell环境下的所有环境变量及其内容
env
是 environment (环境) 的简写,所有的环境变量(包含自定义的环境表里)set
列出系统中所有的变量,包括自定义的变量
3.一些比较重要的环境变量
1.bash 的环境变量文件
在使用 Linux 时,我们系统一进入 bash 就会有一大堆的环境变量可用,这些环境变量是在我们登录后,系统自动读取相关配置文件加载的。
那么就离不开下面这两个概念
# login shell
取得 bash 时需要完整的登录流程的,例如我们在 ssh 登录一台服务器时,需要输入账户和密码或进行验证,此时取得的 bash 就称为 login shell。(注意,即使做了免密,不需要输入密码,获取的 bash 也是 login shell )
# non-login shell
取得 bash 接口的方法不需要重复登录的举动,比如在登录了 Linux 后(桌面版),再启动终端 Terminal,此时终端接口并没有需要再次输入账号和密码,这个 bash 的环境就称为 non-login shell。又或者你在原本的 bash 环境下再次使用 bash 这个命令,建立了一个子 bash 进程,同样的也没有输入账号和密码,那第二个 bash (子程序)也是 non-login shell
为啥要先理解这两个概念呢,因为在这两种取得 bash 的情况中,所读取的配置文件并不一致。
login shell
# 一般来说 longin shell 会读取以下两个文件:
/etc/profile # 这是系统整体设定,最好不要修改
~/.bash_profile 或者 ~/.bash_login 或者 ~/.profile # 属于个人的配置文件,有需要修改的就写入这些文件中。注意,只会读取这三个文件中的一个(有谁读谁,没有就跳过),且查询顺序依照我写的顺序。
# /etc/profile 会主动依序调用以下脚本文件:
/etc/inputrc # 定义快捷键
/etc/profile.d/*sh # 定义bash操作接口颜色、语系、命令别名等
etc/locale.conf # 定义系统的默认语系
# bash 在读完 `/etc/profile` 后,会选择上面三个配置文件中选择一个读取,且在读取时,会调用 ~/.bashrc ,而 ~/.bashrc 会调用 /etc/bashrc,如下图所示
注意:一定要理清楚这个调用关系,当一个用户登录时,会先读取 /etc/profile ,然后读取 ~/.bash_profile ,而在 ~/.bash_profile 配置文件中调用了 ~/.bashrc ,在调用 ~/.bashrc 中又调用了 /etc/bashrc,当所有调用完成后, ~/.bash_profile 才会读取完毕退出。当我们想要覆盖一个环境变量原来的值时,只需要在 ~/.bash_profile 配置文件中调用 ~/.bashrc 之后添加,这样就可以覆盖原有配置。
non-login shell
# 当调用 no-longin shell 时,只会读取 ~/.bashrc 文件 而 ~/.bashrc 最后又会调用 /etc/bashrc
各个配置文件的作用
# /etc/bashrc
• 依据不同的UID定义出 `umask` 值
• 依据不同的UID定义出提示符(就是PS1变量)
• 呼叫 `/etc/profile.d/*.sh` 的设定
• /etc/man.config
这个文件最重要的就是定义了 MANPATH 这个变量,它定义了 man page 的路径;在以 tar 包的方式安装软件时有用
• ~/.bash_history
历史命令记录文件;记录的数量与HISTFILESIZE变量有关。在 /etc/profile 里
• ~/.bash_logout
记录了当我注销bash后,系统再帮我做完什么动作后才离开的。
2.PS1
可用的提示字符的含义
- \d :可显示出“星期 月 日”的日期格式,如:“Mon Feb 2”
- \H :完整的主机名称。如 www.sharkyun.com
- \h :仅取主机名称在第一个小数点之前的名字, www
- \t :显示时间,为 24 小时格式的“HH:MM:SS”
- \T :显示时间,为 12 小时格式的“HH:MM:SS”
- \A :显示时间,为 24 小时格式的“HH:MM”
- @ :显示时间,为 12 小时格式的“am/pm”样式
- \u :目前使用者的帐号名称,如“dmtsai”;
- \v :BASH 的版本信息
- \w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;
- \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
- # :下达的第几个指令。
- $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $
颜色表
前景 背景 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
代码 意义
0 OFF
1 高亮显示
4 underline
7 反白显示
8 不可见
设置PS1
设置颜色 [\e[F;Bm] 其中“F”为字体颜色,编号3037;“B”为背景色,编号4047
取消设置 [\e[m] 如果不取消 后面的所有内容都会是这个颜色
# 可以显示git状态的 function parse_git_dirty { [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*" } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/git:\1$(parse_git_dirty)/" } export PS1="\[\e[36m\]○\[\e[33m\]\$(parse_git_branch)\[\e[m\] {\[\e[36m\]>\#< \[\e[34m\]\u@\h \e[33m\]\[\e[m\]}\n \[\e[31m\]\w○\$ →\[\e[m\]"
11. raid 磁盘阵列
RAID(Redundant Array of lndependent Disks)独立磁盘冗余阵列,简称磁盘阵列(Disk Array)。RAID 是一种把多块独立的硬盘(物理硬盘)按照不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。
组成磁盘阵列的不同方式称为 RAID级别(RAID Levels),现在已拥有了从 RAID0 到 RAID6 七种基本的 RAID级别。另外还有一些基本 RAID级别 的组合形式,例如 RAID10(RAID0 与 RAID1 的组合)等等。
RAID 技术的两大特点:一是速度、二是安全
实现方式
RAID 实现方式分为两种,分别是 软件RAID、硬件RAID
软件RAID
优点:
- 成本低,无需购置硬件
- 允许用户重新配置磁盘阵列,不受硬件限制
缺点:
- 读写性能差
- 软件 RAID 会占用系统资源
硬件RAID
优点:
- 不消耗硬盘性能及存储空间,相对与操作系统独立
- 磁盘故障易更换
缺点:
- 相比较 软件RAID 成本高
- 硬件 RAID卡故障,必须更换相同型号或与故障卡相互兼容的型号
RAID 保护方式有两种:镜像与校验
- 镜像就是克隆出一个副本,数据相同
- 校验就是使用奇偶校验法逻辑算法为异或
标准RAID
最常用的是下面的几种 RAID 形式:RAID 0、RAID 1、RAID 5、RAID 10
RAID 0
RAID 0 技术把多块物理硬盘设备通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据一次写入到各个物理硬盘中。这样硬盘设备的读写性能会提升数倍,但是若一块硬盘发生故障将导致整个系统的数据都受到破坏。
**优点:**使用 n 颗硬盘,即可拥有将近 n 倍的读写性能,读写性能是所有 RAID 级别中最高的。
**缺点:**不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID 0 运行时只要其中任一块硬盘出现问题就会导致整个数据的故障。
RAID 0,分为两种,单盘0 和全盘0
- 单盘0,只需要一块盘,不支持容错,不支持冗余机制,常见于新服务器,只有一块盘,用来安装操作系统
- 全盘0,线性卷,最少需要两块磁盘,读写速率高,但是不支持容错,不提供冗余机制
RAID 1
RAID 1 是由两块硬盘所构成的 RAID 磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”
**优点:**安全性依照数组里的实体硬盘数量倍数成长。
**缺点:**空间利用率是所有 RAID 中最低的
raid1,空间利用率50%,一个数据在两块盘里写,只能两块盘做,允许坏1块盘,常用于系统盘,支持容错
RAID 5
RAID 5 技术把多块硬盘设备(最少三块)的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一块设备损坏后不至于出现致命缺陷。
RAID 5 不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成 RAID 5 的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当 RAID 5 的以恶磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去回复被损坏的数据。
**优点:**兼顾空间利用率和安全性
**缺点:**需要额外的运算资源,仅能忍受 1 个硬盘损毁。
raid5,利用率(n-1)/n,需要三块及以上,只允许坏一块盘(不论是几块盘做的)
RAID 6
RAID 6 的可靠性要高于 RAID 5
raid6,需要四块及以上,允许坏两块盘
RAID 10
RAID 10 技术是 RAID 1 + RAID 0 技术的一个组合体。如下图,RAID 10 技术需要至少四块盘来组件,其中分别两两制作成 RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设备的读写速度。这样子从理论上讲,只要坏的不是同一组中的所有硬盘,那么最多可损坏50% 的硬盘设备而不丢失数据。RAID 10 技术继承了 RAID 0 的高速读写和 RAID 1的数据安全。
总结
1.容错对比
RAID 级别 | RAID 0 | RAID 1 | RAID5 | RAID 6 | RAID 10 |
---|---|---|---|---|---|
冗余类型 | 无 | 镜像 | 奇偶校验 | 奇偶校验 | 镜像 |
保护能力 | 不允许设备故障 | 允许一个设备故障 | 运行一个设备故障 | 允许两个设备故障 | 允许一组设备中一个故障 |
写性能 | 高 | 低 | 低 | 低 | 中 |
最少磁盘数 | 1 | 2 | 3 | 4 | 4 |
磁盘利用率 | 100% | 50% | N-1/N | N-2/N | 50% |
2.性能比较
类型 | 读写性能 | 安全性 | 磁盘利用率 | 成本 | 应用 |
---|---|---|---|---|---|
RAID 0 | 最好(因并行而提高) | 最差(完全无安全保障) | 100 % | 最低 | 个人用户 |
RAID 1 | 读和单个磁盘无区别,写则要两边写 | 最高(提供数据的百分百备份) | 50 % | 最高 | 适用于存放重要数据,如服务器和数据库等 |
RAID 5 | 读:RAID 5 = RAID 0(相近似的读取速度) 写:RAID 5 < 单个磁盘写入(多了奇偶校验信息写入) | N-1/N | 是一种存储性能、数据安全和存储成本兼顾的存储解决方案 | ||
RAID 6 | N-2/N | ||||
RAID 10 | 读:RAID 10 = RAID 0 写:RAID 10 = RAID 1 | 与 RAID 1 相同 | 50% | 与 RAID 1 相同 | 集合了 RAID 1 和RAID 0的优点,但是空间上由于使用镜像,而不是奇偶校验信息,磁盘使用率一样是50% |
3.实际使用
就目前我所接触过的服务器而言,一般都是做 RAID 1 + RAID 5,RAID 1 用来按照系统,RAID 5 用来做数据盘
同一个阵列,要么全是机械,要么全是固态,且同型号,同容量
进阶知识
系统启动顺序
BIOS
- 计算机通电后,第一件事就是读取刷入ROM芯片的开机程序,这个过程叫做(Basic Input/Output System)
系统自建
BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做“硬件自检”(Power-On Self-Test)
如果硬件出现问题,主板会发出不同含义的蜂鸣,启动终止。如果没有问题,屏幕就会显示除CPU、内存、硬盘等信息。
启动顺序
硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这时,BIOS需要知道,“下一阶段的启动程序”具体存放在哪一个设备。
BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做“启动顺序”(Boot Sequence)。
BIOS按照“启动顺序”,把控制权转交给排名在第一位的储存设备。这时,计算机读取该设备的第一位扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给“启动顺序”中的下一个设备。这最前面的512个字节,就叫做“主引导记录”(Master boot record,缩写为MBR)
“主引导记录”只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。
- (1)第1-446字节:是用来记录系统的启动信息的,调用操作系统的机器码。
- (2)第447-510字节(64个字节):分区表(Partition table),分区表的作用,是将硬盘分成若干个区
- (3)第511-512字节:主引导记录签名(0x55和0xAA)
分区表
- 磁盘分区是使用分区编辑器在磁盘上划分几个逻辑部分。磁盘一旦划分成多个分区,不同类的目录与文件可以存储进不同的分区内。“主引导记录”因此必须知道将控制权转交给哪个区。
- 分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分成四个一级分区,又叫做“主分区”
- (1)第一个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
- (2)第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
- (3)第5个字节:主分区类型,例如FAT32、NTFS等。
- (4)第6-8个字节:主分区最后一个扇区的物理位置。
- (5)第9-12字节:该主分区第一个扇区的逻辑地址。
- (6)第13-16字节:主分区的扇区总数。
硬盘启动
- 计算机的控制权就要转交给硬盘的某个分区了。四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做“卷引导记录”(Volume boot record,缩写为VBR)
操作系统
- 控制权交给操作系统后,操作系统的内核首先被载入内存。
- 以Linux系统为例,先载入
/boot
目录下的kernel
。内核加载成功后,第一个运行的程序时/sbin/init
。它根据配置文件(Debian系统是/etc/initab
)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。- 然后,
init
线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login
程序,跳出登录界面,等待用户输入用户名和密码。
网络小知识
1. 网线线序
-
橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 568b
-
白绿绿、橙白蓝、蓝白橙、白棕棕 568a
测线仪 两端都插上 --8个灯 依次亮 就是没问题
2. TCP/IP 协议
1.简述TCP三次握手过程
在TCP/IP协议中,TCP协议提供可靠的连接服务,采取三次握手建立一个连接,
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即syn+ack包,此时服务器进入syn_recv状态;
第三次握手;客户端收到服务器的SYN+ACK 包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入established状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
2.四次挥手的状态
FIN_WAIT_1:这个状态和FIN_WAIT_2状态都在再等待对方的回复,但是这两种状态是有区别的,FIN_WAIT_1就是主动方在ESTABLISHED状态的时候,想要主动关闭连接,向对方发送FIN报文,这时候就进入了FIN_WAIT_1状态。当他收到对方回复的ACK报文后,就进入了FIN_WAIT_2状态。 但是在实际操作中是很难遇到FIN_WAIT_1状态的,因为无论对方是什么情况都应该立刻回应ACK报文,但是FIN_WAIT_2状态还是可以在主动方中用netstat看到的。
FIN_WAIT_2:上面已经对FIN_WAIT_2讲解过了,当主动方进入FIN_WAIT_2时,就表示着半连接状态,也就是主动方还有数据要发给对方,这个数据就是之后的ACK,所有他要等一会儿才关闭连接。
CLOSE_WAIT:这个状态从表面也可以看出它的作用,就是等待关闭。当被动方接收到FIN时,会立刻回复一个ACK给对方,接下来就是进入CLOSE_WAIT状态。在这个状态中,被动方需要考虑自己还有没有数据要发送给对方,如果有可以继续发送,如果没有了就可以关闭连接了,发送一个FIN给对方。 这个状态其实也就是给自己一个缓冲的时间,让自己处理完需要处理的事,然后去关闭连接。
TIME_WAIT:这个状态就是一段时间后进行一些操作。当主动方收到了对方发来的FIN报文,并发出ACK报文,接下来就等2MSL就可以进入CLOSED状态了。其实,如果主动方在FIN_WAIT_1状态下,收到了对方的FIN+ACK标志的报文,就可以跳过FIN_WAIT_2状态直接进入TIME_WAIT状态了。
LAST_ACK:这个状态从表面不难不理解他的意思,这个状态就是被动方发送了FIN报文后,最后等待对方的ACK报文,收到ACK报文后就可以进入CLOSED状态了。
CLOSED:上面提到了几次这个状态,相比也猜出来了,这个状态表示的就是连接中断,已经关闭。
在上面的TIME_WAIT状态中有提到过2MSL,那么什么是2MSL呢?那么来详细说一下TIME_WAIT状态和里面的2MSL。
3.为什么需要TIME_WAIT?
TIME_WAIT在四次挥手中有着不可替代的位置,如果没有TIME-WAIT,主动方就会直接进入CLOSED状态,(假设主动方是客户端,被动方是服务端)这时候如果立即重启客户端使用相同的端口,如果因为网络中种种原因最后一次ACK丢失了,服务端就会重复FIN请求,这时这个FIN就会被重新启动的客户端接收到,或者新启动的客户端向服务端发起请求的时候,因为服务端正在等待最后一次ACK,因此新连接请求发送的SYN就会被服务端认为时请求码错误,服务端就会回复RET重置连接。所以就需要主动方发送最后一次ACK之后进入TIME_WAIT状态,等待2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的FIN请求能够进行最后一次ACK回复,让在网络中延迟的FIN/ACK数据都消失在网络中,不会对后续连接造成影响
4.那么为什么TIME_WAIT的时间是2MSL呢?
MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的,同时也是在理论上保证最后一个报文可靠到达,假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK。
5.tcp 链接状态有哪些,分别代表什么意思
listen:侦听来自远方的TCP端口连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT: 等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保TCP接收到连接中断请求的确认
CLOSED: 没有任何连接状态
6.tcp和UDP的区别?
tcp是全双工的,是可靠的连接,而UDP是不可靠的。
tcp传输协议是一种面向连接,基于字节流的传输层通信协议(可靠)
UDP 是 internet协议支持一个无连接的传输协议,为应用程序提供了一种无须建立连接,就可以封装IP的数据包方法
tcp传输数据 无差错 不丢失 不重复,UDP不保证可靠交付
UDP的有点是:快 UDP没有TCP的握手 确认 重传等机制,比较安全, -
什么时候用UDP ==当网络通讯要求不高时候使用UDP,希望快 例如QQ视频 。
7.简述TCP/IP协议中的TCP和IP
TCP/IP是一个协议族,是因为TCP/IP协议包括TCP,IP,UDP,ICMP,RIP,SMTP,ARP,等许多协议,这些协议一起称为tcp/ip 协议
- TCP(transport control protocol) 传输控制协议
- ip(internetworking protocol)网间网协议
- udp(user datagram protocol)用户数据协议。
- icmp(internet control message protocol)互联网控制信息协议
- smtp(simple mail transfer protocol)简单邮件传输协议
- snmp(simple networkmanager protocol)简单网络管理协议
- ftp(file transfer protocol)文件传输协议
- arp(address resolution protocol)地址解析协议 MAC 0F:23:SF:SD
3. OSI七层模型
1.七层模型
-
物理层:处于OSI参考模型的最底层,物理层主要功能是利用物理传输介质为数据链路层提供物理连接。
-
数据链路层:在此层将数据分帧,并处理流控制,屏蔽物理层,为网络层提供一个物理链路的连接,在一条有可能出差错的物理连接上,进行无差错的数据传输,本层指定拓扑结构并提供硬件寻址
-
网络层:本层通过寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的传输层,它包括通过互联网络来路由和中继数据。
-
传输层:常规数据递送面向连接或无连接,为会话层用户提供一个端到端的可靠,透明和优化的数据传输服务机制
-
会话层:在两个节点之间建立端连接,为端系统的应用程序之间提供对话控制机制
-
表示层:用于处理两个通信系统中交换信息的表示方式,为上层用户解决用户信息的语法问题,包括数据格式交换,数据加密与解密,数据压缩与恢复功能。
-
应用层:OSI中最高层 为特定类型的网络应用提供访问OSI环境的手段,提供应用进行所需要的信息交换和远程操作。
需要熟记
2.七层模型每层都跑的什么协议
名称 | 作用 | 常用协议 |
---|---|---|
应用层 | 特定应用对接收数据的处理 | HTTP、FTP、SMTP |
表示层 | 设备数据格式与网络标准数据格式转换 | LPP、GIF、JPEG |
会话层 | 通信管理,建立和断开通信连接 | RPC、SSL、TLS |
传输层 | 管理两个网络终端之间的数据传输 | TCP、UDP |
网络层 | 网络地址管理和路由选择 | IP/IPv6、ICMP |
数据链路层 | 互联设备之间传送和识别数据帧 | ARP、PARP |
物理层 | 比特流与电子信号之间的转换 | IEEE 802.3/802.2 |
Linux 常见问题及解决方式(暂不完整,当作没看见即可)
一、系统引导、启动和关闭问题
启动问题很难解决,因为首先必须想办法启动Linux才能开始排除故障。必须很好的理解Linux的3部分引导过程,才能诊断并排除启动问题。本章讨论以下关键主题:
- 引导加载程序GRUB和LILO
- init进程
- 启动和关闭脚本
- 解决root文件系统的问题
引导加载程序是引导时从磁盘执行的第一个软件,目的时启动Linux内核。GRUB和LILO是最普通的引导加载程序,这两个软件都很容易配置引导菜单中选择不同内核和引导磁盘的选项。
init进程是Linux内核在引导过程中启动的第一个进程,负责在引导过程中和更改运行等级时启动进程。init在每个运行等级运行rc子系统,以启动和停止该运行等级的进程。init是每一个其他进程的父进程。
Linux 在启动时开始许多服务。网络服务、cron 和 syslog 只是其中几个。rc子系统启动这些服务。
1.1 引导加载程序
引导加载程序显示在 Linux 启动过程中出现的引导菜单。引导加载程序不是Linux独有的程序,它们是 BIOS 和操作系统之间的桥梁,在 Linux、Windows和unix 都是这样。
引导加载程序加载Linux内核和初始内存磁盘(initial ram disk),然后执行该内核。BIOS 确定从哪些源(硬盘、软盘、CD等)引导,然后加载主引导记录(MBA),引导加载程序从所选设备执行。
1.1.1 GRUB
址
3. 网络层:本层通过寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的传输层,它包括通过互联网络来路由和中继数据。
4. 传输层:常规数据递送面向连接或无连接,为会话层用户提供一个端到端的可靠,透明和优化的数据传输服务机制
5. 会话层:在两个节点之间建立端连接,为端系统的应用程序之间提供对话控制机制
6. 表示层:用于处理两个通信系统中交换信息的表示方式,为上层用户解决用户信息的语法问题,包括数据格式交换,数据加密与解密,数据压缩与恢复功能。
7. 应用层:OSI中最高层 为特定类型的网络应用提供访问OSI环境的手段,提供应用进行所需要的信息交换和远程操作。
需要熟记
2.七层模型每层都跑的什么协议
名称 | 作用 | 常用协议 |
---|---|---|
应用层 | 特定应用对接收数据的处理 | HTTP、FTP、SMTP |
表示层 | 设备数据格式与网络标准数据格式转换 | LPP、GIF、JPEG |
会话层 | 通信管理,建立和断开通信连接 | RPC、SSL、TLS |
传输层 | 管理两个网络终端之间的数据传输 | TCP、UDP |
网络层 | 网络地址管理和路由选择 | IP/IPv6、ICMP |
数据链路层 | 互联设备之间传送和识别数据帧 | ARP、PARP |
物理层 | 比特流与电子信号之间的转换 | IEEE 802.3/802.2 |
Linux 常见问题及解决方式(暂不完整,当作没看见即可)
一、系统引导、启动和关闭问题
启动问题很难解决,因为首先必须想办法启动Linux才能开始排除故障。必须很好的理解Linux的3部分引导过程,才能诊断并排除启动问题。本章讨论以下关键主题:
- 引导加载程序GRUB和LILO
- init进程
- 启动和关闭脚本
- 解决root文件系统的问题
引导加载程序是引导时从磁盘执行的第一个软件,目的时启动Linux内核。GRUB和LILO是最普通的引导加载程序,这两个软件都很容易配置引导菜单中选择不同内核和引导磁盘的选项。
init进程是Linux内核在引导过程中启动的第一个进程,负责在引导过程中和更改运行等级时启动进程。init在每个运行等级运行rc子系统,以启动和停止该运行等级的进程。init是每一个其他进程的父进程。
Linux 在启动时开始许多服务。网络服务、cron 和 syslog 只是其中几个。rc子系统启动这些服务。
1.1 引导加载程序
引导加载程序显示在 Linux 启动过程中出现的引导菜单。引导加载程序不是Linux独有的程序,它们是 BIOS 和操作系统之间的桥梁,在 Linux、Windows和unix 都是这样。
引导加载程序加载Linux内核和初始内存磁盘(initial ram disk),然后执行该内核。BIOS 确定从哪些源(硬盘、软盘、CD等)引导,然后加载主引导记录(MBA),引导加载程序从所选设备执行。
1.1.1 GRUB
GRand统一引导加载程序(GRUB,GRand Unified Bootloader)和Linux加载程序(LILO,LInux LOader)