Questions tagged «linux-kernel»

有关Linux内核和Linux内核相关主题的问题,例如。实现细节,例如系统调用,内核自定义等。对于不涉及内核细节的Linux用户空间主题,[linux]或发行标签更为合适。

1
Linux内核构建过程的每个步骤会发生什么?
我已经阅读了许多有关如何构建自定义内核并使用这些内核引导Ubuntu的教程,并成功地遵循了指南和引导的自定义内核,但是我不了解指南中的每个命令的作用以及实际发生的情况。每个命令。 在描述的过程Ubuntu的网站上做了很多工作,用的fakeroot,dpkg,make-kpkg,一些initramfs中,和其他可怕的东西,作品,但根本不帮我明白是怎么回事。 makelinux内核目录的输出是什么? 它会创建“压缩内核映像”吗? “压缩内核映像”文件的名称是什么,它放在哪里? 怎么make modules办? 应该make modules在之前还是之后完成make? 不会make自动构建模块吗? 将新生成的内核添加到可启动内核列表中的过程(用英语,而不仅仅是命令列表)是什么过程? 怎么make install办? 将make install它添加到我的启动内核的列表,以便我没有做任何事情吗? 是否有一个等效的make modules_install?

3
Linux:是否只能看到内核空间线程/进程?
我知道程序有两个“级别”:用户空间和内核空间。 我的问题是:我只想查看内核程序,或者更好:内核空间上的程序。 这种方法正确吗? ps -ef|grep "\[" root 1 0 0 20:23 ? 00:00:00 init [4] root 2 0 0 20:23 ? 00:00:00 [kthreadd] root 3 2 0 20:23 ? 00:00:00 [ksoftirqd/0] root 5 2 0 20:23 ? 00:00:00 [kworker/0:0H] root 7 2 0 20:23 ? 00:00:06 [rcu_sched] root 8 2 …

1
SATA从什么意义上说“ SCSI”?SCSI和ATA之间共享多少?
至少对我而言,这并不是什么新鲜事,SATA实际上“在说” SCSI,因此为什么这些SATA设备在Linux中显示为SCSI设备。 之前已经问过一个相关的问题,例如,为什么我的SATA设备显示在/ proc / scsi / scsi下? 但是,在我之前看到的讨论中没有提及的正是SATA与SCSI的关系以及它们之间的区别。 我认为它们在物理层上有所不同是理所当然的,因为它们不共享兼容的电缆。 但是,如何在堆栈上更高呢?我知道Linux如何将现代内核上的SATA甚至IDE磁盘表示为SCSI到SCSI子系统。但是总线上使用的实际协议呢? 我也知道ATAPI是SCSI的封装,但是常规ATA呢?我注意到SCSI已采用SCSI的功能,例如NCQ,FUA,DPO等(如果我记错的话)。但是尚不清楚SCSI命令集实际上有多少被共享或相似。 具有ATA规范的现代SATA设备是否实现了SCSI命令集的子集,但被封装了(如ATAPI中一样)?一套一样吗?超集?还是仅将所选功能实现为不完全相同的变体? 在哪里可以找到明确的信息,尤其是它与Linux内核的关系?某种用于驱动程序开发的教程会很不错,但是即使是不完全跳过所有细节的概述也足够了。我知道我只能阅读实际的规范,但这又太详细了,很难找到您真正想要的东西,并且对我本人以及可能在时间意义上的大多数其他用户来说都不现实。

1
解决此glibc问题的最佳方法是什么?
我管理一个Gentoo Hardened框,该框使用文件功能来消除对setuid-root二进制文件(例如/bin/ping具有CAP_NET_RAW等)的大多数需要。 实际上,我剩下的唯一二进制文件是: abraxas ~ # find / -xdev -type f -perm -u=s /usr/lib64/misc/glibc/pt_chown abraxas ~ # 如果我删除setuid位或重新挂载我的根文件系统nosuid,则sshd和GNU Screen停止工作,因为它们调用grantpt(3)了它们的主伪终端,并且glibc显然执行了该程序来对下的伪伪终端进行chown和chmod /dev/pts/,而GNU Screen会在何时关注此函数失败。 问题是,联机帮助页上grantpt(3)明确指出,在Linux下,devpts安装了文件系统后,不需要此类帮助程序二进制文件;内核会自动将从站的UID和GID设置为打开的进程的实际UID和GID /dev/ptmx(通过调用getpt(3))。 我编写了一个小示例程序来演示这一点: #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> int main(void) { int master; char slave[16]; struct stat slavestat; if ((master = getpt()) …

