linux kenel 编译

Q0:如何缩减编译的initrd.img 的size

A:make INSTALL_MOD_STRIP=1 modules_install && make install

How to reduce the size of the initrd when compiling your kernel? - Unix & Linux Stack Exchange

Q1: 内核编译方法
A:
#  yum install -y ncurses-devel openssl-devel.x86_64 bison flex  elfutils-libelf-devel python3
for BTF compile need dwarves, so should enable the PowerTools repo than
# yum install dwarves
# make -j16
# make modules_install
# make install

Q2: 通过红帽的src rpm包编译自己的rpm 包 
A: 参照下面连接
rpmbuild -bb --target=x86_64 SPECS/kernel.spec --without kabichk 2> build-err.log | tee build-out.log
https://wiki.centos.org/HowTos/Custom_Kernel


Q3: cnetos rpmbuild在哪个文件定义小版本
A: Makefile.rhelver 这个无法修改rpm包的小版本, 通过spec文件中的 %define specrelease 305.30.1.jmnd1%{?dist}

Q4: warning failed to connect to lvmetad,falling back to device scanning.错误
A: 简单的方法是编辑/etc/lvm/lvm.conf这个文件,找到use_lvmetad = 1将1修改为0,保存,重新配置grub。
   # vi /etc/lvm/lvm.conf
   设置 use_lvmetad=0
   sudo update-initramfs -k $(uname -r) -u; sync
   然后重启系统

Q5: UEFI grub 配置
A: gpt2为root所在分区
# cat /boot/efi/EFI/ubuntu/grub.cfg
set root=(hd0,gpt2) 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

Q6: grub配置错误时如何通过grub2命令进入操作系统(ubuntu18.04验证,红帽没有验证)
A: grub2命令行进入ubuntu
 grub>set root=(hd0,gpt1)
 grub>linux /boot/vmlinuz-xxx-xxx
 grub>initrd /boot/initrd.img-xxx-xxx
 grub>boot


Q7: 安装模块时提示找不到certs/signing_key.pem, 怎么解决
# make modules_install
  INSTALL arch/x86/crypto/blowfish-x86_64.ko
cp: cannot stat 'arch/x86/crypto/blowfish-x86_64.ko': No such file or directory
At main.c:291:
- SSL error:02001002:system library:fopen:No such file or directory: crypto/bio/bss_file.c:69
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: crypto/bio/bss_file.c:76

A:
You are missing a signing key to sign the module: sign-file: certs/signing_key.pem: No such file or directory

Create the key like this:
cd /lib/modules/$(uname -r)/build/certs (cd到将要编译内核的代码树中的certs目录)

tee x509.genkey > /dev/null << 'EOF'
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
CN = Modules
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

Q8: rpmbuid时ABI BREAKAGE WAS DETECTED
**** kABI checking is enabled in kernel SPEC file. ****
+ chmod 0755 /home/mock/rpmbuild/SOURCES/check-kabi
+ '[' -e /home/mock/rpmbuild/SOURCES/Module.kabi_x86_64 ']'
+ cp /home/mock/rpmbuild/SOURCES/Module.kabi_x86_64 /home/mock/rpmbuild/BUILDROOT/kernel-4.18.0-305.30.1.el8.x86_64/Module.kabi
+ /home/mock/rpmbuild/SOURCES/check-kabi -k /home/mock/rpmbuild/BUILDROOT/kernel-4.18.0-305.30.1.el8.x86_64/Module.kabi -s Module.symvers
*** ERROR - ABI BREAKAGE WAS DETECTED ***

The following symbols have been changed (this will cause an ABI breakage):

A:--without kabichk
rpmbuild -bb --target=x86_64 SPECS/kernel.spec --without kabichk 2> build-err.log | tee build-out.log
https://wiki.centos.org/HowTos/Custom_Kernel

--nocheck Do not execute %check build stage even if present in spec.

Q9: BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux

