Linux系统小记

修改环境变量

  • 可以通过 export var=value 在当前控制台修改,不会永久生效
  • 可以通过 以下文件 修改 ,添加 export var=value
============
/etc/profile
============
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.

===========
/etc/bashrc
===========
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

===============
~/.bash_profile
===============
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

=========
~/.bashrc
=========
该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.

==========
~/.profile
==========
在Debian中使用.profile文件代 替.bash_profile文件
.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代 替.bash_profile文件。

==============
~/.bash_logout
==============当每次退出系统(退出bash shell)时,执行该文件

常用命令

  • 查找文件是否包含字符串
grep -rn "string" /path/to/search
  • 查找文件名
find /path/to/search -name "string"
  • 查看磁盘信息
df -h
  • 查看文件夹大小(前者仅仅查看目录,后者查看目录以及所有子项)
du -sh /path/to/look
du -h /patt/to/look
  • 查看 tcp 网络
netstat -atlnp

查看相关信息

-查看CPU型号

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
  • 查看物理CPU的个数
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
  • 查看逻辑CPU的个数
cat /proc/cpuinfo |grep "processor"|wc -l
  • 查看每个CPU中core的个数(即核数)
cat /proc/cpuinfo |grep "cores"|uniq
  • 查看操作系统内核信息
uname -a
  • 查看CPU运行在32bit还是64bit模式
getconf LONG_BIT
  • 查看内存总量
grep MemTotal /proc/meminfo  
  • 查看空闲内存总量
grep MemFree /proc/meminfo
  • 查看cpu信息
top/htop/dstat
  • 查看网卡信息
watch -n 1 "/sbin/ifconfig eth0 | grep bytes"

常见信息

系统日志一般位于 /var/log 中,

  • 内核日志: /var/log/dmesg_all, /var/log/dmesg
  • 系统日志: /var/log/messages,部分系统 会写入 /var/adm/messages

你也可以使用 dmesg 命令来读取内核 ring buffer 中的内容,它会在下次启动前输出到 /var/log/dmesg 中,因此 dmesg 命令更实用 参考:Difference between output of dmesg and content of /var/log/dmesg?

虚拟内存

进程在操作内存时并不是直接操作物理内存,而是操作系统给进程模拟的 虚拟内存,使用这种技术有几个优点:

  • 避免竞争:进程不需要考虑与其他进程的竞争问题
  • 内存完整性:进程看到的内存都是完整而连续的
  • 安全性:操作系统可以通过内存页来控制内存的可访问性
  • 数据共享:可以让不同虚拟内存映射到相同物理内存上来实现内存共享

参考linux内存管理

Tips: 这和 Windows上可以手动分配的 虚拟内存功能不同, windows 的 虚拟内存更像是 SWAP分区

内存页

我们知道数据存储在内存上时最终都换转换为字节存储,它是内存存储的最小单元,在 32 位 系统下能支撑的内存大小为 2^32Byte = 4GB。 如果虚拟内存在为进程映射时为每一字节都建立映射关系,在 32 位系统下至少需要 (4 + 4) * 2^32 Byte = 32GB 的空间来存储映射数据,显然是不合理,所以提出了 内存页 来做映射关系。 Linux 在分配物理内存时,以页位单位分配,寻址时通过 页索引 + 偏移量 来映射,通常内存页大小在 4K (i386体系)

SWAP分区

在物理内存完全使用完毕后,系统还可以通过将部分内存页(这部分数据来自一些很久没访问过的进程)转储到磁盘,让需要内存的进程先使用,等待进程需要再次访问这些数据时再交换回来。

日志分析

linux 系统下的日志基本都在 /var/log/ 目录下,有系统写的,也有服务写。最常用的就是 /var/log/messages(系统日志), /var/log/dmesg(内核日志),日志目录下的各类日志都是很多通过 syslog 的进程来产生。 systemd 所维护的程序日志可以通过 journalctl -u xxxx 指令来查看,比如查看 kubelet 的日志:journalctl -u kubelet,日志根据配置

/etc/systemd/journald.conf
/etc/systemd/journald.conf.d/*.conf
/run/systemd/journald.conf.d/*.conf
/usr/lib/systemd/journald.conf.d/*.conf

可能会存在不同地方,默认在 /var/log/journal or /run/log/journal,它并不会持久化,在下一次程序启动后就会丢失。

查看 unix socket 的peer

下面的命令可以查看所有的UDS

ss -a --unix

程序coredump

Core Dump 又叫核心转储。在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dump。Core是指记忆体也就是现在的内存。 可以使用

# 查看限制
ulimit -a

# 打开coredump限制
ulimit -c unlimited

# 查看路径和格式, 不存在的话默认写到程序所在目ls
# 如果开头为 | 则把剩余部分视为一个程序,将coredump文件作为标准输入调用
# 参考ttps://stackoverflow.com/questions/47765202/what-does-mean-in-file-proc-sys-kernel-core-pattern
cat /proc/sys/kernel/core_pattern

# 控制core文件名是否包含pid,默认为0
cat /proc/sys/kernel/core_uses_pid

# 分析coredump文件,在gdp中使用 where or bt 来查看崩溃时的信息
#2  `p $_siginfo` 可以查看具体的 signal information
#3  `x/i $pc` 查看core执行的汇编指令
#4  `i r` 查看寄存器值
gdb -c [core_file] [bin] 

注意分析coredump文件时可能出现问号,这是由于编译时没有带上符号链接所导致(-g)。不过带上符号链接也有几个风险:

  1. 体积会增大很多
  2. 会泄漏源码(反编译)

因此如果程序运行在不安全的环境,最好是编译额外的map文件来配合分析调查。

调查命令

如果需要查询pipe对端的进程,使用以下命令:

(find /proc -type l | xargs ls -l | fgrep 'pipe:[20043922]') 2>/dev/null