/proc 有用的例子
为了保护服务器免受 SYN 洪水攻击(SYN flood attack),我们可以使用 iptables 来阻止 SYN 数据包。
更好的解决方案是使用 SYN cookie。
内核中的一种特殊方法,用于跟踪来自哪些 SYN 数据包。
如果 SYN 数据包在合理的时间间隔内没有移动到已建立的状态,内核将丢弃它们。
$ sysctl -w net.ipv4.tcp_syncookies=1
并坚持更改。
$ echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
另一个有用的例子是/proc/sys/fs/file-max,这个值显示了可以同时打开的最大文件数(包括套接字、文件等)。
我们可以像这样增加这个数字:
$ sysctl -w "fs.file-max=96992" $ echo "fs.file-max = 96992" >> /etc/sysctl.conf
/proc 文件系统
proc文件系统是系统挂载在/proc目录下的一个虚拟文件系统。
/proc 上不存在真正的文件系统;它是一个虚拟层,可用于处理内核功能。
例如,要获取处理器规格,执行以下命令:
$ cat /proc/cpuinfo
这是查询 Linux 内核的一种引人注目且简单的方法。
请注意,如果我们检查 /proc 目录中的文件大小,我们会发现所有文件大小都是 0,因为正如我们所说,它们在磁盘上不存在。
当我们输入 cat /proc/cpuinfo 命令时,系统会动态创建一个文件来显示 CPU 信息。
/proc 目录中唯一具有大小的文件是 /proc/kcore 文件,它显示了 内存 内容。
此文件不占用磁盘上的任何空间。
持久化 /proc 文件更改
之前对 /proc/sys/net/ipv4/ip_forward 条目的修改在重新启动后将不存在,因为我们不是在写入文件,这是一个虚拟文件系统,这意味着内存会发生变化。
如果我们需要在 /proc 下保存更改,我们有两种方法:
- 我们可以在 /etc/rc.d/rc.local 文件中写入条目并使其可执行并启用 systemd 服务单元,该服务单元允许使用 rc.local 文件并写入条目。
- 我们可以使用 sysctl 命令更改 /proc/sys/ 目录中的条目。
$ sysctl net.ipv4.ip_forward
这将显示条目的值,要更改它,请使用 -w 选项:
$ sysctl -w net.ipv4.ip_forward=1
最后一步是将更改写入 /etc/sysctl.conf:
$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
在写入更改之前,请确保文件 /etc/sysctl.conf 不包含该条目。
列出/proc目录
如果你列出/proc目录下的文件,你会发现很多目录都有数字名称,这些目录包含有关正在运行的进程的信息,数字值是对应的进程ID。
我们可以从这些目录中查看特定进程消耗的资源。
如果你看一下名为 1 的文件夹,它属于 init 进程或者 systemd(如 CentOS 7),它是 Linux 启动时运行的第一个进程。
$ ls -l /proc/1
在其他Linux系统中,使用 init 二进制文件:
/sbin/init
常见的 /proc 条目
这些是一些常见的 /proc 条目:
/proc/cpuinfo | 有关系统中CPU的信息。 |
/proc/meminfo | 内存使用情况的信息。 |
/proc/ioports | 用于I / O与设备通信的端口区域列表。 |
/proc/mdstat | 显示RAID磁盘配置的状态。 |
/proc/kcore | 显示实际的系统内存。 |
/proc/modules | 显示一个内核加载模块的列表。 |
/proc/cmdline | 显示传递的引导参数。 |
/proc/swaps | 显示交换分区的状态。 |
/proc/iomem | 每个物理设备的系统存储器的当前映射。 |
/proc/version | 显示内核版本和编译时间。 |
/proc/net/dev | 显示有关数据包计数等每个网络设备的信息。 |
/proc/net/sockstat | 显示网络套接字利用率的统计信息。 |
/proc/sys/net/ipv4/ip_local_port_range | 显示Linux使用的端口范围。 |
/proc/sys/net/ipv4/tcp_ syncookies | 防止SYN泛滥攻击。 |
Linux tmpfs 虚拟文件系统
tmpfs 是一个 Linux 虚拟文件系统,它将数据保存在系统虚拟内存中。
它与任何其他虚拟文件系统相同;任何文件都临时存储在内核的内部缓存中。
我们可以使用 /tmp 文件系统作为临时文件的存储位置。
/tmp 文件系统由基于磁盘的实际存储支持,而不是由虚拟系统支持。
我们在 Linux 安装期间选择此位置。
/tmp 由 systemd 服务在引导系统时自动创建。
我们可以使用 mount 命令设置具有所需大小的 tmpfs 样式文件系统。
$ mount it tmpfs -o size=2GB tmpfs /home/myfolder
sysfs 虚拟文件系统
sysfs 是一个 Linux 虚拟文件系统,这意味着它也在内存中。
我们可以在 /sys 找到 sysfs 文件系统。
sysfs 可用于获取有关系统硬件的信息。
$ ls -l /sys
从上面命令的结果来看,文件大小都为零,因为我们知道这是一个 Linux 虚拟文件系统。
/sys 的顶级目录包含以下内容:
Block | 在SDA等系统上检测到的块设备列表。 |
Bus | 包含在内核中检测到的物理总线的子目录。 |
class | 描述音频,网络或者打印机等设备类。 |
Devices | 列出在内核注册的物理总线的所有检测到的设备。 |
Module | 列出所有加载的模块。 |
Power | 设备的电源状态。 |
写入 proc 文件
正如我们所见,我们可以读取 proc 文件的内容,但其中一些是可写的,因此我们可以写入它们以更改某些功能。
例如,如果我们有多个网卡,则此 /proc/sys/net/ipv4/ip_forward 文件控制 IP 转发。
我们可以像这样更改此文件的值:
$ echo "1" > /proc/sys/net/ipv4/ip_forward
Linux 虚拟文件系统或者虚拟文件系统通常是位于实际文件系统顶部的一层。
它允许用户访问不同类型的文件系统,我们可以将虚拟文件系统视为内核与实际文件系统之间的接口。
这意味着我们不会在 /etc/fstab 文件中找到这些 Linux 虚拟文件系统的任何条目。
但是,当我们键入 mount 命令时,我们仍然会找到它们。
如果我们熟悉 Windows,则虚拟文件系统有点像 Windows 中的注册表。