内核
内存管理 进程管理 设备驱动程序 系统调用和安全防护
设置进程限制
ulimit
格式
ulimit [-SHaAcdfMnst] [num]
描述
ulimit 设置或显示用户创建的进程的资源限制。
选项
-S 设置或显示软限制。可以将软限制修改为小于或等于硬限制的任何值。对于某些资源值,软限制不能设置为低于现有使用量。
-H 设置或显示硬限制。硬限制可以降低到任何大于或等于软限制的值。硬限制只能由具有超级用户权限的进程提高。
-a 显示所有可用的资源限制。
-A 设置或显示进程的最大地址空间大小,以 1024 字节为单位。如果超出限制,存储分配请求和自动堆栈增长将失败。尝试将地址空间大小限制设置为低于当前使用量或将软限制设置为高于现有硬限制将失败。
-C 设置或显示核心文件限制。核心文件限制是进程允许的内存转储的最大大小(以 512 字节块为单位)。值 0(零)阻止创建文件。转储文件创建将在此限制处停止。
-d 设置或显示数据大小限制。数据大小限制是进程中断值的最大大小,以 1024 字节为单位。此资源始终具有无限的硬限制和软限制。
-F 设置或显示文件大小限制。文件大小限制是进程允许的最大文件大小(以 512 字节块为单位)。值 0(零)阻止创建文件。如果超出大小,则向进程发送 SIGXFSZ 信号。如果进程阻塞、捕获或忽略 SIGXFSZ,继续尝试将文件大小增加到超出限制将失败。
-M 设置或显示允许进程分配和取消隐藏的 2 GB 以上的存储量,以兆字节为增量。尝试将存储大小限制设置为低于当前使用量或将软限制设置为高于现有硬限制将失败。
ulimit -M显示的存储量不一定反映在用户的 RACF® OMVS 段中找到的 MEMLIMIT 设置。显示的值取决于用户如何进入 OMVS shell 以及是否执行了身份更改。
-n 设置或显示文件描述符限制。文件描述符限制是进程允许的打开文件描述符的最大数量。这个数字比可以分配给新创建的描述符的最大值大一。任何尝试创建超出限制的新文件描述符的函数都将失败。尝试将打开文件描述符限制设置为低于已使用的限制将失败。
-s 设置或显示堆栈大小限制。堆栈大小限制是进程的最大堆栈大小,以 1024 字节为单位。堆栈是具有无限硬和软限制的每线程资源。
-t 设置或显示 CPU 时间限制。CPU 时间限制是进程允许的最大 CPU 时间量(以秒为单位)。如果超出限制,则会向进程发送一个 SIGXCPU 信号,并授予该进程一个小的 CPU 时间扩展,以允许信号生成和传递。如果扩展名已用完,则进程以 SIGKILL 信号终止。尝试将 CPU 限制设置为低于已使用的限制将失败。
num 新的限制。num可以指定为“无限”。
使用说明
- ulimit是一个内置的 shell 命令。它不能与 tcsh shell 一起使用。
- 如果由于尝试将资源限制设置为低于当前使用量或高于现有硬限制而导致命令失败,则生成的错误消息可能指示无效参数。
编译
本机信息
操作系统
uname -a #查看系统内核版本号及系统名称
uname --m #操作系统32位/64位
lsb_release -a #本机系统发行版本信息
Distributor ID:
Ubuntu 类别是ubuntuDescription:
Ubuntu 20.04.2 LTS 代表长时间支持版本Release:
20.04 发行版本号Codename:
focal 是 ubuntu的代号名称
系统内核
uname --s #内核名字
uname --r #内核版本
uname --n #网络主机名
uname --p #cpu
下载工具
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
准备内核
下载内核
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.5.9.tar.xz
解压内核
tar xf linux-5.5.9.tar.xz
进入解压后的内核文件夹中
cd linux-5.5.9
编译前言
编译
先简单说一下下载吧, 我是直接从 GitHub 上 Linux 的仓库直接下载的, 当然也可以去内核 的官方网站上下载, 这上面不仅有最新稳定版本的内核,一些 历史版本的内核也可以从这里下载到。 不仅如此, Linux 的内核仓库中其实还包含了大量 的文档, 可以选择自己编译出内核文档,也可以使用 在线文档。
NOTE: 在线的文档可能更方便一点, 自己编译的话要在自己电脑上安装一些工具啥的。
现在进入正题:
配置内核
Linux 内核的配置方法有很多, 下面这三种应该是目前使用比较广泛的三种方式:
make menuconfig # Update current config utilising a menu based program
make xconfig # Update current config utilising a Qt based front-end
make gconfig # Update current config utilising a GTK+ based front-end
这三个命令在配置时只需要用一个就可以了, 命令后面的注释说明了这三个命令的使用条件。 这里先介绍一下 make help
命令。 这条命令可以查看到内核编译时所有 Make 可用的目标 及介绍, 上面的注释便出自这里。 我之前配置时也只用过第一种方法,这次编译我的电脑也支持 后面两个命令的条件,所以在这里我也展示一下这三种配置方式的界面。
make xconfig
配置界面
make gconfig
的配置界面
使用哪种方式可以说取决于个人喜好了或者自己电脑所具备的条件了,毕竟他们最终的目的 都是生成名为 .config
的内核配置文件。 在配置具体功能时最多有三种选择:
- Y – 将该功能编译进内核
- N – 不要将该功能编译进内核
- M – 将该功能编译成模块
基本每个功能配置都会有对应的帮助说明, 非常的人性化。 需要注意的是这个步骤其实并 不是每次都必须的, 比如之前已经配置过了,或者从其他地方拷贝来了可用的配置文件, 这一步是完全可以跳过的。配置完成后就可以开始编译了。
编译内核
开始编译时直接使用 make
命令即可。 当然如果想加快编译的速度, 可以追加 -j
参 数。
make -j 4 # 同时运行 4 个作业,这里取值推荐为 2 倍的 CPU Core 数
make -j $(nproc) # 可以通过 nproc 命令得到可用处理单元的数量
编译模块
上面配置内核时说到有三种选择,配置时候选择 M
编译为模块的功能特性在这里可以用 下面的命令编译出来
make modules
至此,需要编译的代码都已经编译完成。
Linux 内核的 Makefile 还有很多目标
make modules_install #安装内核模块
make htmldocs #生成 html 格式的内核文档
..............
详细工具
环境
在认为您遇到错误之前,至少升级到这些软件版本!如果您不确定当前运行的是什么版本,建议的命令应该会告诉您。同样,请记住,此列表假定您已经在功能上运行 Linux 内核。此外,并非所有系统都需要所有工具。显然,如果您没有任何 PC 卡硬件,例如,您可能不需要关心 pcmciautils。
务必注意:您将需要至少 200GB 的本地可用磁盘空间来完成内核的编译过程。
程序 |
最低版本 |
检查版本的命令 |
---|---|---|
GNU C |
5.1 |
gcc -v |
Clang/LLVM (optional) |
11.0.0 |
clang –version |
GNU make |
3.81 |
make –version |
bash |
4.2 |
bash –version |
binutils |
2.23 |
ld -v |
flex |
2.5.35 |
flex –version |
bison |
2.0 |
bison –version |
pahole |
1.16 |
pahole –version |
util-linux |
2.10o |
fdformat –version |
kmod |
13 |
depmod -V |
e2fsprogs |
1.41.4 |
e2fsck -V |
jfsutils |
1.1.3 |
fsck.jfs -V |
reiserfsprogs |
3.6.3 |
reiserfsck -V |
xfsprogs |
2.6.0 |
xfs_db -V |
squashfs-tools |
4.0 |
mksquashfs -version |
btrfs-progs |
0.18 |
btrfsck |
pcmciautils |
004 |
pccardctl -V |
quota-tools |
3.09 |
quota -V |
PPP |
2.4.0 |
pppd –version |
nfs-utils |
1.0.5 |
showmount –version |
procps |
3.2.0 |
ps –version |
udev |
081 |
udevd –version |
grub |
0.93 |
grub –version || grub-install –version |
mcelog |
0.6 |
mcelog –version |
iptables |
1.4.2 |
iptables -V |
openssl & libcrypto |
1.0.0 |
openssl version |
bc |
1.06.95 |
bc –version |
Sphinx1 |
1.7 |
sphinx-build –version |
cpio |
any |
cpio –version |
- 仅在构建内核文档时才需要 Sphinx
内核编译
GCC
gcc 版本要求可能因计算机中 CPU 的类型而异。
Clang/LLVM (可选)
支持构建内核的最新正式版本的 clang 和 LLVM 实用程序(根据 release.llvm.org )。不保证旧版本可以正常工作,我们可能会从内核中删除用于支持旧版本的变通方法。请参阅有关使用 Clang/LLVM 构建 Linux 的其他文档。
Make 制作
您将需要 GNU make 3.81 或更高版本来构建内核。
Bash
一些 bash 脚本用于内核构建。需要 Bash 4.2 或更高版本。
Binutils 二进制工具
构建内核需要 Binutils 2.23 或更高版本。
pkg-config 包配置
从 4.18 开始,构建系统需要 pkg-config 来检查已安装的 kconfig 工具并确定在 ‘make {g,x}config’中使用的标志设置。以前 pkg-config 正在使用但未验证或记录。
Flex¶
从 Linux 4.16 开始,构建系统在构建期间会生成词法分析器。这需要 flex 2.5.35 或更高版本。
Bison
从 Linux 4.16 开始,构建系统在构建期间生成解析器。这需要 bison 2.0 或更高版本。
pahole
从 Linux 5.2 开始,如果选择了 CONFIG_DEBUG_INFO_BTF,则构建系统会从 vmlinux 中的 DWARF 生成 BTF(BPF 类型格式),稍后也会从内核模块生成 BTF(BPF 类型格式)。这需要 pahole v1.16 或更高版本。
它可以在 'dwarves' 或 'pahole' 发行包或 https://fedorapeople.org/~acme/dwarves/中找到。
Perl
您将需要 perl 5 和以下模块: Getopt::Long
, Getopt::Std
, File::Basename
, and File::Find
来构建内核。
BC
您将需要 bc 来构建内核 3.10 及更高版本
OpenSSL
模块签名和外部证书处理使用 OpenSSL 程序和加密库来创建密钥和生成签名。
如果启用了模块签名,您将需要 openssl 来构建 3.7 及更高版本的内核。您还需要 openssl 开发包来构建内核 4.3 及更高版本。
系统实用程序
架构变化
DevFS 已经过时,取而代之的是 udev ( https://www.kernel.org/pub/linux/utils/kernel/hotplug/ )
32 位 UID 支持现已到位。玩得开心!
函数的 Linux 文档正在通过靠近源代码定义的特殊格式的注释转换为内联文档。这些注释可以与文档/目录中的 ReST 文件相结合,以制作丰富的文档,然后可以将其转换为 PostScript、HTML、LaTex、ePUB 和 PDF 文件。为了从 ReST 格式转换为您选择的格式,您需要 Sphinx。
Util-linux 实用程序
新版本的 util-linuxfdisk
支持更大的磁盘,支持新的挂载选项,识别更多支持的分区类型,具有适用于 2.4 内核的 fdformat,以及类似的好东西。您可能想要升级。
Ksymoops 克西莫普斯
如果发生了不可想象的事情并且您的内核出现故障,您可能需要 ksymoops 工具对其进行解码,但在大多数情况下您不需要。通常首选构建内核,CONFIG_KALLSYMS
以便它生成可以按原样使用的可读转储(这也产生比 ksymoops 更好的输出)。如果由于某种原因您的内核没有构建,CONFIG_KALLSYMS
并且您无法使用该选项重建和重现 Oops,那么您仍然可以使用 ksymoops 解码该 Oops。
Mkinitrd
对文件树布局的这些更改/lib/modules
还需要升级 mkinitrd。
E2fsprogs
最新版本e2fsprogs
修复了 fsck 和 debugfs 中的几个错误。显然,升级是个好主意。
JFSutils
该jfsutils
软件包包含文件系统的实用程序。可以使用以下实用程序:
-
fsck.jfs
- 启动事务日志的重放,检查和修复 JFS 格式的分区。 -
mkfs.jfs
- 创建一个 JFS 格式的分区。 -
此软件包中还提供了其他文件系统实用程序。
Reiserfsprogs
reiserfsprogs 包应该用于 reiserfs-3.6.x(Linux 内核 2.4.x)。它是一个组合包,包含mkreiserfs
、和 . 这些实用程序可在 i386 和 alpha 平台上运行。resize_reiserfs
debugreiserfs
reiserfsck
Xfsprogs
最新版本的xfsprogs
contains mkfs.xfs
、xfs_db
和 xfs_repair
实用程序等,用于 XFS 文件系统。它独立于体系结构,并且从 2.0.0 开始的任何版本都应该可以与此版本的 XFS 内核代码一起正常工作(建议使用 2.6.0 或更高版本,因为有一些重大改进)。
PCMCIAutils
PCMCIAutils 替换pcmcia-cs
. 如果内核是模块化的并且使用了热插拔子系统,它会在系统启动时正确设置 PCMCIA 套接字并为 16 位 PCMCIA 设备加载适当的模块。
Quota-tools
如果要使用较新的版本 2 配额格式,则需要支持 32 位 uid 和 gid。Quota-tools 3.07 及更新版本具有此支持。使用上表中推荐的版本或更新版本。
Intel IA32 microcode
添加了一个驱动程序以允许更新英特尔 IA32 微码,可作为普通(杂项)字符设备访问。如果您不使用 udev,您可能需要:
mkdir /dev/cpu mknod /dev/cpu/microcode c 10 184 chmod 0644 /dev/cpu/microcode
以root身份使用它。您可能还希望使用用户空间 microcode_ctl 实用程序来使用它。
udev
udev
/dev
是一个用户空间应用程序,用于仅使用实际存在的设备的条目动态填充。udev
替换了 devfs 的基本功能,同时允许对设备进行持久的设备命名。
FUSE
需要 libfuse 2.4.0 或更高版本。绝对最小值是 2.3.0,但挂载选项direct_io
不起作用kernel_cache
。
Networking 联网
General changes 一般变化
如果您有高级网络配置需求,您可能应该考虑使用 ip-route2 中的网络工具。
Packet Filter / NAT 包过滤/NAT
包过滤和 NAT 代码使用与之前的 2.4.x 内核系列 (iptables) 相同的工具。它仍然包括 2.2.x 风格的 ipchains 和 2.0.x 风格的 ipfwadm 的向后兼容模块。
PPP
PPP 驱动程序已经过重组,以支持多链路并使其能够在不同的媒体层上运行。如果您使用 PPP,请将 pppd 至少升级到 2.4.0。
如果您不使用 udev,则必须拥有设备文件 /dev/ppp,该文件可以通过以下方式制作:
mknod /dev/ppp c 108 0
作为根。
NFS-utils 实用程序
在古老的(2.4 和更早的)内核中,nfs 服务器需要知道任何期望能够通过 NFS 访问文件的客户端。此信息将mountd
在客户端安装文件系统时或exportfs
系统启动时提供给内核。exportfs 将从/var/lib/nfs/rmtab
.
这种方法非常脆弱,因为它取决于 rmtab 是否正确,这并不总是那么容易,尤其是在尝试实现故障转移时。即使系统运行良好,也会rmtab
遭受到许多永远不会被删除的旧条目的困扰。
使用现代内核,我们可以选择让内核在收到来自未知主机的请求时告诉 mountd,而 mountd 可以向内核提供适当的导出信息。这消除了对内核的依赖rmtab
,意味着内核只需要知道当前活动的客户端。
要启用此新功能,您需要:
mount -t nfsd nfsd /proc/fs/nfsd
在运行 exportfs 或 mountd 之前。建议在可能的情况下通过防火墙保护所有 NFS 服务免受 Internet 的影响。
mcelog
在 x86 内核上,启用时需要 mcelog 实用程序来处理和记录机器检查事件CONFIG_X86_MCE
。机器检查事件是 CPU 报告的错误。强烈建议处理它们。
Kernel documentation 内核文档
Sphinx 狮身人面像
有关 Sphinx 要求的详细信息,请参阅Documentation/doc-guide/sphinx.rst中的Sphinx 安装。
Getting updated software 获取更新的软件
Kernel compilation 内核编译
gcc
Clang/LLVM
Make
Bash
Binutils
Flex
Bison
OpenSSL
System utilities
Util-linux
Kmod
Ksymoops
Mkinitrd
E2fsprogs
JFSutils
Reiserfsprogs
Xfsprogs
Pcmciautils
Quota-tools
Intel P6 microcode
udev
FUSE
mcelog
cpio
Networking
PPP
NFS-utils
Iptables
Ip-route2
OProfile
NFS-Utils
Kernel documentation
Sphinx
内核的作用
内核有 4 项工作:
-
内存管理:追踪记录有多少内存存储了什么以及存储在哪里
- 进程管理:确定哪些进程可以使用中央处理器(CPU)、何时使用以及持续多长时间
- 设备驱动程序:充当硬件与进程之间的调解程序/解释程序
- 系统调用和安全防护:从流程接受服务请求
在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容(例如 Web 浏览器和文件)则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。
举例来说,内核就像是一个为高管(硬件)服务的忙碌的个人助理。助理的工作就是将员工和公众(用户)的消息和请求(进程)转交给高管,记住存放的内容和位置(内存),并确定在任何特定的时间谁可以拜访高管、会面时间有多长。