最新記事

パケットをルーティングするとき、Linuxカーネルはどのように正しいsrc IPを選択しますか?
linux
networking
kernel
linux-kernel
route

パケットをルーティングするとき、Linuxカーネルはどのように正しいsrc IPを選択しますか?

CalicoをCNIプラグインとして使用するkubernetesクラスタがあります。私のローカルルーティングテーブルから、次のいくつかのルートを取得できます。 root@k8s-master:~# ip r default via 192.168.100.1 dev ens18 proto dhcp src 192.168.100.215 metric 100 10.222.235.232 dev cali5bda0fdd27a scope link # route to pod 10.222.235.233 dev cali1209a63af2b scope link 10.222.235.235 dev cali12d4a061371 scope link 10.222.235.241 dev cali9d4dd01dda6 scope link 10.222.235.246 dev calid0a379e0710 scope link 10.222.235.248 dev cali67ee1300377 scope link 私のコンピュータには複数のインターフェイスがあります。パケットをポッドにルーティングするときに、Linuxカーネルが正しいsrc IPを選択する方法を知りたいです。 root@k8s-master:~# ip r get 10.222.235.232 10.222.235.232 dev cali5bda0fdd27a src 192.168.200.2 uid 0 cache cali5bda0fdd27aインターフェイスに IP アドレスがありません。これは、ホストネットワークの名前空間にあるvethペアの一方の端です(もう一方の端はコンテナネットワークの名前空間にあります)。 192.168.200.2他のインターフェイスのIPです。なぜLinuxカーネルは選択192.168.200.2して選択しないのですか192.168.100.215?

Admin

カーネルの更新に必要なRAM
debian
linux-kernel
apt
out-of-memory

カーネルの更新に必要なRAM

小さなDebian仮想マシンがあります。一般的なアプリケーションを使用するには、最大約1.5 GB(通常約500 MB)のRAMのみが必要です。ただし、aptをアップグレードすると、カーネルの更新中にOOMが実行されることがあります。これがinitramfsを再構築するプロセスのようですが、多分他のステップがあるかもしれません。 もしそうなら、aptを介してカーネルアップデートを実行するのに必要な最小RAM容量は何ですか?

Admin

アクションとcpu.sharesの変更権限が拒否されました。
linux
linux-kernel
cgroups
container

アクションとcpu.sharesの変更権限が拒否されました。

実験的にいくつかのプロセスを追加していくつかのtasks修正を試みましたが、次cpu.sharesのコマンドを実行しようとしました。 test中にフォルダを作成しました。/sys/fs/cgroup/cpu $ sudo -s $whoami root $ echo 2472 > tasks -bash: tasks: Permission denied $sudo echo 10 > cpu.shares -bash: cpu.shares: Permission denied また、そのフォルダのlsにはこれら2つのファイルは表示されません。 (タスクファイルにPIDがないため??) また、フォルダを削除しようとしてもtest削除されません。エラーが発生しました。 rm: cannot remove 'test/cgroup.events': Operation not permitted rm: cannot remove 'test/io.pressure': Operation not permitted rm: cannot remove 'test/cgroup.procs': Operation not permitted rm: cannot remove 'test/cgroup.max.descendants': Operation not permitted rm: cannot remove 'test/cpu.stat': Operation not permitted rm: cannot remove 'test/memory.pressure': Operation not permitted rm: cannot remove 'test/cpu.pressure': Operation not permitted rm: cannot remove 'test/cgroup.type': Operation not permitted rm: cannot remove 'test/cgroup.stat': Operation not permitted rm: cannot remove 'test/cgroup.threads': Operation not permitted rm: cannot remove 'test/cgroup.kill': Operation not permitted rm: cannot remove 'test/cgroup.freeze': Operation not permitted rm: cannot remove 'test/cgroup.controllers': Operation not permitted rm: cannot remove 'test/cgroup.subtree_control': Operation not permitted rm: cannot remove 'test/cgroup.max.depth': Operation not permitted しかし、なぜこのファイルを編集したり、作成したフォルダを削除したりできないのですか? rootユーザーとしてコマンドを実行してみました。 オペレーティングシステム:Ubuntu 22.04.1 group.controllersも表示されます.....これはcgroupv2に関連していますか? cgroup.procs cpu.maxとを使用するには、cgroupv2を更新してくださいcpuset.cpus。このファイルは編集可能です。cpu.sharesたとえば、このフォルダに新しいファイルを作成しようとするたびにアクセス許可が拒否されるようです。スティッキービート? ?

Admin

