Linux 远程工具

远程连接服务器

ssh

ssh:ssh登陆服务器

1
2
ssh <user_name>@<host> [-p <port>] [-i <private_key>]
[-F <config_file>]
  • 参数
    • -F:指定配置文件,简化命令,缺省~/.ssh/config
      • 有时会覆盖其余配置,可以指定-F /dev/null避免
    • -p:指定端口
    • -i:指定使用的私钥
    • -T:测试连接

ssh-keygen

ssh-keygen:生成ssh密钥

1
2
3
4
 # 生成位长为4096的RSA密钥
$ ssh-keygen -t rsa -b 4096 -C "xyy15926@163.com"
# 更改现有私钥密钥
$ ssh-keygen -p [-f keyfile] [-m format] [-N new_pwd] [-p old_pwd]
  • 参数

    • -t [dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk|ras]: 生成密钥类型
    • -f <output_keyfile>:密钥保存文件
    • -b <bits>:密钥位数
    • -C <comment>
    • -p:修改现有密钥密码
  • 在生成密钥时可以设置密钥,避免计算机访问权限被获取后密钥 被用于访问其他系统

    • 设置有密钥的私钥每次使用都需要输入密码
    • ssh-agent可以用于管理私钥密码,将私钥添加给 ssh-agent无需每次输入密码

ssh-add

ssh-add:管理ssh-agent代理密钥

1
2
 # 缺省将`$HOME/.ssh/id_rsa`私钥添加至`ssh-agent`
$ ssh-add <keyfile>
  • 参数
    • -l:查看代理中私钥
    • -L:查看代理中私钥对应公钥
    • -d <keyfile>:移除指定私钥
    • -D:移除所有私钥
    • -x/-X:锁定/解锁ssh-agent(需要设置密码)
    • -t <seconds>:密钥时限

ssh-agent

ssh-agent:控制和保存公钥验证所使用的私钥程序

  • 参数

    • -k:关闭当前ssh-agent进程
  • 启动方式

    1
    2
    3
    4
    5
    # 创建默认子shell,在子shell中运行`ssh-agent`
    # 会自动进入子shell中,退出子shell则`ssh-agent`关闭
    $ ssh-agent $SHELL
    # 启动后台`ssh-agent`进程,需手动关闭`ssh-agent`进程
    $ eval `ssh-agent`
  • 说明

    • ssh-agent添加私钥需要输入私钥密码 (无密码私钥无管理必要)
    • ssh-agent不会默认启动,应是每次需要大量使用私钥 前启动、添加私钥,然后关闭

/etc/init.d/sshd

sshd:ssh连接的服务器守护程序(进程)

1
2
3
4
$ sudo systemctl start sshd
# 使用`systemctl`启动
$ /etc/init.d/sshd restart
# 直接启动进程

scp

scp:secure cp,安全传输(cp)文件

  • 本机到远程

    1
    $ scp /path/to/file user_name@host:/path/to/dest
  • 远程到本机

    1
    $ scp user_name@host:/path/to/file /path/to/dest
    • 这个命令应该在本机上使用,不是ssh环境下
    • ssh环境下使用命令表示在远程主机上操作
    • 而本机host一般是未知的(不是localhost)
  • 远程到远程

rsync

实现本地主机、远程主机的文本双向同步

同步两种模式

同步过程由两部分模式组成

  • 决定哪些文件需要同步的检查模式

    • 默认情况下,rsync使用quick check算法快速检查 源文件、目标文件大小、mtime是否一致,不一致则 需要传输
    • 也可以通过指定选项改变检查模式
  • 文件同步时的同步模式:文件确定被同步后,在同步发生 之前需要做哪些额外工作

    • 是否删除目标主机上比源主机多的文件
    • 是否要先备份已经存在的目标文件
    • 是否追踪链接文件

工作方式

  • 本地文件系统同步:本质是管道通信

    1
    $ rsync [option..] src... [dest]
  • 本地主机使用远程shell和远程主机通信

    1
    2
    $ rsync [option...] [user@]host:src... [dest]
    $ rsync [option...] src... [user@]host:dest
    • 本质上是管道通信
  • 本地主机通过socket连接远程主机的rsync

    1
    2
    3
    4
    $ rsync [option...] rsync://[user@]host[:port]/src... dest
    $ rsync [option...] [user@]host::src... [dest]
    $ rsync [option...] src... rsync://[user@]host[:port]/dest
    $ rsync [option...] src... [user@]host::dest
    • 需要远主机运行rsync服务监听端口,等待客户端连接
  • 通过远程shell临时派生rsync daemon,仅用于临时读取daemon 配置文件,同步完成后守护进程结束

    • 语法同shell远程主机通信,指定--rsh/-e选项

参数说明

  • 可以有多个源文件路径,最后一个是目标文件路径
  • 如果只有一个路径参数,则类似于ls -l列出目录
  • 注意:如果原路径是目录
    • /结尾表示目录中文件,不包括目录本身
    • 不以/结尾包括目录本身

常用选项

同步模式选项
  • v/-vvvv:显示详细/更详细信息
  • p/--partial --progress:显示进度
  • -n/--dry-run:测传传输
  • -a/--archive:归档模式,递归传输并保持文件属性
  • -r/--recursive:递归至目录
  • -t/--times:保持mtime属性
    • 建议任何时候都使用,否则目标文件mtime设置为系统时间
  • -o/--owner:保持属主
  • -g/--group:保持group
  • -p/--perms:保持权限(不包括特殊权限)
  • -D/--device --specials:拷贝设备文件、特殊文件
  • -l/--links:如果目标是软链接文,拷贝链接而不是文件
  • z:传输时压缩

  • w/--whole-file:使用全量传输

    • 网络带宽高于磁盘带宽时,此选项更高效
  • R/--relative:使用相对路径,即在目标中创建源中指定 的相对路径

    1
    2
    3
    $ rsync -R -r /var/./log/anaconda /tmp
    # 将会在目标创建`/tmp/log/anaconda`
    # `.`是将绝对路径转换为相对路径,其后的路径才会创建
  • --delete:以源为主,对DEST进行同步,多删、少补

  • -b/--backup:对目标上已经存在文件做备份的
    • 备份文件名使用~做后缀
  • --backup-dir:指定备份文件保存路径,不指定为同一目录
  • --remove-source-file:删除源中已成功传输文件
连接
  • --port:连接daemon时端口号,默认873
  • --password-file:daemon模式时的密码文件
    • 可以从中读取密码文件实现非交互式
    • 是rsync模块认证密码,不是shell认证密码
  • -e:指定所需要的远程shell程序,默认ssh
    1
    $ rsync -e "ssh -p 22 -o StrictHostKeyChecking=no" /etc/fstab
  • --rsh:使用rsync deamon进行同步
检查模式选项
  • --size-only:只检查文件大小,忽略mtime
  • -u/--update:进源mtime比已存在文件mtime新才拷贝
  • -d/--dirs:以不递归方式拷贝目录本身(不目录中内容)
  • --max-size:传输最大文件大小,可以使用单位后缀
  • --min-size:传输的最小文件大小
  • --exclude:指定派出规则排除不需要传输的文件
  • --existing:只更新目标端已存在文件,不存在不传输
  • --ignore-existing:只更新在目标段不存在文件

SSH

/etc/ssh/sshd_config

全局系统ssh配置

1
2
3
4
5
6
7
8
RSAAuthentication
# 去掉注释启用RSA认证
PubkeyAuthentication yes
# 启用公私钥配对认证方式
AuthorizedKeyFile .ssh/authorized_keys
# 设置被认证的公钥存放文件
# 默认为`~/.ssh/authorized_keys`中
# 将其他主机公钥写入其中,即可从其使用密钥认证免密访问

