profile相关
- bashrc是在系统启动后就会自动运行。
- profile是在用户登录后才会运行。
- 进行设置后,可运用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 运行顺序
- 读取 /etc/inittab, 获取配置(系统的 runlevel 等)
- /etc/rc.d/rc.sysinit
- /etc/rc.d/rc 和 /etc/rc.d/rcX.d/ (X 代表运行级别 0-6)
- /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 |
这种方法有两个缺点。
- 一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
Systemd 就是为了解决这些问题而诞生的。它的设计目标是为系统的启动和管理提供一套完整的解决方案。
systemd
Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。
- systemctl是 Systemd 的主命令,用于管理系统。
- systemd-analyze命令用于查看启动耗时。
- …
@ref:
systemctl 命令
systemctl
是 Systemd 的主命令,用于管理系统。//区别 sysctl
命令,用于修改 Kernel参数
重启系统 |
Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。相关命令:
列出正在运行的 Unit |
启动、重启、停止Unit:
立即启动一个服务 |
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 |
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]]