Linux cgroup:タスクとpid?
linux-kernel
process
cgroups
terminology

Linux cgroup:タスクとpid?

taskこれらaとaの違いは何ですかpid?その中にはpidだけがリストされている/sys/fs/cgroupファイルがあります。tasks $ ls /sys/fs/cgroup/*/tasks /sys/fs/cgroup/blkio/tasks /sys/fs/cgroup/net_cls,net_prio/tasks /sys/fs/cgroup/cpuacct/tasks /sys/fs/cgroup/net_cls/tasks /sys/fs/cgroup/cpu,cpuacct/tasks /sys/fs/cgroup/net_prio/tasks /sys/fs/cgroup/cpuset/tasks /sys/fs/cgroup/perf_event/tasks /sys/fs/cgroup/cpu/tasks /sys/fs/cgroup/pids/tasks /sys/fs/cgroup/devices/tasks /sys/fs/cgroup/rdma/tasks /sys/fs/cgroup/freezer/tasks /sys/fs/cgroup/systemd/tasks /sys/fs/cgroup/memory/tasks lsnsこれを行うオプションも提供されます。 -p、--task pid対応するpidを持つプロセスが保持している名前空間のみが表示されます。 cgroupがpidタスクを呼び出すのはなぜですか?違いはありますか?

Admin

古いインターフェイスが維持されないのはなぜですか?
linux-kernel
drivers
kernel-modules
proprietary-drivers

古いインターフェイスが維持されないのはなぜですか?

LinuxモジュールAPIが以前のバージョンと互換性がないのはなぜですか? Linuxカーネルを更新した後、更新されたドライバが見つからず、悩んでいました。 独自のドライバーを必要とするワイヤレスアダプターがあり、メーカーは約7年前にデバイスを停止しました。コードは非常に古く、Linux 2.6.0.0用に書かれているため、最新のLinuxカーネルにコンパイルされません。私は多くのLinuxディストリビューションを試してみましたが、同じ問題がどこにでも現れます。 Linuxカーネルと共に配布されるオープンソースドライバがありますが、動作しません。いくつかの人々は古い排他的なコードを最新のLinuxカーネルと互換性があるように修正しようとしますが、新しいLinuxカーネルがリリースされるとコードが互換性を持たせるのに数ヶ月かかります。この間、別の新しいバージョンがリリースされました。したがって、新しいLinuxカーネルにアップグレードすることはできません。時にはディストリビューションをアップグレードすることもできません。

Admin

WSL 2には/lib/modules/はありません。
linux-kernel
kernel-modules
c++
windows-subsystem-for-linux

WSL 2には/lib/modules/はありません。

私のラップトップのUbuntu 20で実行されているhello worldカーネルモジュールのソースコードがあります。私はUbuntu 20とWSL2で同じコードをコンパイルしようとしています。そのために私はこれを使用しています: make -C /sys/modules/$(shell uname -r)/build M=$(PWD) modules 問題は/lib/modulesその場が空いているということだ。 WSL2は何もインポートできないようです。/lib/modules/4.19.104-microsoft-standard/build 私は以下を使ってタイトルを取得しようとします。 sudo apt search linux-headers-`uname -r` Sorting... Done Full Text Search... Done しかし、モジュールフォルダには何も入力されません。 フォルダに必要なすべてのモジュールが含まれるようにするにはどうすればよいですか? [編集する] もっと近づいてくれた@HannahJに感謝します。 私がしていること: > sudo make -C /home//WSL2-Linux-Kernel M=$(pwd) modules SL2-Linux-Kernel M=$(pwd) modules make: Entering directory '/home//WSL2-Linux-Kernel' CC [M] /home//containers-assembly-permissionsdemo/demo-2/lkm_example.o Building modules, stage 2. MODPOST 1 modules CC /home//containers-assembly-permissionsdemo/demo-2/lkm_example.mod.o LD [M] /home//containers-assembly-permissionsdemo/demo-2/lkm_example.ko make: Leaving directory '/home//WSL2-Linux-Kernel' いよいよlkm_example.koファイルを作成しました。 以来: > sudo insmod lkm_example.ko insmod: ERROR: could not insert module lkm_example.ko: Invalid module format > dmesg [200617.480635] lkm_example: no symbol version for module_layout [200617.480656] lkm_example: loading out-of-tree module taints kernel. [200617.481542] module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1, loc 0000000074f1d70f, val ffffffffc0000158 > sudo modinfo lkm_example.ko filename: /home//containers-assembly-permissionsdemo/demo-2/lkm_example.ko version: 0.01 description: A simple example Linux module. author: Carlos Garcia license: GPL srcversion: F8B272146BAA2381B6332DE depends: retpoline: Y name: lkm_example vermagic: 4.19.84-microsoft-standard+ SMP mod_unload modversions これは私のMakefileです。 obj-m += lkm_example.o all: make -C /home//WSL2-Linux-Kernel M=$(PWD) modules clean: make -C /home//WSL2-Linux-Kernel M=$(PWD) clean test: # We put a — in front of the rmmod command to tell make to ignore # an error in case the module isn’t loaded. -sudo rmmod lkm_example # Clear the kernel log without echo sudo dmesg -C # Insert the module sudo insmod lkm_example.ko # Display the kernel log dmesg unload: sudo rm /dev/lkm_example sudo rmmod lkm_example [編集2] これは私のカーネルモジュールです。 #include #include #include #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Carlos Garcia"); MODULE_DESCRIPTION("A simple example Linux module."); MODULE_VERSION("0.01"); /* Prototypes for device functions */ static int device_open(struct inode *, struct file *); static int device_release(struct inode *, struct file *); static ssize_t device_read(struct file *, char *, size_t, loff_t *); static ssize_t device_write(struct file *, const char *, size_t, loff_t *); static int major_num; static int device_open_count = 0; static char msg_buffer[MSG_BUFFER_LEN]; static char *msg_ptr; /* This structure points to all of the device functions */ static struct file_operations file_ops = { .read = device_read, .write = device_write, .open = device_open, .release = device_release }; /* When a process reads from our device, this gets called. */ static ssize_t device_read(struct file *flip, char *buffer, size_t len, loff_t *offset) { ... } /* Called when a process tries to write to our device */ static ssize_t device_write(struct file *flip, const char *buffer, size_t len, loff_t *offset) { ... } /* Called when a process opens our device */ static int device_open(struct inode *inode, struct file *file) { ... try_module_get(THIS_MODULE); } /* Called when a process closes our device */ static int device_release(struct inode *inode, struct file *file) { ... module_put(THIS_MODULE); } static int __init lkm_example_init(void) { ... major_num = register_chrdev(0, "lkm_example", &file_ops); if (major_num < 0) { printk(KERN_ALERT "Could not register device: % d\n", major_num); return major_num; } else { printk(KERN_INFO "lkm_example module loaded with device major number % d\n", major_num); return 0; } } static void __exit lkm_example_exit(void) { /* Remember — we have to clean up after ourselves. Unregister the character device. */ unregister_chrdev(major_num, DEVICE_NAME); printk(KERN_INFO "Goodbye, World !\n"); } /* Register module functions */ module_init(lkm_example_init); module_exit(lkm_example_exit);