~/.ssh

authorized_keys

/etc/.ssh/sshd_config中默认的存储其他主机公钥的文件,

  • 使用在其中的公钥可以使用公钥登陆,无需密码
  • 必须设置只有root用户有更改权限有效,否则报错
1
---pubkey---
id_rsa.pub

生成公钥

config

ssh访问远程主机配置

  • 每条配置对应一个ssh连接,配置后可以使用link_name直接 连接
1
2
3
4
5
6
7
Host <link_name>
HostName <host>
User <user_name>
Port <port>
IdentityFile <private_key>
IdentitiesOnly yes
PreferredAuthentications publickey
  • 默认私钥文件为:~/.ssh/id_rsa,可以指定特定私钥
  • 此文件中配置是ssh协议参数封装,适合任何可以使用ssh协议 场合:sshgitscp

Shell 任务

定时任务

atq

列出用户等待执行的作业

atrm

删除用户等待执行的作业

watch

定期执行程序

at

设置在某个时间执行任务

1
2
3
4
5
6
7
at now+2minutes/ now+5hours
# 从现在开始计时
at 5:30pm/ 17:30 [today]
# 当前时间
at 17:30 7.11.2018/ 17:30 11/7/2018/ 17:30 Nov 7
# 指定日期时间
# 输入命令之后,`<c-d>`退出编辑,任务保存

crontab

针对用户维护的/var/spool/cron/crontabs/user_name文件,其中 保存了cron调度的内容(根据用户名标识)

  • -e:编辑
  • -l:显示
  • -r:删除

任务计划格式见文件部分

任务、作业

Crontab文件

/var/spool/cron/crontabs/user_name

使用用户名标识的每个用户的定时任务计划文件,文件中每行为一个 cron调度内容(也可以使用crontab -e直接编辑)

  • 共6个字段,前5个字段为执行调度时间分配

    • 分钟、小时(24)、日期(31)、月份(12)、星期
    • *表示每个当前时间
    • -时间区间
    • ,时间分隔
    • [range]/[n]:范围内每隔多久执行一次,范围为*可省
  • 最后字段为调度内容

  • 1
    2
    3
    4
    3,15 8-11 */2 * * command
    # 每隔两天的8-11点第3、15分执行
    3,15 8-11 * * 1 command
    # 每个星期一的上午8-11点的第3、15分钟执行

/etc/crontabs

系统级crontab文件,类似于用户crontab文件,只是多一个用户名 字段位于第6个

服务

系统服务

  • 服务systemctl脚本目录优先级从低到高

    • [/usr]/lib/systemd/system:系统、应用默认存放位置 ,随系统、应用更新会改变

    • /etc/systemd/system推荐在此自定义配置,避免 被更新覆盖

      1
      2
      .include /lib/systemd/system/<service_name>.service
      # customized changes
    • /run/systemd/system:进程运行时创动态创建服务文件 目录,仅修改程序运行时参数才会修改

  • 自定义系统服务方法

    • 创建<service_name>.service文件,其中写入配置
    • 创建<service_name>.service.d目录,其中新建.conf 文件写入配置
  • 系统服务控制命令systemctl参见linux/shell/cmd_sysctl

.service

<some_name>.service:服务配置unit文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[Unit]					# 包含对服务的说明
Description= # 服务简单描述
Documentation= # 服务文档
Requires= # 依赖unit,未启动则当前unit启动失败
Wants= # 配合unit,不影响当前unit启动
BindsTo= # 类似`Requires`,若其退出则当前unit
# 退出
Before= # 若该字段指定unit要启动,则必须在
# 当前unit之后启动
After= # 若该字段指定unit要启动,则必须在
# 当前unit之前启动
Conflicts= # 冲突unit
Condition= # 条件,否则无法启动
Assert= # 必须条件,否则启动失败


[Service] # 服务具体运行参数设置,仅
# *service unit*有该字段
Type= # 服务启动类型
PIDFile= # 存放PID文件路径
RemainAfterExit= # 进程退出后是否认为服务仍处于激活

ExecStartPre= # 服务启动前执行的命令
ExecStartPost= # 服务启动后执行的命令
ExecStart= # 服务具体执行、重启、停止命令
ExecReload=
ExecStop=

Restart= # 重启当前服务的情况
RestartSec= # 自动重启当前服务间隔秒数
TimeoutSec= # 停止当前服务之前等待秒数

PrivateTmp= # 是否给服务分配临时空间
KillSignal=SIGTERM
KillMode=mixed

Environmen= # 指定环境变量

[Install]
WantedBy= # unit所属的target,`enable`至相应
# target
RequiredBy= # unit被需求的target
Alias= # unit启动别名
Also= # `enable`当前unit时,同时被`enable`
# 的unit
  • Type:服务启动类型

    • simple:默认,执行ExecStart启动主进程

      • Systemd认为服务立即启动
      • 适合服务在前台持续运行
      • 服务进程不会fork
      • 若服务要启动其他服务,不应应该使用此类型启动,
    • forking:以fork方式从父进程创建子进程,然后父进程 立刻退出

      • 父进程退出后Systemd才认为服务启动成功
      • 适合常规守护进程(服务在后台运行)
      • 启动同时需要指定PIDFile=,以便systemd能跟踪 服务主进程
    • oneshot:一次性进程

      • Systemd等待当前服务退出才继续执行
      • 适合只执行一项任务、随后立即退出的服务
      • 可能需要同时设置RemainAfterExit=yes,使得 systemd在服务进程推出后仍然认为服务处于激活状态
    • notify:同simple

      • 但服务就绪后向Systemd发送信号
    • idle:其他任务执行完毕才会开始服务

    • dbus:通过D-Bus启动服务

      • 指定的BusName出现在DBus系统总线上时,Systemd 即认为服务就绪
  • WantedBy:服务安装的用户模式,即希望使用服务的用户

    • multi-user.target:允许多用户使用服务

.target

<some_name>.target:可以理解为系统的“状态点”

  • target通常包含多个unit

    • 即包含需要启动的服务的组
    • 方便启动一组unit
  • 启动target即意味将系统置于某个状态点

  • target可以和传统init启动模式中RunLevel相对应

    • 但RunLevel互斥,不能同时启动

    |RunLevel|Target| |——-|——-| |0|runlevel0.targetpoweroff.target| |1|runlevel1.targetrescue.target| |2|runlevel2.targetmulti-user.target| |3|runlevel3.targetmulti-user.target| |4|runlevel4.targetmulti-user.target| |5|runlevel5.targetgraphical.target| |6|runlevel6.targetreboot.target|

  • enable设置某个服务自启动,就是在服务配置.serviceWantedByRequiredBy指明的target注册

    • WantedBy向target对应目录中 /etc/systemd/system/<target_name>.target.wants 添加符号链接
    • RequiredBy向target对应目录中 /etc/systemd/system/<target_name>.target.required 添加符号链接
    • systemctl disable <unit>就是移除对应symlink

.socket

日志

/etc/systemd/journal.conf

Systemd日志配置文件