4
更新Linux内核,同时保留系统的其余部分
我是OpenBSD用户。在OpenBSD常见问题中,它说: OpenBSD是一个完整的系统,旨在保持同步。它不是内核以及可以彼此单独升级的实用程序。 升级系统时,您可以一次性完成。内核和基本系统被替换。然后,您去更新您的第三方套餐。如果从源编译,则重新编译内核并启动它。然后,您重建基础系统,然后重建已安装的软件包。如果自上次重新构建所有内容以来已经过去了几个星期/几个月,那么您首先要安装快照并从那里重新构建(如果您遵循的是最新的CVS分支)。 内核,基本系统和/或第三方软件包不同步是潜在的问题根源,或多或少会使您失去从官方邮件列表中获得任何严重帮助的资格。 我对此很好。实际上,这是我使用OpenBSD的原因之一。它使系统成为一个一致的单元,并使我很容易就可以轻松地对其进行概述。 在Linux上是什么感觉?我知道的大多数Linux都没有与BSD相同的“基本系统”,而是由分发提供商组装的软件包的集合。然后,本地管理员以这种方式添加了其他软件,使得从一开始就存在的内容与后来添加的内容之间的界限充其量是模糊的。 Linux(通常)是否没有强大的内核与用户空间耦合? 据我所知,内核已像任何其他软件包一样进行了更新,这使我有些困惑,这完全有可能。除此之外,有些甚至编译自定义内核(在OpenBSD上不建议使用),并且在其启动菜单中列出了许多不同的内核版本。 谁或什么能保证Linux系统的各个子系统即使彼此独立更新也能够相互协作? 我问的原因是因为该站点上的另一个用户问我是否可以用较新的版本替换Linux系统中的内核。从OpenBSD的角度来看,我不能说是的,这可以保证不会破坏系统。 我将上面的“ Linux”用作“ Linux发行版”,内核和实用程序的简写。

2
为什么默认情况下,Linux与Windows相比电池寿命较差?
Linux操作系统固有的某些功能使它们在默认情况下不适合作为电池电量管理器吗?我本来以为像Lubuntu这样的轻型发行版比Windows拥有明显的电池寿命优势,但事实并非如此。这是硬件供应商的问题吗?笔记本电脑的设计是否旨在与Windows操作系统一起更高效地工作? 例如,根据我在同一台笔记本电脑上的经验,与Windows相比,给定的linux发行版似乎总是电池寿命较差。我的旧笔记本电脑(Thinkpad X61)在启动进入Lubuntu时的使用寿命是使用Windows XP时的一半。在较新的型号上,使用Fedora 20与Windows 8.1时,我得到的性能类似。

1
CFS的CPU使用率高吗?
我问了一个先前的问题,试图找出将应用程序从RHEL 5迁移到RHEL 6时CPU使用率增加的原因。我所做的分析似乎表明,这是由内核中的CFS引起的。我编写了一个测试应用程序来尝试验证是否是这种情况(已删除原始测试应用程序以适合大小限制,但仍在git repo中提供)。 我在RHEL 5上使用以下命令对其进行了编译: cc test_select_work.c -O2 -DSLEEP_TYPE=0 -Wall -Wextra -lm -lpthread -o test_select_work 然后,我使用这些参数,直到在Dell Precision m6500上每次迭代的执行时间约为1 ms。 我在RHEL 5上得到以下结果: ./test_select_work 1000 10000 300 4 time_per_iteration: min: 911.5 us avg: 913.7 us max: 917.1 us stddev: 2.4 us ./test_select_work 1000 10000 300 8 time_per_iteration: min: 1802.6 us avg: …


5
限制Linux中缓冲区缓存的大小
有没有办法告诉Linux内核仅将一定百分比的内存用于缓冲区高速缓存?我知道/proc/sys/vm/drop_caches可以用来临时清除缓存,但是是否有任何永久设置阻止它增长到超过主内存的50%? 我之所以想这样做,是因为我有一台运行Ceph OSD的服务器,该服务器不断从磁盘提供数据,并在几个小时内设法将整个物理内存用作缓冲区缓存。同时,我需要运行将分配大量物理内存(几GB的10s)的应用程序。与普遍的看法相反(请参阅有关缓冲区高速缓存的几乎所有问题的建议),通过丢弃干净的高速缓存条目来自动释放内存并不是瞬时的:缓冲区高速缓存已满时,启动我的应用程序可能需要一分钟( *),在清除缓存(使用echo 3 > /proc/sys/vm/drop_caches)后,同一应用程序几乎立即启动。 (*)根据Vtune在称为的函数中,在启动的这一分钟内,应用程序在新内存中出现故障,但将其100%的时间花费在内核中pageblock_pfn_to_page。此功能似乎与查找大型页面所需的内存压缩有关,这使我相信碎片实际上是问题所在。

