1 .. include:: ../disclaimer-zh_CN.rst 1 .. include:: ../disclaimer-zh_CN.rst 2 2 3 :Original: Documentation/admin-guide/sysrq.rst 3 :Original: Documentation/admin-guide/sysrq.rst 4 4 5 :翻译: 5 :翻译: 6 6 7 黄军华 Junhua Huang <huang.junhua@zte.com.c 7 黄军华 Junhua Huang <huang.junhua@zte.com.cn> 8 8 9 :校译: 9 :校译: 10 10 11 司延腾 Yanteng Si <siyanteng@loongson.cn> 11 司延腾 Yanteng Si <siyanteng@loongson.cn> 12 12 13 .. _cn_admin-guide_sysrq: 13 .. _cn_admin-guide_sysrq: 14 14 15 Linux 魔法系统请求键骇客 15 Linux 魔法系统请求键骇客 16 ======================== 16 ======================== 17 17 18 针对 sysrq.c 的文档说明 18 针对 sysrq.c 的文档说明 19 19 20 什么是魔法 SysRq 键? 20 什么是魔法 SysRq 键? 21 ~~~~~~~~~~~~~~~~~~~~~ 21 ~~~~~~~~~~~~~~~~~~~~~ 22 22 23 它是一个你可以输入的具有魔法般 23 它是一个你可以输入的具有魔法般的组合键。 24 无论内核在做什么,内核都会响应 24 无论内核在做什么,内核都会响应 SysRq 键的输入,除非内核完全卡死。 25 25 26 如何使能魔法 SysRq 键? 26 如何使能魔法 SysRq 键? 27 ~~~~~~~~~~~~~~~~~~~~~~~ 27 ~~~~~~~~~~~~~~~~~~~~~~~ 28 28 29 在配置内核时,我们需要设置 'Magic 29 在配置内核时,我们需要设置 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' 为 'Y'。 30 当运行一个编译进 sysrq 功能的内核 30 当运行一个编译进 sysrq 功能的内核时,/proc/sys/kernel/sysrq 控制着被 31 SysRq 键调用的功能许可。这个文件 31 SysRq 键调用的功能许可。这个文件的默认值由 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 32 配置符号设定,文件本身默认设置 32 配置符号设定,文件本身默认设置为 1。以下是 /proc/sys/kernel/sysrq 中可能的 33 值列表: 33 值列表: 34 34 35 - 0 - 完全不使能 SysRq 键 35 - 0 - 完全不使能 SysRq 键 36 - 1 - 使能 SysRq 键的全部功能 36 - 1 - 使能 SysRq 键的全部功能 37 - >1 - 对于允许的 SysRq 键功能的 37 - >1 - 对于允许的 SysRq 键功能的比特掩码(参见下面更详细的功能描述):: 38 38 39 2 = 0x2 - 使能对控制台日志 39 2 = 0x2 - 使能对控制台日志记录级别的控制 40 4 = 0x4 - 使能对键盘的控制 40 4 = 0x4 - 使能对键盘的控制 (SAK, unraw) 41 8 = 0x8 - 使能对进程的调试 41 8 = 0x8 - 使能对进程的调试导出等 42 16 = 0x10 - 使能同步命令 42 16 = 0x10 - 使能同步命令 43 32 = 0x20 - 使能重新挂载只读 43 32 = 0x20 - 使能重新挂载只读 44 64 = 0x40 - 使能对进程的信号 44 64 = 0x40 - 使能对进程的信号操作 (term, kill, oom-kill) 45 128 = 0x80 - 允许重启、断电 45 128 = 0x80 - 允许重启、断电 46 256 = 0x100 - 允许让所有实时任 46 256 = 0x100 - 允许让所有实时任务变普通任务 47 47 48 你可以通过如下命令把值设置到这 48 你可以通过如下命令把值设置到这个文件中:: 49 49 50 echo "number" >/proc/sys/kernel/sysrq 50 echo "number" >/proc/sys/kernel/sysrq 51 51 52 这里被写入的 number 可以是 10 进制 52 这里被写入的 number 可以是 10 进制数,或者是带着 0x 前缀的 16 进制数。 53 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 必须是以 53 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE 必须是以 16 进制数写入。 54 54 55 注意,``/proc/sys/kernel/sysrq`` 的值只 55 注意,``/proc/sys/kernel/sysrq`` 的值只影响通过键盘触发 SySRq 的调用,对于 56 通过 ``/proc/sysrq-trigger`` 的任何操作 56 通过 ``/proc/sysrq-trigger`` 的任何操作调用都是允许的 57 (通过具有系统权限的用户)。 57 (通过具有系统权限的用户)。 58 58 59 如何使用魔法 SysRq 键? 59 如何使用魔法 SysRq 键? 60 ~~~~~~~~~~~~~~~~~~~~~~~ 60 ~~~~~~~~~~~~~~~~~~~~~~~ 61 61 62 在 x86 架构上 62 在 x86 架构上 63 你可以按下键盘组合键 :kbd:`A 63 你可以按下键盘组合键 :kbd:`ALT-SysRq-<command key>`。 64 64 65 .. note:: 65 .. note:: 66 一些键盘可能没有标识 'SyS 66 一些键盘可能没有标识 'SySRq' 键。'SySRq' 键也被当做 'Print Screen'键。 67 同时有些键盘无法处理同 67 同时有些键盘无法处理同时按下这么多键,因此你可以先按下键盘 :kbd:`Alt` 键, 68 然后按下键盘 :kbd:`SysRq` 键 68 然后按下键盘 :kbd:`SysRq` 键,再释放键盘 :kbd:`SysRq` 键,之后按下键盘上命令键 69 :kbd:`<command key>`,最后释放 69 :kbd:`<command key>`,最后释放所有键。 70 70 71 在 SPARC 架构上 71 在 SPARC 架构上 72 你可以按下键盘组合键 :kbd:`A 72 你可以按下键盘组合键 :kbd:`ALT-STOP-<command key>` 。 73 73 74 在串行控制台(只针对 PC 类型的标 74 在串行控制台(只针对 PC 类型的标准串口) 75 你可以发一个 ``BREAK`` ,然后 75 你可以发一个 ``BREAK`` ,然后在 5 秒内发送一个命令键, 76 发送 ``BREAK`` 两次将被翻译为 76 发送 ``BREAK`` 两次将被翻译为一个正常的 BREAK 操作。 77 77 78 在 PowerPC 架构上 78 在 PowerPC 架构上 79 按下键盘组合键 :kbd:`ALT - Prin 79 按下键盘组合键 :kbd:`ALT - Print Screen` (或者 :kbd:`F13`) - :kbd:`<命令键>` 。 80 :kbd:`Print Screen` (或者 :kbd:`F1 80 :kbd:`Print Screen` (或者 :kbd:`F13`) - :kbd:`<命令键>` 或许也能实现。 81 81 82 在其他架构上 82 在其他架构上 83 如果你知道其他架构的组合 83 如果你知道其他架构的组合键,请告诉我,我可以把它们添加到这部分。 84 84 85 在所有架构上 85 在所有架构上 86 写一个字符到 /proc/sysrq-trigger 86 写一个字符到 /proc/sysrq-trigger 文件,例如:: 87 87 88 echo t > /proc/sysrq-trigger 88 echo t > /proc/sysrq-trigger 89 89 90 这个命令键 :kbd:`<command key>` 是区分 90 这个命令键 :kbd:`<command key>` 是区分大小写的。 91 91 92 什么是命令键? 92 什么是命令键? 93 ~~~~~~~~~~~~~~ 93 ~~~~~~~~~~~~~~ 94 94 95 =========== ================================== 95 =========== ================================================================ 96 命令键 功能 96 命令键 功能 97 =========== ================================== 97 =========== ================================================================ 98 ``b`` 将立即重启系统,不会同 98 ``b`` 将立即重启系统,不会同步或者卸载磁盘。 99 99 100 ``c`` 将执行系统 crash,如果配 100 ``c`` 将执行系统 crash,如果配置了系统 crashdump,将执行 crashdump。 101 101 102 ``d`` 显示所有持有的锁。 102 ``d`` 显示所有持有的锁。 103 103 104 ``e`` 发送 SIGTERM 信号给所有进 104 ``e`` 发送 SIGTERM 信号给所有进程,除了 init 进程。 105 105 106 ``f`` 将调用 oom killer 杀掉一个 106 ``f`` 将调用 oom killer 杀掉一个过度占用内存的进程,如果什么任务都没杀, 107 也不会 panic。 107 也不会 panic。 108 108 109 ``g`` kgdb 使用(内核调试器) 109 ``g`` kgdb 使用(内核调试器)。 110 110 111 ``h`` 将会显示帮助。(实际上 111 ``h`` 将会显示帮助。(实际上除了这里列举的键,其他的都将显示帮助, 112 但是 ``h`` 容易记住):-) 112 但是 ``h`` 容易记住):-) 113 113 114 ``i`` 发送 SIGKILL 给所有进程, 114 ``i`` 发送 SIGKILL 给所有进程,除了 init 进程。 115 115 116 ``j`` 强制性的 “解冻它” - 用 116 ``j`` 强制性的 “解冻它” - 用于被 FIFREEZE ioctl 操作冻住的文件系统。 117 117 118 ``k`` 安全访问秘钥(SAK)杀掉在 118 ``k`` 安全访问秘钥(SAK)杀掉在当前虚拟控制台的所有程序,注意:参考 119 下面 SAK 节重要论述。 119 下面 SAK 节重要论述。 120 120 121 ``l`` 显示所有活动 cpu 的栈回 121 ``l`` 显示所有活动 cpu 的栈回溯。 122 122 123 ``m`` 将导出当前内存信息到你 123 ``m`` 将导出当前内存信息到你的控制台。 124 124 125 ``n`` 用于使所有实时任务变成 125 ``n`` 用于使所有实时任务变成普通任务。 126 126 127 ``o`` 将关闭系统(如果配置和 127 ``o`` 将关闭系统(如果配置和支持的话)。 128 128 129 ``p`` 将导出当前寄存器和标志 129 ``p`` 将导出当前寄存器和标志位到控制台。 130 130 131 ``q`` 将导出每个 cpu 上所有已 131 ``q`` 将导出每个 cpu 上所有已装备的高精度定时器(不是完整的 132 time_list 文件显示的 timers 132 time_list 文件显示的 timers)和所有时钟事件设备的详细信息。 133 133 134 ``r`` 关闭键盘的原始模式,设 134 ``r`` 关闭键盘的原始模式,设置为转换模式。 135 135 136 ``s`` 将尝试同步所有的已挂载 136 ``s`` 将尝试同步所有的已挂载文件系统。 137 137 138 ``t`` 将导出当前所有任务列表 138 ``t`` 将导出当前所有任务列表和它们的信息到控制台。 139 139 140 ``u`` 将尝试重新挂载已挂载文 140 ``u`` 将尝试重新挂载已挂载文件系统为只读。 141 141 142 ``v`` 强制恢复帧缓存控制台。 142 ``v`` 强制恢复帧缓存控制台。 143 ``v`` 触发 ETM 缓存导出 [ARM 架 143 ``v`` 触发 ETM 缓存导出 [ARM 架构特有] 144 144 145 ``w`` 导出处于不可中断状态( 145 ``w`` 导出处于不可中断状态(阻塞)的任务。 146 146 147 ``x`` 在 ppc/powerpc 架构上用于 xm 147 ``x`` 在 ppc/powerpc 架构上用于 xmon 接口。 148 在 sparc64 架构上用于显示 148 在 sparc64 架构上用于显示全局的 PMU(性能监控单元)寄存器。 149 在 MIPS 架构上导出所有的 149 在 MIPS 架构上导出所有的 tlb 条目。 150 150 151 ``y`` 显示全局 cpu 寄存器 [SPARC- 151 ``y`` 显示全局 cpu 寄存器 [SPARC-64 架构特有] 152 152 153 ``z`` 导出 ftrace 缓存信息 153 ``z`` 导出 ftrace 缓存信息 154 154 155 ``0``-``9`` 设置控制台日志级别,该 155 ``0``-``9`` 设置控制台日志级别,该级别控制什么样的内核信息将被打印到你的 156 控制台。(比如 ``0`` ,将 156 控制台。(比如 ``0`` ,将使得只有紧急信息,像 PANICs or OOPSes 157 才能到你的控制台。) 157 才能到你的控制台。) 158 =========== ================================== 158 =========== ================================================================ 159 159 160 好了,我能用他们做什么呢? 160 好了,我能用他们做什么呢? 161 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 161 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 162 162 163 嗯,当你的 X 服务端或者 svgalib 程 163 嗯,当你的 X 服务端或者 svgalib 程序崩溃,unraw(r) 非原始模式命令键是非常 164 方便的。 164 方便的。 165 165 166 sak(k)(安全访问秘钥)在你尝试登 166 sak(k)(安全访问秘钥)在你尝试登陆的同时,又想确保当前控制台没有可以获取你的 167 密码的特洛伊木马程序运行时是有 167 密码的特洛伊木马程序运行时是有用的。它会杀掉给定控制台的所有程序,这样你 168 就可以确认当前的登陆提示程序是 168 就可以确认当前的登陆提示程序是实际来自 init 进程的程序,而不是某些特洛伊 169 木马程序。 169 木马程序。 170 170 171 .. important:: 171 .. important:: 172 172 173 在其实际的形式中,在兼容 C2 安 173 在其实际的形式中,在兼容 C2 安全标准的系统上,它不是一个真正的 SAK, 174 它也不应该误认为此。 174 它也不应该误认为此。 175 175 176 似乎其他人发现其可以作为(系统 176 似乎其他人发现其可以作为(系统终端联机键)当你想退出一个程序, 177 同时不会让你切换控制台的方法。 177 同时不会让你切换控制台的方法。(比如,X 服务端或者 svgalib 程序) 178 178 179 ``reboot(b)`` 是个好方法,当你不能 179 ``reboot(b)`` 是个好方法,当你不能关闭机器时,它等同于按下"复位"按钮。 180 180 181 ``crash(c)`` 可以用于手动触发一个 cr 181 ``crash(c)`` 可以用于手动触发一个 crashdump,当系统卡住时。 182 注意当 crashdump 机制不可用时,这 182 注意当 crashdump 机制不可用时,这个只是触发一个内核 crash。 183 183 184 ``sync(s)`` 在拔掉可移动介质之前, 184 ``sync(s)`` 在拔掉可移动介质之前,或者在使用不提供优雅关机的 185 救援 shell 之后很方便 -- 它将确保 185 救援 shell 之后很方便 -- 它将确保你的数据被安全地写入磁盘。注意,在你看到 186 屏幕上出现 "OK" 和 "Done" 之前,同 186 屏幕上出现 "OK" 和 "Done" 之前,同步还没有发生。 187 187 188 ``umount(u)`` 可以用来标记文件系统 188 ``umount(u)`` 可以用来标记文件系统正常卸载,从正在运行的系统角度来看,它们将 189 被重新挂载为只读。这个重新挂载 189 被重新挂载为只读。这个重新挂载动作直到你看到 "OK" 和 "Done" 信息出现在屏幕上 190 才算完成。 190 才算完成。 191 191 192 日志级别 ``0`` - ``9`` 用于当你的控 192 日志级别 ``0`` - ``9`` 用于当你的控制台被大量的内核信息冲击,你不想看见的时候。 193 选择 ``0`` 将禁止除了最紧急的内核 193 选择 ``0`` 将禁止除了最紧急的内核信息外的所有的内核信息输出到控制台。(但是如果 194 syslogd/klogd 进程是运行的,它们仍 194 syslogd/klogd 进程是运行的,它们仍将被记录。) 195 195 196 ``term(e)`` 和 ``kill(i)`` 用于当你有些 196 ``term(e)`` 和 ``kill(i)`` 用于当你有些有点失控的进程,你无法通过其他方式杀掉 197 它们的时候,特别是它正在创建其 197 它们的时候,特别是它正在创建其他进程。 198 198 199 "just thaw ``it(j)`` " 用于当你的系统 199 "just thaw ``it(j)`` " 用于当你的系统由于一个 FIFREEZE ioctl 调用而产生的文件 200 系统冻结,而导致的不响应时。 200 系统冻结,而导致的不响应时。 201 201 202 有的时候 SysRq 键在使用它之后,看 202 有的时候 SysRq 键在使用它之后,看起来像是“卡住”了,我能做些什么? 203 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 203 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 204 205 这也会发生在我这,我发现轻敲键 205 这也会发生在我这,我发现轻敲键盘两侧的 shift、alt 和 control 键,然后再次敲击 206 一个无效的 SysRq 键序列可以解决问 206 一个无效的 SysRq 键序列可以解决问题。(比如,像键盘组合键 :kbd:`alt-sysrq-z` ) 207 切换到另一个虚拟控制台(键盘操 207 切换到另一个虚拟控制台(键盘操作 :kbd:`ALT+Fn` ),然后再切回来应该也有帮助。 208 208 209 我敲击了 SysRq 键,但像是什么都没 209 我敲击了 SysRq 键,但像是什么都没发生,发生了什么错误? 210 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 210 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 211 211 212 有一些键盘对于 SysRq 键设置了不同 212 有一些键盘对于 SysRq 键设置了不同的键值,而不是提前定义的 99 213 (查看在 ``include/uapi/linux/input-event-co 213 (查看在 ``include/uapi/linux/input-event-codes.h`` 文件中 ``KEY_SYSRQ`` 的定义) 214 或者就根本没有 SysRq 键。在这些场 214 或者就根本没有 SysRq 键。在这些场景下,执行 ``showkey -s`` 命令来找到一个合适 215 的扫描码序列,然后使用 ``setkeycode 215 的扫描码序列,然后使用 ``setkeycodes <sequence> 99`` 命令映射这个序列值到通用 216 的 SysRq 键编码上(比如 ``setkeycodes 216 的 SysRq 键编码上(比如 ``setkeycodes e05b 99`` )。最好将这个命令放在启动脚本 217 中。 217 中。 218 哦,顺便说一句,你十秒钟不输入 218 哦,顺便说一句,你十秒钟不输入任何东西就将退出 “showkey”。 219 219 220 我想添加一个 SysRq 键事件到一个模 220 我想添加一个 SysRq 键事件到一个模块中,如何去做呢? 221 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 221 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 222 222 223 为了注册一个基础函数到这个表中 223 为了注册一个基础函数到这个表中,首先你必须包含 ``include/linux/sysrq.h`` 头 224 文件,这个头文件定义了你所需要 224 文件,这个头文件定义了你所需要的所有东西。然后你必须创建一个 ``sysrq_key_op`` 225 结构体,然后初始化它,使用如下 225 结构体,然后初始化它,使用如下内容,A) 你将使用的这个键的处理函数, B) 一个 226 help_msg 字符串,在 SysRq 键打印帮助 226 help_msg 字符串,在 SysRq 键打印帮助信息时将打印出来,C) 一个 action_msg 字 227 符串,就在你的处理函数调用前打 227 符串,就在你的处理函数调用前打印出来。你的处理函数必须符合在 'sysrq.h' 文件中 228 的函数原型。 228 的函数原型。 229 229 230 在 ``sysrq_key_op`` 结构体被创建后, 230 在 ``sysrq_key_op`` 结构体被创建后,你可以调用内核函数 231 ``register_sysrq_key(int key, const struct sys 231 ``register_sysrq_key(int key, const struct sysrq_key_op *op_p);``, 232 该函数在表中的 'key' 对应位置内容 232 该函数在表中的 'key' 对应位置内容是空的情况下,将通过 ``op_p`` 指针注册这个操作 233 函数到表中 'key' 对应位置上。在模 233 函数到表中 'key' 对应位置上。在模块卸载的时候,你必须调用 234 ``unregister_sysrq_key(int key, const struct s 234 ``unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)`` 函数,该函数 235 只有在当前该键对应的处理函数被 235 只有在当前该键对应的处理函数被注册到了 'key' 对应位置时,才会移除 'op_p' 指针 236 对应的键值操作函数。这是为了防 236 对应的键值操作函数。这是为了防止在你注册之后,该位置被改写的情况。 237 237 238 魔法 SysRq 键系统的工作原理是将键 238 魔法 SysRq 键系统的工作原理是将键对应操作函数注册到键的操作查找表, 239 该表定义在 'drivers/tty/sysrq.c' 文件 239 该表定义在 'drivers/tty/sysrq.c' 文件中。 240 该键表有许多在编译时候就注册进 240 该键表有许多在编译时候就注册进去的操作函数,但是是可变的。 241 并且有两个函数作为操作该表的接 241 并且有两个函数作为操作该表的接口被导出:: 242 242 243 register_sysrq_key 和 unregister_sysr 243 register_sysrq_key 和 unregister_sysrq_key. 244 244 245 当然,永远不要在表中留下无效指 245 当然,永远不要在表中留下无效指针,即,当你的模块存在调用 register_sysrq_key() 246 函数,它一定要调用 unregister_sysrq_k 246 函数,它一定要调用 unregister_sysrq_key() 来清除它使用过的 SysRq 键表条目。 247 表中的空指针是安全的。:) 247 表中的空指针是安全的。:) 248 248 249 如果对于某种原因,在 handle_sysrq 249 如果对于某种原因,在 handle_sysrq 调用的处理函数中,你认为有必要调用 250 handle_sysrq 函数时,你必须意识到当 250 handle_sysrq 函数时,你必须意识到当前你处于一个锁中(你同时也处于一个中断处理 251 函数中,这意味着不能睡眠)。所 251 函数中,这意味着不能睡眠)。所以这时你必须使用 ``__handle_sysrq_nolock`` 替代。 252 252 253 当我敲击一个 SysRq 组合键时,只有 253 当我敲击一个 SysRq 组合键时,只有标题打印出现在控制台? 254 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 254 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 255 256 SysRq 键的输出和所有其他控制台输 256 SysRq 键的输出和所有其他控制台输出一样,受制于控制台日志级别控制。 257 这意味着,如果内核以发行版内核 257 这意味着,如果内核以发行版内核中常见的 "quiet" 方式启动,则输出可能不会出现在实际 258 的控制台上,即使它会出现在 dmesg 258 的控制台上,即使它会出现在 dmesg 缓存中,也可以通过 dmesg 命令和 ``/proc/kmsg`` 259 文件的消费访问到。作为一个特例 259 文件的消费访问到。作为一个特例,来自 sysrq 命令的标题行将被传递给所有控制台 260 使用者,就好像当前日志级别是最 260 使用者,就好像当前日志级别是最大的一样。如果只发出标题头,则几乎可以肯定内核日志 261 级别太低。如果你需要控制台上的 261 级别太低。如果你需要控制台上的输出,那么你将需要临时提高控制台日志级别,通过使用 262 键盘组合键 :kbd:`alt-sysrq-8` 或者:: 262 键盘组合键 :kbd:`alt-sysrq-8` 或者:: 263 263 264 echo 8 > /proc/sysrq-trigger 264 echo 8 > /proc/sysrq-trigger 265 265 266 在触发了你感兴趣的 SysRq 键命令后 266 在触发了你感兴趣的 SysRq 键命令后,记得恢复日志级别到正常情况。 267 267 268 我有很多问题时,可以请教谁? 268 我有很多问题时,可以请教谁? 269 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 269 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 270 271 请教在内核邮件列表上的人,邮箱 271 请教在内核邮件列表上的人,邮箱: 272 linux-kernel@vger.kernel.org 272 linux-kernel@vger.kernel.org 273 273 274 致谢 274 致谢 275 ~~~~ 275 ~~~~ 276 276 277 - Mydraal <vulpyne@vulpyne.net> 撰写了该文 277 - Mydraal <vulpyne@vulpyne.net> 撰写了该文件 278 - Adam Sulmicki <adam@cfar.umd.edu> 进行了 278 - Adam Sulmicki <adam@cfar.umd.edu> 进行了更新 279 - Jeremy M. Dolan <jmd@turbogeek.org> 在 2001/ 279 - Jeremy M. Dolan <jmd@turbogeek.org> 在 2001/01/28 10:15:59 进行了更新 280 - Crutcher Dunnavant <crutcher+kernel@datastack 280 - Crutcher Dunnavant <crutcher+kernel@datastacks.com> 添加键注册部分
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.