Systemd(服务)

  • Systemd作为新系统管理器,替代service更加强大

    • 支持服务并行启动,提高效率
    • 具有日志管理、快照备份和恢复、挂载点管理
    • 包括一组命令
  • Systemd可以管理所有系统资源,不同资源统称为Unit

    • service unit:系统服务
    • target unit:多个unit构成的组
    • devie unit:硬件设备
    • mount unit:文件系统挂载点
    • automount unit:自动挂载点
    • path unit:文件、路径
    • scope unit:不是由Systemd启动外部进程
    • slice unit:进程组
    • snapshot unit:Systemd快照,可以切换某个快照
    • socket unit:进程间通信socket
    • swap unit:swap文件
    • timer unit:定时器
  • unit配置文件状态(无法反映unit是否运行)

    • enabled:已建立启动链接
    • diabled:未建立启动链接
    • static:配置文件没有[Install]部分,只能作为 其他unit配置文件依赖,不能独立注册
    • masked:被禁止建立启动链接
  • systemd进程ID为1,掌管所有进程
  • unit配置文件参见linux/shell/config_files

systemctl

  • systemctl通过d-bus和systemd交流,在docker和wsl中可能 没有systemd-daemon,此命令可能不能使用,使用service 代替

查看服务、系统状态

  • status <unit>:查看系统、unit(服务)状态
    • -H <host>:查看远程主机unit状态
  • show <unit>:查看unit底层参数
    • -p <attr>:查看某个具体属性参数
  • 三个查询状态的简单方法,方便脚本使用
    • is-active <serivce>
    • is-failed <serivce>
    • is-enabled <serivce>
  • reset-failed <unit>:清除错误状态

  • list-units:列出所有已加载unit

  • list-unit-files:列出所有系统中unit配置文件、状态
    • --type=:指定特定类型文件
    • --status=:指定特定状态文件
  • list-dependencies <unit>:查看依赖关系
    • -all:展开target类型

状态点/启动级别

  • get-default:查看默认target
  • set-default <target>:设置默认target
  • isolate <target>:切换target,其他target的unit将 被停止

设置服务、系统

  • start <service>:启动服务
  • stop <service>:关闭服务
  • enable <service>:开机自启动服务

    • 行为参见linux/shell/config_files
  • disable <service>:关闭开机自启动服务

    • enable启动后的服务仅仅disable不会立刻停止服务
  • kill <service>:杀死服务的所有子进程
  • mask <service>:禁用服务
    • 无法通过startrestart启动服务
    • 可以防止服务被其他服务间接启动
  • umask <service>:启用已禁用服务
  • daemon-reload:重新读取所有服务项
    • 修改、删除、添加服务项后执行该命令
  • poweroff:关机
  • reboot:重启
  • rescue:进入rescue模式

配置文件

  • cat <service_name>.service:查看Unit定义文件
  • edit <service_name>.service:编辑Unit定义文件
  • reload <service_name>.service:重新加载Unit定义文件

journalctl

journalctl:统一管理所有日志:内核日志、应用日志

  • -k:仅内核日志
  • --since:指定日志时间
  • -n:指定查看日志行数
  • -f:最新日志
  • _PID=:进程日志
  • _UID=:用户日志
  • -u:unit日志
  • -p:日志有限集
    • emerg:0
    • alert:1
    • crit:2
    • err:3
    • warning:4
    • notice:5
    • info:6
    • debug:7
  • --nopager:非分页输出
  • -o:日志输出格式
    • json
    • json-pretty
  • --disk-usage:日志占用空间
  • --vacuum-size=:指定日志占用最大空间
  • --vacuum-time=:指定日志保持时间

systemd-analyze

systemd-analyze:查看系统启动耗时

  • blame:查看各项服务启动耗时
  • critical-chain:瀑布状启动过程流

hostnamectl

hostnamectl:查看主机当前信息

  • set-hostname <hostname>:设置主机名称

localectl

localctl:查看本地化设置

  • set-locale LANG=en_GB.utf8
  • set-keymap en_GB

timedatectl

timedatectl:查看当前时区设置

  • list-timezones:显示所有可用时区
  • set-timezone America/New_York
  • set-time YYYY-MM-DD
  • set-time HH:MM:SS

loginctl

loginctl:查看当前登陆用户

  • list-sessions:列出当前session
  • list-users:列出当前登陆用户
  • show-user <user>:显示用户信息

service

控制系统服务

Shell 用户配置

用户、组

用户信息

/etc/passwd

用户属性

  • 用户名
  • 口令:在/etc/passwd文件中以x显示
  • user-id:UID,用户标识
    • linux事实上不直接处理用户名,只识别UID
    • UID对用户是唯一的
  • group-id:GID,用户的默认组标识
    • 用户可以隶属多个不同的组,但是只有一个默认组,即用户 创建文件默认隶属的组
  • 描述:用户描述
  • 用户主目录:用户登陆目录
  • 登陆shell:用户登陆系统使用的shell
    • 缺省为空,可能是/bin/sh

/etc/shadow

用户口令属性

  • 用户名
  • 加密的密码
  • 自1/1/1970起,密码被修改的天数
  • 密码将被允许修改之前的天数(0为在任何时候可修改)
  • 系统强制用户修改为新密码之前的天数(1永远不能修改)
  • 提前警告用户密码过期前天数(-1无警告)
  • 禁用用户账户在密码过期后天数(-1永不禁用)
  • 用户被禁用天数(-1被启用)

/etc/group

群组账号信息文件

  • 群组名
  • 密码:以x显示
  • 群组ID(GID)
    • 系统群组:安装Linux以及部分服务型程序时自动设置的 群组,GID<500
    • 私人组群:由root新建的群组,默认GID>500
  • 附加用户列表

/etc/gshadow

群组口令信息文件

/etc/sudoers

sudo配置文件

  • 根据配置文件说明取消注释即可赋予用户、组sudo权限

用户配置文件

  • login-shell:用户登陆(创建session)时的shell模式,该 模式下shell会自动执行profile文件
  • subshell:用户登陆后载入的shell的模式,该模式下shell会 自动执行rc文件

profile