4
我可以创建一个名为eth0的虚拟以太网接口吗?
我正在基于Linux 3.10.5-1内核运行Arch。系统使用以太网接口enp * s *和wlp *等的新的事实上的命名约定。但是,这是一个问题,因为我的教育机构正在使用名为Maple 17的程序。Maple的许可系统取决于名为eth0的接口的存在,因为它必须检索它的MAC地址以验证许可。这是一个不好的解决方案,但是我必须解决它。 这意味着我将需要一个带有任何MAC地址的eth0接口(因为我可以为新的MAC地址检索一个新的许可证文件),但不一定必须工作。实际上,它应该一直都处于关闭状态。我认为有几种方法可以尝试解决此问题,但是我无法找到有关任何想法的任何信息。 创建没有连接的适配器 为名为eth0的enp3s0创建别名 重命名enp3s0或回送接口。 我只能找到的内容包括更改到较新的约定以及旧版本的udev。无论如何,他们只在RHEL和SuSe上工作。我试了一下却没有运气。(persistent-net-names.rules和net-name-slot.rules,它们都使我的实际界面停止工作,并且wlan界面消失了)

1
将devtmpfs用于/ dev
我注意到内核中的以下选项:CONFIG_DEVTMPFS Device Drivers -> Generic Driver Options -> Maintain devtmpfs to mount at /dev 而且我看到它在Debian发行版内核中是默认启用的 3.2.0-4-amd64 我试图了解此选项带来的不同。如果没有此选项,/dev则安装为tmpfs,使用此选项,则安装为devtmpfs。除此之外,我看不出任何区别。 在help没有明确对我来说之一: 这将在启动初期创建一个tmpfs / ramfs文件系统实例。在此文件系统中,内核驱动程序核心会维护设备节点的默认名称以及对所有分配了主/次编号的注册设备的权限。 它提供了一个功能齐全的/ dev目录,其中udev通常在顶部运行,以管理权限并添加有意义的符号链接。 在非常有限的环境中,它可以提供足够的功能/ dev而无需任何其他帮助。它还允许简单的救援系统,并可靠地处理动态的主要/次要号码。 有人可以解释一下使用CONFIG_DEVTMPFS与标准之间的区别/dev吗?


4
给定一个git commit hash,如何找出包含它的内核版本?
假设我有一个问题,该问题已由官方Linux git存储库的最新补丁修复。我有一个解决方法,但是当包含我的修复程序的发行版出现时,我想撤消它。我知道确切的git commit哈希,例如f3a1ef9cee4812e2d08c855eb373f0d83433e34c。 回答问题的最简单方法是:到目前为止,哪个内核版本包含此补丁?如果不需要本地Linux git存储库,则奖励积分。 (LWM讨论了一些想法,但是这些想法确实需要本地存储库。)

4
如何告诉Linux Kernel> 3.0完全忽略发生故障的磁盘?
我有一台三星笔记本电脑(Chronos s7),在总线上有一个SATA硬盘ata:1,被检测为/dev/sda,上有8G SSD ata:2,/dev/sdb其余SATA接口上还有其他各种设备。 问题是SSD磁盘是 焊接到主板(不可移动) 崩溃(它仅给出任何操作的I / O错误) 它没有出现在BIOS中(可能是因为它已损坏) 现在该磁盘: 将尝试检测故障磁盘的启动延迟三到五分钟,这很烦人; 但是最烦人的是,系统由于/dev/sdb故障而无法挂起。 注意,我可以忍受开机时的延迟---让我担心的是恢复/挂起。 所以问题是:我可以告诉内核避免在ata:2上探测设备吗? 在较旧的内核(<3.0)中,当我仍然能够深入了解源代码时,会有一个命令行风格的参数hdb=ignore可以解决问题。 我尝试了下面提出的所有技巧udev和libata:force内核参数,但都没有用。具体而言,以下操作无效: 将/etc/udev/rules.d/文件添加到以下文件之一(在早期执行中,00-ignoredisk.rules或在后期执行中,99-ignoredisk.rules或在两个地方中执行时) SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 也不 KERNEL=="sdb", ENV{UDISKS_IGNORE}="1" 也没有很多中间解决方案---这使磁盘在引导后无法访问,但在引导时会对其进行检测,并且在挂起时仍会进行检查-导致挂起失败。 编辑系统文件/lib/udev/rules.d/60-persistent-storage.rules(和udisks,udisks2)更改 KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end" 至 KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end" 再次,这会产生一定的效果,将磁盘从用户空间中屏蔽出来,但是内核仍然可以看到该磁盘。 使用所有可能的参数组合(很好,其中很多)引导libata:force(例如,在此处找到)以禁用DMA,降低速度或发生故障的磁盘---不起作用。使用了该参数,但是磁盘仍处于探测状态并且发生故障。 完整udevadm info -a -n /dev/sdb粘贴到http://paste.ubuntu.com/6186145/ smartctl -i /dev/sdb -T permissive 给出: …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.