Linux.05::系统配置

profile相关

  1. bashrc是在系统启动后就会自动运行。
  2. profile是在用户登录后才会运行。
  3. 进行设置后,可运用source bashrc命令更新bashrc,也可运用source profile命令更新profile。
  • /etc/profile: 中设定的变量(全局)的可以作用于任何用户
  • ~/.bashrc: 等中设定的变量(局部)只能继承/etc/profile中的变量
  • ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

init系统

init进程是 Linux系统内核初始化最后一步启动的进程,也是系统的第一个进程,pid=1。

运行级别(Runlevel)指的是Unix或者Linux等类Unix操作系统下不同的运行模式。运行级别通常分为7等,分别是从0到6,但如果必要的话也可以更多。
例如在大多数Linux操作系统下一共有如下7个典型的运行级别:

0 停机,关机
1 单用户,无网络连接,不运行守护进程,不允许非超级用户登录
2 多用户,无网络连接,不运行守护进程
3 多用户,正常启动系统
4 用户自定义
5 多用户,带图形界面
6 重启

除了模式 0,1,6外, 每种 Unix 和 Unix-like 系统对运行模式的定义不太一样。通常在 /etc/inittab 文件中定义了各种运行模式的工作范围。
当前绝大多数Linux发行版已经基于新的systemd,systemd一般不再使用/etc/inittab文件。

init,sysvinit 和 systemd

大多数 Linux 发行版的 init 系统是和 System V 相兼容的,被称为 sysvinit。这是人们最熟悉的 init 系统。
Ubuntu 采用 upstart 替代了传统的 sysvinit,
RHEL 采用 systemd替代 sysvinit。

关于 System V,参考 [[APUE.00.从Unix到Linux]]

sysvinit

本节参考:

sysvinit 运行顺序

  1. 读取 /etc/inittab, 获取配置(系统的 runlevel 等)
  2. /etc/rc.d/rc.sysinit
  3. /etc/rc.d/rc 和 /etc/rc.d/rcX.d/ (X 代表运行级别 0-6)
  4. /etc/rc.d/rc.local

sysvinit 管理功能

sysvinit 软件包包含了一系列的控制启动、运行和关闭所有其他程序的工具:

  • init: 这个就是 sysvinit 本身的 init 进程实体,以 pid1 身份运行,是所有用户进程的父进程。最主要的作用是在启动过程中使用/etc/inittab 文件创建进程。
  • halt: 停止系统
  • poweroff: 等于 shutdown -h –p
  • reboot: 等于 shutdown –r
  • killall: 向除自己的会话(session)进程之外的其它进程发出信号,所以不能杀死当前使用的 shell。
  • last: 回溯/var/log/wtmp 文件(或者-f 选项指定的文件),显示自从这个文件建立以来,所有用户的登录情况。
  • chkconfig: RHEL 在 sysvinit 的基础上开发的命令行工具
  • service: 同上

使用 sysvinit 启动一个服务:

$ /etc/init.d/apache2 start
# 或者
$ service apache2 start

这种方法有两个缺点。

  • 一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 就是为了解决这些问题而诞生的。它的设计目标是为系统的启动和管理提供一套完整的解决方案。

systemd

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

  • systemctl是 Systemd 的主命令,用于管理系统。
  • systemd-analyze命令用于查看启动耗时。

@ref:

systemctl 命令

systemctl是 Systemd 的主命令,用于管理系统。//区别 sysctl 命令,用于修改 Kernel参数

# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。相关命令:

# 列出正在运行的 Unit
$ systemctl list-units

# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

启动、重启、停止Unit:

# 立即启动一个服务
$ sudo systemctl start example.service

# 立即停止一个服务
$ sudo systemctl stop example.service

# 重启一个服务
$ sudo systemctl restart example.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill example.service

Example: How to 新加一个 Service(Systemd Unit):

vim /etc/systemd/system/ngx-example.service

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。

Description=proxy-nginx
After=network.target

[Service]
Type=forking
PIDFile=/data0/www/logs/nginx.pid

# 启动进程时执行的命令
ExecStart=/usr/local/sbin/proxy-nginx -c /usr/local/etc/proxy-nginx.conf

# 重启服务时执行的命令
ExecReload=/usr/local/sbin/proxy-nginx -c /usr/local/etc/proxy-nginx.conf -s reload

# 停止服务时执行的命令
ExecStop=/usr/local/sbin/proxy-nginx -c /usr/local/etc/proxy-nginx.conf -s stop
PrivateTmp=True

[Install]
WantedBy=multi-user.target

journald 日志系统

本节参考:

Systemd 使用 journald 做日志服务,使用 rsyslog 来持久化日志,使用 logrotate 来轮转日志文件。
Systemd日志收集流程: systemd --> systemd-journald --> ram DB(/run/log/journal) --> rsyslog -> /var/log/messages;
对比 init日志收集: service daemon ---> rsyslog ---> /var/log

journalctl

journald用二进制格式保存所有日志信息,用户使用 journalctl 命令来查看日志信息。
配置文件位置: cat /etc/systemd/journald.conf

使用journalctl命令查看日志:

  • journalctl: 显示所有的日志信息,notice或warning以粗体显示,红色显示error级别以上的信息
  • journalctl –dmesg: 查看 dmesg 信息。
  • journalctl -k: 查看 kernel 日志。
  • journalctl -f: 很像tailf命令
  • journalctl –since=yesterday: 指定时间段
  • journalctl -u docker.service: 指定服务,查看docker服务的 journal 日志。查看所有service列表使用命令 systemctl list-units
  • journalctl _PID=8088: 查看指定pid的
  • journalctl _UID=33: 查看指定用户的
  • journalctl /usr/bin/bash: 查看某个路径的脚本的日志
  • journalctl –verify: 检查日志文件的一致性

例如,docker daemon会配置为将所有容器的日志为存储到 journald。
/usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journald
所以,运行中 docker的日志,例如 k8s的 apiserver都会打到 journald日志里去(最终输出到 /var/log/messages)

rsyslog

rsyslog用来固化journald日志。rsyslog读取 ram DB(/run/log/journal)的数据,并根据优先级排列日志信息,将它们写入到 /var/log目录中永久保存。

默认 journald配置#ForwardToSyslog=no,所以并未将日志转发给syslog。syslog自己去读取的 journald的日志文件(类似journalctl)。

logrotate

rsyslog的日志存储于/var/log下,显然日志文件不能无限变大,否则磁盘空间会被耗尽。RHEL7使用logrotate来做日志文件轮转。
配置文件位置: cat /etc/cron.daily/logrotate

用户组

几个常见的用户组: adm/daemon/bin :

  • root:超级用户, 就是管理员, 拥有所有权限
  • bin:历史遗留用户
  • daemon:守护进程, 非特权的, 需要对一些以磁盘文件有写权限的daemon以daemon.daemon(portmap,atd,etc)运行;不需要占有任何文件的daemon 以nobody.nogroup运行;比较复杂的, 涉及安全问题的daemon以特定的用户运行. daemon用户也方便本地安装的daemon运行.
  • adm:adm组执行系统监控任务, 组成员可以读取/var/log下的多数文件, 可以使用xconsole. 历史上/var/log来自于/usr/adm, 后来叫/var/adm, 这也是组名称的由来.
  • apache/_www: 用root启动httpd服务, apache的子进程还是用apache(或者_www用户)运行的, 可以通过修改/etc/httpd/conf/httpd.conf指定apache运行的用户组.

用户组常用命令

  • usermod -a -G daemon XYZ 将用户XYZ加入一个组
  • id , whoami :
  • who :
  • useradd, userdel

权限相关

  • /etc/sudoers
  • /etc/hosts.allow: 限制SSH的客户端IP, /etc/hosts.allow 的设定优先于 /etc/hosts.deny
  • /etc/hosts.deny: 限制SSH的客户端IP

文件权限

  • chmod 400 ~/.ssh/authorized_keys

网络相关

  • /etc/resolv.conf: 这个文件是用于配置DNS服务器的, 扩展阅读: Ubuntu使用dnsmasq作本地DNS缓存

    nameserver 8.8.8.8
  • /etc/hosts: 设置主机名和IP地址绑定

  • /etc/hostname: 主机名配置
  • /etc/sysconfig/network: 主机名和网关
    NETWORK=yes    #网络是否被配置
    RORWARD_IPV4=yes #是否开启IP转发功能
    HOSTNAME= localhost.localdomain #表示服务器的主机名
    GAREWAY=192.168.0.1 #表示网络网关的IP地址
    GATEWAYDEV=eth0 #网关的设备名,即选择使用哪个网卡

crontab

* * * * * * cmd, 分别表示每分/时/每月第几日/月/周几(0~6)

  • 每5分钟: */5 * * * *
  • 每小时: 0 * * * *
  • 每天早上6点10分 10 6 * * *
  • 晚上11点到早上8点之间每两个小时, 和早上8点: 0 23-7/2, 8 * * *

每个用户的crontab文件在 /var/spool/cron/

终端Terminal

  • Ctrl+r搜索, 输入, 按Ctrl+r继续搜索
  • Ctrl+a / Ctrl+e : 移动光标开头/末尾m

tty/pst/pty

性能 & 并发相关

@link:: [[../31.Backend/SystemDesign-02-C100K]]