-一般在login-shell模式会执行一次,从名称看起来更像是 用户配置

  • 全局、被所有用户默认执行的文件在/etc目录下,用户个人 profile在用户目录

  • ^profile$是所有类型shell(bash、zsh、ash、csh)都会 执行

  • 不同类型的shell可能有其特定的profile文件,如: /etc/bash_profile~/.bash_profile,不过不常见 (可以理解,毕竟是用户配置

  • 有的发行版本(ubuntu)还有有/etc/profile.d文件夹,在 /etc/profile中会设置执行其中的配置文件

rc

rc应该是run command的简称,在每次subshell模式会执行,从 名称看起来更像是shell配置(很多应用配置文件rc结尾)

  • 全局、被所有用户执行的文件在/etc目录下,用户个人rc 则在用户目录

  • 应该是因为rc本来就是对shell的配置文件,所以是不存在 通用的^rc$配置的,最常用的bash对应就是~/.bashrc~/bash.bashrc

总结

  • 其实rc也会在用户登陆时执行

    • login-shell会立刻载入subshell?
    • profile里设置了立刻调用?
  • 应该写在profile里的配置

    • shell关系不大、更像是用户配置,如:特定应用环境变量
    • 不需要、不能重复执行,因为rc在用户登录时已经执行 过一次,launch subshell时会重复执行,如: export PATH=$PATH:xxxx/bin/
  • 应该写在rc里的配置

    • 和shell关系紧密的shell配值,如:alias
    • 在用户登陆后会该边,需要在每次launch subshell时执行 的配置
  • 配置文件执行顺序

    • 没有一个确定顺序,不同的linux发行版本有不同的设置, 有的还会在脚本中显式写明相互调用,如:/etc/profile 中调用/etc/bashrc~/.bashrc调用/etc/bashrc
    • 但是可以确认的是/etc/profile一般是第一个被调用, ~/.xxxxrc/etc/xxxxxrc中的一个最后调用
  • 还有一些其他配置文件

    • ~/.bash_logout:退出bash shell时执行
  • 对于wsl,可能是因为将用户登陆windows视为create session, ~/.profile好像是不会执行的

/etc/environment

系统在登陆时读取第一个文件

  • 用于所有为所有进程设置环境变量
  • 不是执行此文件中的命令,而是根据KEY=VALUE模式的 代码,如:PATH=$PATH:/path/to/bin

用户命令

用户类型

  • 超级用户:root用户
  • 系统用户:与系统服务相关的用户,安装软件包时创建
  • 普通用户:root用户创建,权限有限

显示登陆用户

w

详细查询已登录当前计算机用户

who

显示已登录当前计算机用户简单信息

logname

显示当前用户登陆名称

users

用单独一行显示当前登陆用户

last

显示近期用户登陆情况

lasttb

列出登陆系统失败用户信息

lastlog

查看用户上次登陆信息

用户、用户组

newusers

更新、批量创建新用户

lnewusers

从标准输入中读取数据创建用户

userdel

删除用户账户

groupdel

删除用户组

passwd

设置、修改用户密码

chpassws

成批修改用户口令

change

更改用户密码到期信息

chsh

更改用户账户shell类型

pwck

校验/etc/passwd/etc/shadow文件是否合法、完整

grpck

验证用户组文件/etc/grous//etc/gshadow完整性

newgrp

将用户账户以另一个组群身份进行登陆

finger

用户信息查找

groups

显示指定用户的组群成员身份

id

显示用户uid及用户所属组群gid

su

切换值其他用户账户登陆

sudo

以superuser用户执行命令

  • Archlinux中需要自行安装
  • 配置文件为/etc/sudoers

useradd/adduser

创建用户账户(adduseruseradd命令的符号链接)

  • -c:用户描述
  • -m:创建用户目录
  • -d:用户起始目录
  • -g:指定用户所属组
  • -n:取消建立以用户为名称的群组
  • -u:指定用户ID
  • -s:指定用户登录shell
    • 缺省为空,默认值应该是/bin/sh,很多发行版会设置 其为/bin/bash
    • 查看$SHELL环境变量查看当前shell
    • 文件/etc/shells包含支持shell类型

usermod

修改用户

  • -e:账户有效期限
  • -f:用户密码过期后关闭账号天数
  • -g:用户所属组
  • -G:用户所属附加组
  • -l:用户账号名称
  • -L:锁定用户账号密码
  • -U:解除密码锁定

groupadd

新建群组

  • -g:强制把某个ID分配给已经存在的用户组,必须唯一、非负
  • -p:用户组密码
  • -r:创建系统用户组

groupmod

  • -g:设置GID
  • -o:允许多个用户组使用同一个GID
  • -n:设置用户组名

Linux 网络接口配置

网络配置

HOST

/etc/hostname

设置主机名称,直接填写字符串即可

1
PC-NAME

/etc/hosts

ipd地址-主机名称映射

  • 理论上说,这里主机名称应该是本机称呼,不要求其他主机 /etc/hostname与这里的主机名一致
1
2
3
127.0.0.1 localhost
xxx.xxx.xxx.xxx name
xxx.xxx.xxx.xxx domain.name

DNS Resolver

相关问题

  • Temporary failure in name resolution
    • 问题:可能是DNS服务器配置缺失、错误
    • 场景:$ ping
    • 解决:设置nameserver配置DNS服务器地址

/etc/resolv.conf

域名解析器(resolver)(DNS客户机)配置文件

  • 设置DNS服务器IP地址、DNS域名
  • 包含主机域名搜索顺序
1
2
3
4
nameserver		114.114.114.114		# DNS服务器IP地址
domain localhost # 本地域名
search search_list # 域名搜索列表
sortlist # 允许将得到域名结果进行排序

说明

  • nameserver:可以有多,每行一个ip地址,查询时按照 顺序依次查找
  • domain:声明主机域名
    • 查询无域名主机时需要使用
    • 邮件系统需要使用
    • 未配置则使用主机名
  • search:其参数指明域名查询顺序
    • 查询无域名主机时,将在其参数声明域中分别查找
    • domainsearch不共存,同时存在时,后者覆盖前者
  • sortlist:对得到的域名结果进行特定排序
    • 参数未网络/掩码对时,允许任意排列顺序

系统设置/etc/sysconfig

/etc/sysconfig/network[-scripts]

文件夹包含网卡配置文件

一般linux

  • ifcfg-ethXX:linux默认ethernet网卡配置文件名称
  • ifcfg-wlanXX:无线局域网网卡配置文件名称

CentOS7网卡名称

  • 前两个字符

    • en:Enthernet以太网
    • wl:WLAN无线局域网
    • ww:WWAN无线广域网
  • 第3个字符

    • o<index>:on-board device index number,
    • s<slot>:hotplug slot index number
    • x<MAC>:MAC address
    • p<bus>s<slot>:PCI geographical location/USB port number chain
  • 命名优先级

    • 板载设备:固件、BIOS提供的索引号信息可读:eno1
    • 固件、BIOS提供的PCI-E热拔插索引号可读:ens33
    • 硬件接口物理位置:enp2s0
    • linux传统方案:eth0
    • 接口MAC地址:enxXXXXXXXXXXXXXXXXX,默认不使用, 除非用户指定使用
  • 示例

    • enoXX:主板bios内置网卡
    • ensXX:主板bios内置PCI-E网卡
    • enpXXs0:PCI-E独立网卡
恢复传统命名方式

编辑grub文件,然后使用grub2-mkconfig重新生成 /boot/grub2/grub.cfg,这样系统就会根据传统linux网卡文件 命名方式查找配置文件

1
2
3
	# `/etc/sysconfig/grub`
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# 为`GRUB_CMDLINE_LINUX`增加2个参数

CentOS7配置格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DEVICE=ens33				# 网络连接名称(实际显示的网络名称)
NAME=ens33 # 网卡物理设备名称
TYPE = Ethernet # 网卡类型:以太网
ONBOOT=yes # 开机启动:是
DEFROUTE=yes # 是否设置此网卡为默认路由:是
NM_CONTROLLED=yes # 是否可由Network Manager托管:是

BOOTPROTO=dhcp # 网卡引导协议
# `none`:禁止DHCP
# `static`:启用静态IP地址
# `dhcp`:开启完整DHCP服务
IPADDR=xxx.xxx.xxx.xxx # IP地址
IPV4_FAILURE_FATAL=no # IPV4致命错误检测(失败禁用设备):否
IPV6INIT=yes # IPV6自动初始化:是
IPV6_AUTOCONF=yes # IPV6自动配置:是
IPV6_DEFROUTE=yes # IPV6是否可为默认路由:是
IPV6_FAILURE_FATAL=no # IPV6致命错误检测(失败禁用设备):否
IPV6_ADDR_GEN_MODE=stable-privacy
# IPV6地地址生成模型:stable-privacy

DNS1=xxx.xxx.xxx.xxx # DNS服务器地址1
DNS2=xxx.xxx.xxx.xxx # DNS服务器地址2
PEERDNS=no # 是否允许DHCP获得DNS覆盖本地DNS:否
GATEWAY=xxx.xxx.xxx.xxx # 网关
PREFIX=24 # 子网掩码使用24位
NETMASK=255.255.255.0 # 子网掩码
# 两个参数应该只需要使用一个即可
BROADCAST=

HWADDR=xxxxxxxxxx # 接口MAC地址
# 配置文件都会被执行,`HWADDR`
# 能匹配上硬件,配置才会生效,
# 否则硬件使用默认配置
# 若多个配置文件配置相同`HWADDR`
# 则操作network服务时报错
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 通用唯一识别码:不能相同(注意虚拟机)

PROXY_METHOD=none # 代理方式:无
BROWSER_ONLY=no # 仅浏览器:否

USERCTL=no # 是否允许非root用户控制此设备:否
MASTER= # 主设备名称?
SLAVE= # 从社会名称?
NETWORK= # 网络地址

Linux 文件系统配置

硬件

磁盘挂载

/etc/fstab

/etc/fstab:包含存储设备、文件系统信息,配置自动挂载 各种文件系统格式硬盘、分区、可移动设备、远程设备 (即mount参数存盘)

1
<fs> <mountpoint> <type> <opts> <dump> <pass>
  • <fs>:挂载设备/分区名

    • /dev/sda:设备/分区名
    • UUID=xxxxx:使用设备UUID值表示设备
    • tmpfs:tmpfs分区,默认被设置为内存的一半(可在 <opts>中添加size=2G指定最大空间)
    • 所有设备/分区都有唯一UUID,由文件系统生成工具mkfs. 创建文件系统时生成
  • <mountpoint>:挂载点,路径名(文件夹)

    • /
    • /boot
    • 路径名中包含可以空格使用\040(8进制)表示
  • <type>:文件系统类型

    • ext2
    • ext3
    • reiserfs
    • xfs
    • jfs
    • iso9660
    • vfat
    • ntfs
    • swap
    • tmpfs:临时文件系统,驻留在交换分区、内存中
      • 提高文件访问速度,保证重启时自动清除这些文件
      • 常用tmpfs的目录:/tmp/var/lock/var/run
    • auto:由mount自动判断
  • <opts>:文件系统参数

    • noatime:关闭atime特性

      • 不更新文件系统上inode访问记录,提高性能,否则 即使从缓冲读取也会产生磁盘写操作
      • 老特性可以放心关闭,能减少loadcycle
      • 包含nodiratime
    • nodiratime:不更新文件系统上目录inode访问记录

    • relatime:实时更新inode访问记录,只有记录中访问 时间早于当前访问才会被更新

      • 类似noatime,但不会打断其他程序探测,文件在 上次访问后是否需被修改(的进程)
    • auto:在启动、终端中输入$ mount -a时自动挂载

    • noauto:手动挂载

    • ro:挂载为自读权限

    • rw:挂载为读写权限

    • exec:设备/分区中文件可执行

    • noexec:文件不可以执行

    • sync:所有I/O将以同步方式进行

    • async:所有I/O将以异步方式进行

    • user:允许任何用户挂载设备,默认包含 noexec,nosuid,nodev(可被覆盖)

    • nouser:只允许root用户挂载

    • suid:允许set-user/group-id(固化权限)执行

      • set-user/group-id参见linux/shell/config_files
    • nosuid:不允许set-user/group-id权限位

    • dev:解释文件系统上的块特殊设备

    • nodev:不解析文件系统上块特殊设备

    • umask:设备/分区中文件/目录默认权限掩码

      • 权限掩码参见linux/kernel/file_system.md
    • dmask:设备/分区中目录默认权限掩码
    • fmask:设备/分区中普通文件默认权限掩码

    • nofail:设备不存在则直接忽略不报错

      • 常用于配置外部设备
    • defaults:默认配置,等价于 rw,suid,exec,auto,nouser,async

  • <dump>:决定是否dump备份

    • 1:dump对此文件系统做备份
    • 0:dump忽略此文件系统
    • 大部分用户没有安装dump,应该置0
  • <pass>:是否以fsck检查扇区,按数字递增依次检查(相同 则同时检查)

    • 0:不检验(如:swap分区、/proc文件系统)
    • 1:最先检验(一般根目录分区配置为1
    • 2:在1之后检验(其他分区配置为2
  • /etc/fstab是启动时配置文件,实际文件系统挂载是记录到 /etc/mtab/proc/mounts两个文件中

  • 根目录/必须挂载,必须先于其他的挂载点挂载

文件系统配置

Ext 配置文件

  • /etc/mke2fs.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[defaults]
base_features = sparse_super,large_file,filetype,resize_inode,dir_index,ext_attr
default_mntopts = acl,user_xattr
enable_periodic_fsck = 0
blocksize = 4096 # 块大小
inode_size = 256 # Inode 大小
inode_ratio = 16384 # 分配 Inode 号间隔

[fs_types]
ext3 = {
features = has_journal
}
ext4 = {
features = has_journal,extent,huge_file,flex_bg,metadata_csum,64bit,dir_nlink,extra_isize
inode_size = 256
}

[options]
fname_encoding = utf8

Linux 文件系统命令

文件系统状态

dudf

目录、文件操作

pwd

pwd:显示当前工作目录绝对路径

cd

cd:更改工作目录路径

  • 缺省回到用户目录
  • -:回到上个目录

ls

1
$ ls [params] expr

列出当前工作目录目录、文件信息

参数

  • -a:列出所有文件,包括隐藏文件
  • -l:文件详细信息
    • 详细信息格式、含义参见config_file
  • -t:按最后修改时间排序
  • -S:按文件大小排序
  • -r:反向排序
  • -h:显示文件大小时增加可读性
  • -F:添加描述符到条目后
    • @:符号链接
    • *:文件
    • /:目录
  • -i:显示索引节点

输出结果

ls_results.png

  • 文件权限:包括10个字符

    • 第1字符:文件类型
      • -;普通文件
      • d:目录
      • l:link,符号链接
      • s:socket
      • b:block,块设备
      • c:charactor,字符设备(流)
      • p:FIFO Pipe
    • 第2-4字符:owner,文件属主权限
    • 第5-7字符:group,同组用户权限
    • 第8-10字符:other,其他用户权限
      • 权限分别为r读、w写、x执行
      • 相应位置为-表示没有此权限
    • 执行位还可能是其他特殊字符
      • users:文件set-user-id、执行权限同时被置位
      • groups:文件set-group-id、执行权限同时被置位
      • userS:文件set-user-id被置位,执行权限未置位
      • groupS:文件set-group-id被置位,执行权限未置位
      • othert:文件sticky bit、执行权限均被置位
      • otherT:文件sticky bit被置位、执行权限未置位
    • 关于权限具体含义,参见linux/kernel/file_system
    • 权限设置,参见linux/shell/cmd_fds
  • 文件数量

    • 一般文件:硬链接数目
    • 目录:目录中第一级子目录个数
  • 文件属主名

  • 文件属主默认用户组名

  • 文件大小(Byte)

  • 最后修改时间

  • 文件名

dirs

显示目录列表

touch

创建空文件或更改文件时间

mkdir

创建目录

rmdir

删除空目录

cp

复制文件和目录

mv

移动、重命名文件、目录

rm

删除文件、目录

  • 删除目录link时,注意末尾不要带/,否则被认为是目录, 此时rm -r <target>会删除源目录中文件

file

查询文件的文件类型

du

显示目录、文件磁盘占用量(文件系统数据库情况)

参数

  • -a/--all:显示所有后代各文件、文件夹大小
    • 否则默认为显示所有后代文件夹大小
  • -c/--total:额外显示总和
  • -s/--summarize:仅显示总和
  • --max-depth=[num]:显示文件夹的深度
  • -S/--separate-dirs:文件夹大小不包括子文件夹大小

  • -b/--bytes:以byte为单位

  • -k/--kilobytes:以KB为单位
  • -m/--megabytes:以MB为单位
  • -h:human-readable,提升可读性
  • -H/--si:同-h,但是单位换算以1000为进制

  • -x/--one-file-system:以最初处理的文件系统为准,忽略 其他遇到的文件系统

  • -L=/--dereference=:显示选项中指定的符号链接的源文件 大小
  • -D/--dereference-args:显示指定符号链接的源文件大小
  • -X=/--exclude-from=[file]:从文件中读取指定的目录、 文件
  • --exclude=[dir/file]:掠过指定目录、文件
  • -l/--count-links:重复计算hard-link

wc

统计文件行数、单词数、字节数、字符数

-    `-l, -w, -c`

tree

树状图逐级列出目录内容

cksum

显示文件CRC校验值、字节统计

mk5sum

显示、检查MD5(128bit)校验和

sum

为文件输出校验和及块计数

dirname

输出给出参数字符串中的目录名(不包括尾部/) ,如果参数中不带/输出.表示当前目录

basename

输出给出参数字符串中的文件、目录

ln

创建链接文件

stat

显示文件、文件系统状态

文件、目录权限、属性

chown

更改文件、目录的用户所有者、组群所有者

chgrp

更改文件、目录所属组

umask

显示、设置文件、目录创建默认权限掩码

getfacl

显示文件、目录ACL

setfacl

设置文件、目录ACL

chacl

更改文件、目录ACL

lsattr

查看文件、目录属性

chattr

更改文件、目录属性

umask

查看/设置权限掩码,默认0000

1
2
3
4
5
6
$ umask
# 数字形式返回当前权限掩码
$ umask -S
# 符号形式返回当前权限掩码
$ umask 0003
# 设置权限掩码为`0003`
  • 权限掩码参见linux/kernel/permissions

chmod

关于文件、目录权限参见config_files###文件描述

  • 普通用户只能修改user权限位
  • root用户可以修改任意用户、任意文件权限

参数

  • -R:对整个目录、子文件(目录)同时修改权限

操作

1
2
$ chmod [ugoa][+-=][rwxst] file
$ chmod xxxx file
  • ugoa:分别表示user、group、other、all权限位
  • +-=:表示增加、减少、设置权限
  • rwxst:表示5不同的权限

    • ST不是一种权限,只是一种特殊的状态
    • 设置状态时s时,是根据相应的x是否有确定s/S
    • 设置状态t同理
  • xxxx:每个8进制数表示一组权限,对应二进制表示相应权限 是否置位

    • 第1个数字:set-user-id、set-group-id、sticky bit
    • 后面3个数字分别表示user、group、other权限
    • 第1个数字位0时可以省略(常见)

示例

1
2
$ chmod u+s file1
$ chmod 7777 file1

磁盘

df

文件系统信息

fdisk

查看系统分区

mkfs

格式化分区

fsck

检查修复文件系统

mount

查看已挂载的文件系统、挂载分区

umount

卸载指定设备

free

查看系统内存、虚拟内存占用

Ext 文件系统

Ext 文件系统

Ext 文件系统结构

linux_file_system_ext_structure

Index Node

Index Node/Inode 索引节点:记录文件的元信息

  • 文件元信息

    • 文件大小
    • 访问权限
    • 创建时间
    • 修改时间
    • 数据块位置
  • Inode 是文件的唯一标识,和文件一一对应

    • 存储在磁盘中,占用磁盘空间,大小为 126B 整数倍
    • 通常会把索引节点加载到内存中,加速文件的访问
  • Inode 并未存储 Inode 号、文件名,而是存储在文件所在目录的数据块中

Inode

  • Inode 号在同一文件系统内部唯一,可以、且被用于确定、定位 Inode

    • 创建文件系统时,每个块组中起始 Inode 号、Inode Table 起始地址确定
      • Inode 号按分配比率(间隔字节数)预分配
      • 若系统中大文件较多,Inode 分配比率应较大,避免 Inode Table 占用过大空间
    • 根据 Inode 号、Inode 结构大小计算偏移即可查确定
  • Ext 预留部分 Inode 作特殊用途

    • 0:不存在,用于标识已删除文件
    • 1:虚拟文件系统,如:/proc/sys
    • 2:根目录
    • 3ACL 索引
    • 4ACL 数据
    • 5boot loader
    • 6:未删除的目录
    • 7Reserved GDT
    • 8:日志
    • 11:首个非预留 Inode 号,通常是 lost+found 目录
  • Inode 大小默认值在 /etc/mke2fs.conf 文件中指定
  • ls -i 可查看文件 Inode
  • find 可以使用 -inum 参数寻找指定 Inode 号文件

Inode 寻址

  • Ext2/3Inode 寻址混合直接查找、多级索引
  • Inode 中包含 15 个指针 i_block[0..14],分为 4 级

    • i_block[0..11]:直接寻址指针,直接指向数据块
    • i_block[12]:一级间接寻址指针,指向存储指针的块
    • i_block[13]:二级间接寻址指针
    • i_block[14]:三级间接寻址指针
  • 根据文件大小选择不同的寻址方法

    • 文件小于 12block 时,直接用直接寻址指针
    • 文件较大时则利用更高级别的间接寻址指针,多级索引
    • Ext2/3 对超大文件存取效率低下,需要核对指针过多

    linux_file_system_storage_ext

Inode 内容

  • 硬链接:指向 Inode(文件) 的 目录项

    • 此处文件、硬链接说明
      • 文件:Inode、相应数据块
      • 硬链接:目录文件中目录项
    • 硬链接是目录项
      • 同一个文件的多个硬链接应是仅文件名不同的目录项
      • Ext 文件系统中 Inode 号、文件名均在存储在目录项中即完美支持硬链接
  • 硬链接创建、删除

    • 创建硬链接会增加文件的硬链接数
      • 不能跨分区创建硬链接:不同分区 Inode 号会重复
      • 不能手动对目录文件创建硬链接:防止路径混乱,文件系统已经为目录创建硬链接
        • .:当前目录硬链接
        • ..:上级目录硬链接
      • 目录的硬链接数 = 2 + 一级子目录数
        • 父目录中目录项
        • 自身 . 目录项
        • 子目录中 .. 目录项
    • 删除文件实质上就是删除硬链接,文件的硬链接数量归 0 时才被真正删除
    • ls -l 中第二行即为文件的硬链接数(包含文件自身)
  • / 根目录是自引用的(唯一),即 .. 也指向自身
  • 符号链接 / 软链接:通过文件名的链接文件的 文件
    • 符号链接是文件
      • 文件内容可认为是指向的目标路径,这也决定温文件大小
      • 符号链接文件本身也可以有多个硬链接、符号链接
    • 一般不占用数据块,Inode 记录即可描述完成
      • 只有符号链接指向的目标路径过长(大于 60B)时才会分配数据块
    • 符号链接权限不重要,取决于最终目标文件
  • readlink 可以查看符号链接之

设备文件、FIFOSocket

  • 设备文件、FIFOSocket
    • 没有大小,不占用数据块,在 Inode 记录中即可描述完成
      • 主设备号:标识设备类型
      • 次设备号:标识同种设备类型的不同编号

Block Group

Block Group 块组:逻辑上对块分组,提高查询效率

  • 块组划分是文件系统创建的一部分

    • 一个磁盘分区包含多个块组
    • 块组是逻辑层面的划分,不会类似分区在磁盘上标记、划分
  • 每个块组包含多个元数据区、数据区

    • 元数据区:存储 BmapInode TableImap 等数据
    • 数据区:存储文件数据
  • 块组特点

    • 块组大小(包含块数)= 块 bit 数,即单个 block (作为)Bmap 能标记的块数量
      • 此大小包含元数据区(也需要 Bmap 标记是否被占用)
    • 块组设置的 Inode 数量、Inode Table 由系统决定

分区级 Block

  • 以下这些块不会出现在所有块组中,存储文件系统级别信息

Boot Block

  • Boot Block / Boot Sector:存放有 boot loader 的块

    • 特点
      • 位于分区的首个块
      • 占用 1024B
      • 只有装有系统的主分区、逻辑分区才有 Boot Block
    • Boot Block 在不同分区时称为
      • 主分区装有操作系统时:Volume Boot Records
      • 逻辑分区装有操作系统时:Extended Boot Records
  • MBR 会引导 VBR/EBR,开机启动时,首先加载 MBRboot loader

    • 单操作系统时,直接定位到所在分区的 Boot Block,加载此处的 boot loader
    • 多操作系统时,加载 MBRboot loader 后列出操作系统菜单,指向各分区的 boot block

    linux_file_system_ext_super_block_mbr

    • 通过 MBR 管理启动菜单方式已经被 Grub 取代

Super Block

  • Super Block:存储文件系统信息、属性元数据

    • 存储的信息包括
      • 块组的 block 数量、Inode 号数量
      • 文件系统本身的空闲 block 数量、Inode 数量
      • 文件系统本身的属性信息:时间戳、是否正常、自检时间
    • (首个)超级块的位置取决于块大小
      • 块大小为 1KB 时,引导块正好占用 1 个 block,则超级块号为 1
      • 块大小大于 1KB 时,超级块和引导块均位于 0 号块
  • 超级块对文件系统至关重要

    • 超级块丢失和损坏必然导致文件系统损坏
    • Ext2 只在 0、1 和 3、5、7 的幂次块组中保存超级块信息

      • 但文件系统只使用首个块组的超级块信息获取文件系统属性,除非损坏或丢失
      • 有些旧式文件系统将超级块备份至每个块组
  • df 命令读取文件系统的超级块,统计速度快

Group Descriptor Table

  • GDT 块组描述符表:存储块组的信息、属性元数据

    • Ext 每个块组使用 32B 描述,被称为块组描述符,所有块组描述符组成 GBT
      • GDT 和超级块同时出现在某些块组中
      • 默认也只会读取 0 号块组的中 GDT
  • Reserved GDT:保留作为 GDT 使用的块(扩容之后块组增加)

    • GDT、超级块同时出现,同时修改
  • GDTReserved GDT、超级块在某些块组同时出现,能提升维护效率

块组级 Block

Block Bitmap

Block Bitmap/Bmap 块位图:标记各块空闲状态

  • Bmap 只优化写效率
    • 向磁盘写数据时才需要寻找空闲块,读数据时按照索引读取即可
    • Bamp 查询速度足够快,则向磁盘写数据效率极大取决于磁盘的随机读写效率

Inode Table

  • Inode Table:物理上将多个 Inode 合并存储在块中
    • Inode 大小一般小于块大小,合并存储能节约存储空间

Inode Bitmap

Inode Bitmap/Imap 位图:标记各 Inode 号占用状态

Data Blocks

  • Data Blocks:直接存储数据的块
    • 数据占用的块由文件对应 Inode 记录中块指针找到
    • 不同类型文件在数据块中存储的内容不同
      • 常规文件:存储文件数据
      • 目录:存储目录下文件、一级子目录
      • 符号链接:目标路径名较短则直接存储在 Inode 中,否则分配数据块保存

目录文件数据块

linux_file_system_ext_data_block_directory

  • 目录文件数据块存储多条目录项,每条目录项包含目录下
    • 文件 Inode
    • 目录项长度 rec_len
    • 文件名长度 name_len
    • 文件类型
      • 0:未知
      • 1:普通文件
      • 2:目录
      • 3:*character devicev
      • 4block device
      • 5:命名管道
      • 6socket
      • 7:符号链接
    • 文件名:文件名、一级子目录名、...

Directory Entry

Directory Entry/Dentry 目录项(缓存):存放内存中的缩略版磁盘文件系统目录树结构

  • Dentry 中需要记录

    • 文件名称
    • Inode 指针:与文件名建立映射关系
    • 与其他目录项的层级关联关系
      • 包括:父目录、子目录链表
      • 多个目录项通过指针关联起来就形成目录结构
  • Dentry 是由内核维护,缓存在内存中

    • 内核会把读过的文件用 Dentry 缓存在内存中,提高文件系统效率
  • InodeDentry 是一对多的关系

    • 即一个文件可以有多个别字
    • 硬链接实现就是多个 Dentry 中的 Inode 指向同一个文件

文件系统挂载

  • Mount 挂载:将文件系统关联到路径

  • 文件系统必须要挂载在一定路径下才能被使用

    • 文件系统体现在系统中即目录,即其文件系统的入口目录(根目录)
    • 而入口目录无名、无显式 Inode
      • Ext 中文件名、Inode 号存储在父目录中,入口目录是文件系统最底层目录,不存在父目录
      • 入口目录无名,所以挂载在任何目录下都是合理的
      • 入口目录被预留 Inode 号为 2,可直接寻址
  • 挂载方式

    • / 根目录下挂载根文件系统,在系统启动之初即挂载
    • 其余文件系统则挂载在根文件系统的目录之下

挂载逻辑

  • 挂载实现逻辑

    • 新建 Inode,将其寻址指针指向待挂载文件系统
    • 将挂载点目录 Inode 标记为不可用
    • 修改挂载点目录在其父目录目录项至新建 Inode
      • 挂载期间原目录会被遮蔽
      • 挂载点仍然是所在文件系统的文件,但是其数据不在
  • 同步挂载信息

    • 挂载完成后,将挂载记录、相关信息写入 /proc/self/{mounts, mountstats, mountinfo}
    • 同步 /proc/self/mounts 同步至 /etc/mtab(若有必要)

文件操作

文件读取

  • / 文件系统在系统启动时即挂载,此时已经读取超级块、GDT 等文件系统块
  • 同文件系统内 / 开头绝对地址

    • 根据 GDT 确定各块组 Inode Table 块号
    • Inode Table 中查找 / 目录文件 Inode
      • / Inode 号已知为预留 Inode 号 2,可直接在 Inode Table 中定位
    • 获取 / 数据块,并读取其中目录项
    • 在目录项中查找目标记录,获取文件 Inode
    • 如上重复,直到找到目标文件 Inode,根据 i_block 寻址指针读取数据块
  • 相对地址

    • 按照所处目录的目录项获取 Inode 号,同绝对地址即可
  • 跨文件系统地址

    • 类似同文件系统
    • 但挂载点目录会指向目标文件系统入口目录,再同绝对地址即可

文件删除

  • 删除普通文件

    • 同读取找到文件 Inode、数据块
      • 将文件 Inode 硬链接数量减一
      • 若硬链接数量归 0,执行删除,否则不变
    • Inode 中寻址指针删除
      • 此时即无法找到文件数据
    • Imap 中标记文件 Inode 号为未使用
    • 删除文件所属目录的目录项
      • 实务中会将目录项 Inode 号标记为 0,避免产生空洞
      • 此时文件即不可见
    • Bmap 中文件数据块块号标记为未使用
      • 此时即释放文件占用空间,若此时有其他进程持有数据块的指针,则文件系统不会立即释放该空间
      • Ext 系统中此步骤会导致删除大文件效率低
  • 删除目录文件

    • 若目录非空,则尝试递归删除其中文件、子目录
    • 若目录为空,类似普通文件删除目录

文件移动、重命名

  • 同目录文件重命名:修改文件所属目录的目录项中文件名

  • 同文件系统下移动:增、删目录项

    • 文件移动不修改 InodeInode 号等
  • 不同文件系统下移动:先复制、再删除

  • 命名冲突时,覆盖会删除冲突文件,并修改相应目录项至新文件
  • 因此,Ext 无法用同名子目录覆盖父目录,在尝试删除父目录时即失败

文件存储、复制

  • 文件存储

    • 读取 GDT,寻找空闲块组
    • 根据块组 Imap 为文件分配未使用 Inode
    • Inode Table 中完善 Inode 中文件元数据
    • 在所属目录中添加目录项
    • 将数据写入数据块
      • Ext2/3 中每次调用 block 分配器为数据分配 1 个数据块,直至写入完毕
      • Ext4 中允许一次分配多个数据块
    • Inode Table 中更新 Inode 寻址指针
  • 文件复制同文件存储

Ext2/3/4 迭代

  • Ext 文件系统特点
    • 在创建时即划分好,方便使用时分配
      • 不支持动态划分、分配
      • 格式化超大磁盘时较慢

Ext3 日志功能

  • Ext2 中只有两个区:元数据区、数据区

    • 从数据块中写入数据的中断中恢复检查一致性需要大量时间,甚至失败
  • Ext3 增加日志区

    • 在向数据块中写入数据前会在日志区标记
    • 则根据日志区的标记即可判断操作完成情况,提高一致性确认效率

Ext4 段分配

  • Ext2/3

    • Bmap 标记、分配块能提高效率,但扫描 Bmap 效率仍很低
    • 多级索引寻址效率低
  • Ext4 中使用 extent 管理数据块

    • extent 尽可能包含物理上连续的块
    • Inode 中使用 4 个 extent 片段流替代多级索引指针
      • 每个 extent 片段流设定起始块号、块数量
      • extent 指向的块保存数据或索引指针
    • 支持调用一次 block 分配器分配多个块,并标记对应 Bmap

    linux_file_system_ext4_extent_structure

  • Ext 删除数据

    • 会依次释放 Bmap 位、更新目录结构、释放 Inode 空间

统计推断

Likelihood

似然函数:表示统计模型参数中似然性的(参数的)函数

  • $Y$:观测所得结果,事件 $Y$
  • $W$:模型参数
  • $\alpha$:正常量
  • 似然函数可以理解为 条件概率的逆反

    • 似然:在已知某些观测所得结果上,对有关事物性质的参数进行估计
      • 似然性:某个参数为特定值的可能性
      • 单独查看某个似然值无价值,要将各种似然值一起比较
    • 概率:在已知某些参数上,预测之后观测所得到结果
  • 形式上,似然函数也是条件概率函数,但关注统计模型中参数

    • 似然函数不满足归一性,乘正常数仍然是似然函数
    • 同一似然函数代表的模型中,某个参数具有多种可能,如果存在参数使得似然函数值最大,则该值为最合理的参数值
      • 假设不同模型(经验得到),选择不同的统计模型
      • 则有不同的概率密度(分布)函数,得到不同的似然函数

应用

  • 最大似然估计:选取似然函数,整理之后求最大值点

    • 实际中一般选取似然函数对数作为求解对象,结果同直接求似然函数最大值点
    • 似然函数最大值点不一定唯一,也不一定存在
    • 相较于矩估计
      • 精度较高,信息损失少
      • 计算量大
  • 似然比检验:利用似然函数检测假设、限制是否有效

    • 将加入某个限制的复杂某些的似然函数最大值和简单模型的似然函数最大值比较,检测某个参数限制是否正确
      • 若参数限制正确,则不应造成似然函数最大值的大幅变动
    • 尼曼-尼尔森引理 说明:似然比检验是所有具有同等显著性差异的检验中,最有统计效力的检验

条件概率分布似然函数

  • $P$:(所选择)统计模型的概率分布函数
  • $\tilde P$:$X,Y$ 的实际分布
  • $X,Y$:离散随机变量,$X$ 自变量观察值、$Y$ 因变量观察值
  • $W$:条件概率分布 $P$ 的参数
  • $N$,$N_{x,y}$:样本数量,取值为 $x,y$ 的样本数量
  • 这里是条件概率分布的似然函数,用 $(X,Y)$ 联合分布同样

    • 考虑 $W$ 是条件分布参数,与 $X$ 分布无关,有 $P(X|W) = P(X)$
    • 再考虑似然函数乘正常数不改变性质,则结果同上
  • 对数似然函数中,样本量 $N$ 可省略

统计量

统计量

统计量:统计理论中对数据进行分析、检验的变量

  • 传统的统计量具有显式解析表达式

    • 均值:数据之和除数量
    • 中位数:数据中间者
  • 统计量同样可以理解为和数据相关优化问题的解

    • 均值:离差平方和最小
    • 中位数:划分均匀
    • 优化问题目标本身也是统计量

统计量 - 衍生特征

Odds/Odds Ratio

  • Odds:几率/优势,事件发生与不发生的概率比值

    • $p$:事件发生概率
  • Odds Ratio:优势比,两组事件 odds 的比值

WOE

WOE 值:将预测变量(二分类场景中)集中度作为分类变量编码的数值

  • $\%B_i, \%G_i$:分类变量取第 $i$ 值时,预测变量为 B 类、G 类占所有 B 类、G 类比例
  • $#B_i, #B_T$:分类变量取第 $i$ 值时预测变量为 B 类数量,所有 B 类总数量
  • $#G_i, #G_T$:分类变量取第 $i$ 值时预测变量为 G 类数量,所有 G 类样本总数量
  • $odds_i$:分类变量取第 $i$ 值时,预测变量取 B 类优势
  • $odds_T$:所有样本中,预测变量取 B 类优势
  • 其中 $log$ 一般取自然对数
  • WOE 编码是有监督的编码方式,可以衡量分类变量各取值中

    • B 类占所有 B 类样本比例、G 类占所有 G 类样本比例的差异
    • B 类、G 类比例,与所有样本中 B 类、G 类比例的差异
  • WOE 编码值能体现分类变量取值的预测能力,变量各取值 WOE 值方差越大,变量预测能力越强

    • WOE 越大,表明该取值对应的取 B 类可能性越大
    • WOE 越小,表明该取值对应的取 G 类可能性越大
    • WOE 接近 0,表明该取值预测能力弱,对应取 B 类、G 类可能性相近

OR与WOE线性性

  • 即:预测变量对数优势值与 WOE 值呈线性函数关系

    • 预测变量在取 $i,j$ 值情况下,预测变量优势之差为取 $i,j$ 值的 WOE 值之差
    • WOE 值编码时,分类变量在不同取值间跳转时类似于线性回归中数值型变量

    woe_encoding_linear_sketch

  • 考虑到对数优势的数学形式,单变量 LR 模型中分类型变量 WOE 值可以类似数值型变量直接入模

    • 当然,WOE 值编码在多元 LR 中无法保证单变量分类情况下的线性
    • 或者说多变量 LR 中个变量系数值不一定为 1
    • 在基于单变量预测能力优秀在多变量场合也优秀的假设下,WOE 值编码(IV 值)等单变量分析依然有价值

Bayes FactorWOE 编码、多元 LR

  • $\frac {P(x_i|Y=1)} {P(x_i|Y=0)}$:贝叶斯因子,常用于贝叶斯假设检验
  • Naive Bayes 中满足各特征 $X$ 关于 $Y$ 条件独立的强假设下,第二个等式成立

  • Semi-Naive Bayes 中放宽各特征关于 $Y$ 条件独立假设,使用权重体现变量相关性,此时则可以得到多元 LR 的预测变量取值对数 OR 形式

    • 则多元 LR 场景中,WOE 值可以从非完全条件独立的贝叶斯因子角度理解

IV

  • $IV_i$:特征 $i$ 取值 IV
  • $IV$:特征总体 IV
  • 特征总体的 IV 值实际上是其各个取值 IV 值的加权和
    • 类似交叉熵为各取值概率的加权和