Admin

カーネルの更新後にシステムを起動できません。
boot
linux-kernel
kali-linux
bluetooth
software-updates

カーネルの更新後にシステムを起動できません。

私のラップトップにKali Linux 2020.2がインストールされています。今日、カーネルを更新してシステムを再起動しようとしましたが、今は以前のバージョンのカーネルを使用しても起動しません。一部のエラーが表示されますが、理解できません。エラーのスナップショットを添付します。何が問題なのか教えてください。

Admin

印刷システムメモリ構造
kernel
linux-kernel
memory
hardware
virtual-memory

印刷システムメモリ構造

私のシステムには8GBのRAMと2GBのVRAMがあります。カーネルでUbuntu 18.04を実行します4.15.0-74-generic x86_64。 BIOS読み取り専用メモリを除く2種類のメモリであるIIUCは、仮想アドレス空間と物理アドレス空間にマッピングされます。 このマッピングの実行方法を示すツールはありますか?具体的には、システムRAMの物理/仮想アドレス範囲、VRAMの範囲、およびBIOSの範囲が何であるかを確認してください。 lsmemメモリタイプを区別しないようで、正しいツールなのかわかりません。 編集する についてlspci: $ lspci -v -s 01:00.0 01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) (prog-if 00 [VGA controller]) Subsystem: ASUSTeK Computer Inc. GK107 [GeForce GTX 650] Flags: bus master, fast devsel, latency 0, IRQ 29 Memory at ee000000 (32-bit, non-prefetchable) [size=16M] Memory at d0000000 (64-bit, prefetchable) [size=256M] Memory at e0000000 (64-bit, prefetchable) [size=32M] I/O ports at e000 [size=128] [virtual] Expansion ROM at 000c0000 [disabled] [size=128K] Capabilities: Kernel driver in use: nvidia Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia 合計メモリ量は16+256+32 = 304MBのようです。このカードMBが必要です1024。