A: 开启powertools repo后, yum install dwarves -y

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码对字符设备进行操作: #include <linux/fs.h> #include <linux/cdev.h> #include <linux/module.h> #include <linux/uaccess.h> static int dev_open(struct inode *inode, struct file *file) { printk(KERN_INFO "Device opened\n"); return ; } static int dev_release(struct inode *inode, struct file *file) { printk(KERN_INFO "Device released\n"); return ; } static ssize_t dev_read(struct file *file, char *buf, size_t count, loff_t *pos) { printk(KERN_INFO "Reading from device\n"); return ; } static ssize_t dev_write(struct file *file, const char *buf, size_t count, loff_t *pos) { printk(KERN_INFO "Writing to device\n"); return count; } static struct file_operations fops = { .owner = THIS_MODULE, .open = dev_open, .release = dev_release, .read = dev_read, .write = dev_write, }; static dev_t dev; static struct cdev c_dev; static int __init chardev_init(void) { if (alloc_chrdev_region(&dev, , 1, "chardev") < ) { return -1; } cdev_init(&c_dev, &fops); if (cdev_add(&c_dev, dev, 1) < ) { unregister_chrdev_region(dev, 1); return -1; } printk(KERN_INFO "Chardev module loaded\n"); return ; } static void __exit chardev_exit(void) { cdev_del(&c_dev); unregister_chrdev_region(dev, 1); printk(KERN_INFO "Chardev module unloaded\n"); } module_init(chardev_init); module_exit(chardev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple character device driver"); ### 回答2: 在Linux内核中,对字符设备的操作涉及到以下几个关键的数据结构和函数: 1. file_operations结构体:该结构体定义了字符设备驱动程序所支持的操作函数,例如open、read、write、release等。具体定义如下: ``` struct file_operations { int (*open) (struct inode *, struct file *); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); int (*release) (struct inode *, struct file *); // 其他的操作函数,例如seek、flush等 }; ``` 2. register_chrdev函数:该函数用于向内核注册字符设备驱动,将file_operations结构体中定义的操作函数与字符设备关联起来,使得用户态程序可以通过文件系统API进行对字符设备的操作。注册字符设备的代码如下: ``` int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops); ``` 3. file结构体:该结构体表示一个打开的文件,其中包含了指向对应inode的指针,以及与该文件相关的文件操作函数。用户态程序通过系统调用打开字符设备时,内核会创建一个file结构体实例。 4. inode结构体:该结构体表示一个文件的索引节点,在字符设备中用于保存设备的状态信息。 5. cdev结构体:该结构体表示字符设备的设备号和file_operations结构体的对应关系。可以使用cdev_init和cdev_add函数将cdev结构体与字符设备驱动程序关联起来。 总结起来,对字符设备的操作主要包括定义和实现file_operations结构体中的操作函数,然后通过register_chrdev函数将驱动程序注册到Linux内核中。注册成功后,用户态程序可以通过系统调用打开设备文件,并调用read、write等API与字符设备进行交互。 ### 回答3: 在Linux内核中,对字符设备的操作主要涉及以下几个步骤: 1. 注册字符设备:在内核中使用register_chrdev函数来注册字符设备。该函数接受参数包括主设备号、设备名称和字符设备驱动的file_operations结构体指针等。 2. 实现file_operations结构体:使用file_operations结构体中的成员函数来处理字符设备的操作。常见的成员函数包括open、release、read和write等。通过实现这些函数,可以在用户空间与字符设备之间进行数据传输和交互。 3. 分配设备号:可以通过alloc_chrdev_region函数或者自动分配来获取字符设备的主设备号和次设备号。 下面是一个简单示例,演示了如何在Linux内核中操作字符设备: ```c #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #define DEVICE_NAME "mychardev" #define DEV_MAJOR 222 #define DEV_MINOR 0 struct cdev my_cdev; dev_t devno; int my_open(struct inode *inode, struct file *filp) { printk(KERN_ALERT "Device opened\n"); return 0; } int my_release(struct inode *inode, struct file *filp) { printk(KERN_ALERT "Device released\n"); return 0; } ssize_t my_read(struct file *filp, char __user *buf, size_t len, loff_t *off) { printk(KERN_ALERT "Read from device\n"); // 数据读取操作 return 0; } ssize_t my_write(struct file *filp, const char __user *buf, size_t len, loff_t *off) { printk(KERN_ALERT "Write to device\n"); // 数据写入操作 return 0; } struct file_operations my_fops = { .open = my_open, .release = my_release, .read = my_read, .write = my_write, }; static int __init my_init(void) { int ret; devno = MKDEV(DEV_MAJOR, DEV_MINOR); ret = register_chrdev_region(devno, 1, DEVICE_NAME); if (ret < 0) { printk(KERN_ALERT "Failed to register device\n"); return ret; } cdev_init(&my_cdev, &my_fops); ret = cdev_add(&my_cdev, devno, 1); if (ret < 0) { printk(KERN_ALERT "Failed to add device\n"); unregister_chrdev_region(devno, 1); return ret; } printk(KERN_ALERT "Device registered\n"); return 0; } static void __exit my_exit(void) { cdev_del(&my_cdev); unregister_chrdev_region(devno, 1); printk(KERN_ALERT "Device unregistered\n"); } module_init(my_init); module_exit(my_exit); MODULE_LICENSE("GPL"); ``` 上述代码中,我们定义了一个名为"mychardev"的字符设备,通过实现open、release、read和write等函数来处理设备的打开、关闭、读取和写入操作。在初始化函数中,我们注册了一个字符设备,指定名为"mychardev"的设备名称,并将操作函数和字符设备绑定在一起。在卸载函数中,我们释放了字符设备。需要注意的是,该示例仅为演示目的,具体实现可能会根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值