Admin

sendfileが空のstdinでは機能しません
arch-linux
linux-kernel
system-calls

sendfileが空のstdinでは機能しません

strace空でないstdinの出力: execve("./cat", ["./cat"], 0x7fff610af090 /* 37 vars */) = 0 sendfile(1, 0, NULL, 1048576) = 4 sendfile(1, 0, NULL, 1048576) = 0 close(0) = 0 exit(0) = ? +++ exited with 0 +++ strace空の標準入力として出力: execve("./cat", ["./cat"], 0x7fff610af090 /* 37 vars */) = 0 sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) sendfile(1, 0, NULL, 1048576) = -1 EINVAL (Invalid argument) ... uname -a:5.3.8-arch1-1 #1 SMP PREEMPT @1572357769 x86_64 GNU/Linux

Admin

KBUILD_CFLAGS_MODULEを使用してカーネルモジュールをコンパイルすることはできません。
linux-kernel
compiling
kernel-modules

KBUILD_CFLAGS_MODULEを使用してカーネルモジュールをコンパイルすることはできません。

KBUILD_CFLAGS_MODULE新しいカーネルでカーネルモジュールをコンパイルするのに問題があります。コンパイラは私に奇妙なエラーを示しています。このタイプのビルドは以前のカーネル(5.5)で動作しましたが、5.16カーネルでは機能しなくなりました。 以下は、再現可能な最小限の例です。 仮想モジュール: #include #include #include MODULE_LICENSE("GPL"); static int __init lkm_example_init(void) {return 0;} static void __exit lkm_example_exit(void){} module_init(lkm_example_init); module_exit(lkm_example_exit); ファイル生成: TARGET ?= test obj-m += ${TARGET}.o KBUILD_CFLAGS_MODULE := "-O1" "-mcmodel=medium" # Examples .PHONY: all all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean その行をコメントアウトすると、KBUILD_CFLAGS_MODULEビルドが機能します。 ただし、コメントアウトを削除すると、次のエラーメッセージでコンパイルが失敗します。 make TARGET=test make -C /lib/modules/5.16.0/build M=/home/user/test modules make[1]: Entering directory '/home/user/linux' CC [M] /home/user/test/test.o In file included from ./include/linux/module.h:22, from /home/user/test/test.c:2: ./include/linux/module.h:183:39: error: expected ',' or ';' before 'KBUILD_MODFILE' 183 | #define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE); | ^~~~~~~~~~~~~~ ./include/linux/moduleparam.h:26:47: note: in definition of macro '__MODULE_INFO' 26 | = __MODULE_INFO_PREFIX __stringify(tag) "=" info | ^~~~ ./include/linux/module.h:183:21: note: in expansion of macro 'MODULE_INFO' 183 | #define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE); | ^~~~~~~~~~~ ./include/linux/module.h:230:34: note: in expansion of macro 'MODULE_FILE' 230 | #define MODULE_LICENSE(_license) MODULE_FILE MODULE_INFO(license, _license) | ^~~~~~~~~~~ /home/user/test/test.c:4:1: note: in expansion of macro 'MODULE_LICENSE' 4 | MODULE_LICENSE("GPL"); | ^~~~~~~~~~~~~~ make[2]: *** [scripts/Makefile.build:287: /home/user/test/test.o] Error 1 make[1]: *** [Makefile:1846: /home/user/test] Error 2 make[1]: Leaving directory '/home/user/linux' make: *** [Makefile:6: all] Error 2 この問題の根本原因が何であるかを知っていますか?

Admin

Live CD Linuxイメージのカーネルを更新する方法
linux
ubuntu
kernel
linux-kernel
livecd

Live CD Linuxイメージのカーネルを更新する方法

liveCD ubuntu Linux isoイメージがあります。このイメージのカーネルを更新する必要があります。ホストUbuntuシステムからisoを取得し、コンパイルされたカーネルとモジュールをそこからliveCDに移動しようとしましたが、それを行った後、システムは次の場所で停止しました。 カーネル/casper/vmlinuz ロード中.. ファイル/casper/inited.img ロード完了.. 完了 initrdが "/casper/filesyste.squashfs"でルートファイルシステムを見つけることができないようです。 これを行う効率的な方法を知っている人はいますか?次の試みは、ホストシステムにliveCDのルートファイルシステムをマウントし、そこから新しいカーネルをコンパイルすることでした。

Admin