使用Initramfs挂载根文件系统,编译过程multiple target patterns(多个目标匹配)问题的解决

2023-10-29

编译内核前,配置内核用Initramfs挂载根文件系统,配置选项如下:

 

Genera setup-------------------------------->

  [ * ] Initial RAM filesystem and RAM disk (initramfs/initrd)support

( /home/myrootfs )Initramfs source file(s)

配置完毕,第一次编译OK。但是编译第二次时就出问题了,编译过程终止在了/user/Makefil里面,错误原因是多个目标匹配。详细信息如下:

 

 
  1. <span style="font-size:18px;">root@localhost kernels]# make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage

  2. CHK include/linux/version.h

  3. CHK include/generated/utsrelease.h

  4. make[1]: “include/generated/mach-types.h”是最新的。

  5. CALL scripts/checksyscalls.sh

  6. CHK include/generated/compile.h

  7. /home/ASM335/kernel/kernels/usr/Makefile:58: *** 多个目标匹配。 停止。

  8. make: *** [usr] 错误 2</span>

 

 

我试着make clean和make disiclean,都不行,任然停在上面那个地方,同样的问题。我又试着把Initial RAM filesystem and RAM disk (initramfs/initrd)support取消,还是同样的错误。根据提示,问题出现在了/usr/Makefile的第58行,我打开/usr/目录下的Makefile,定位到58行,发现时一个变量:$(deps_initramfs)

其实后面网上看了很多博客,不少人也碰到了多目标匹配报错的问题,他们问题的原因大都由于作为目标的变量中(这些变量有时会是文件名或路径名)包含冒号( :)。大家都知道Makefile规则的格式是: 

目标:依赖

相关指令

若代表目标的变量中包含冒号,则会别识别成多个目标。于是,我打算把$(deps_initramfs)的值打印出来,看看里面是否含冒号。我在$(deps_initramfs)前面加上$(warning  $(deps_initramfs)),打印出了一大堆路径,占据了我的整个显示终端,仔细阅读这些路径,发现全是我根文件系统里的文件。猜测 $(deps_initramfs)的值是Initramfs source file(s)

里所有文件的绝对路径。

如何确定这些路径是否有冒号?从显示终端打印出的路径里用眼睛找?显然不可能!而且根文件系统文件比较多,路径也比较长,我的显示终端只能看到部分文件路径,好多跑前面去了,无法看到。我知道我的路径肯定不可能有冒号的,那么文件名呢?我试着在文件系统里新建一个文件,命名的时候加个冒号,结果报错,显然文件名也不能有冒号啊!何解?到这里我无从下手了。接着网上找资料!

 

直到后来。找到一篇博客,也是和我一样的问题,它介绍了一个解决方法。我照着它的方法来,发现还真管用。

它是用make -d命令打印出详细的编译信息,然后根据打印出的调试信息,找到与你问题相关部分(应该是最后几行吧,因为编译过程会停在有问题的地方)。我使用make -d命令,与/usr/Makefile相关的如下:

 

 
  1. <span style="font-size:18px;">正在读入 makefile “/home/ASM335/kernel/kernels/usr/Makefile” (搜索路径) (no ~ expansion)...

  2. 正在读入 makefile “usr/.initramfs_data.cpio.d” (搜索路径) (no ~ expansion)...

  3. /home/ASM335/kernel/kernels/usr/Makefile:58: *** 多个目标匹配。 停止。

  4. 正在中止失败的子进程 0x08acc7e8 PID 16580

  5. make: *** [usr] 错误 2

  6. Removing child 0x08acc7e8 PID 16580 from chain.

  7. </span>

学着那篇博客,我把/usr/.initramfs_data.cpio.d删除,然后重新编译,OK。问题解决。至于为什么会出现这个问题,一下子没弄明白。

 

参考博客:

http://blog.csdn.net/zjujoe/article/details/3185382

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

补充:

造成上述原因的确实是冒号的问题。我打开了/usr/.initramfs_data.cpio.d文件:

 

 
  1. deps_initramfs := /home/asm335/kernel/kernels/scripts/gen_initramfs_list.sh \

  2. /home/asm335/rootfs \

  3. /home/asm335/rootfs/sys \

  4. /home/asm335/rootfs/var \

  5. /home/asm335/rootfs/var/spool \

  6. /home/asm335/rootfs/var/spool/mail \

  7. /home/asm335/rootfs/var/lib \

  8. /home/asm335/rootfs/var/lib/misc \

  9. /home/asm335/rootfs/var/lib/opkg \

  10. /home/asm335/rootfs/var/lib/opkg/lists \

  11. /home/asm335/rootfs/var/lib/opkg/info \

  12. /home/asm335/rootfs/var/lib/opkg/info/libasound2.list \

  13. .....................................

文件里面其实就是deps_initramfs变量的赋值!在打开的.initramfs_data.cpio.d文件查找冒号,不找不知道,一找吓一跳啊,一大堆冒号:

 


 

再看看/usr/Makefile里deps_initramfs的位置

 

 

$(deps_initramfs)是一个目标啊,而deps_initramfs所代表的路径里又含有冒号,难怪会识别成多目标匹配!

另外,包含冒号的文件都在/etc/usb_modeswitch.d目录下(这些都是产品设备号?)

 

纠正一点:前面说文件名不能有冒号,这句话其实是错的。在Windows中文件名不能有冒号,但是在linux中是可以有冒号的!可以touch一个带名字冒号的文件试试看。

 

回过头来看:make是之所以会说多目标匹配,想必一定发现了多个目标。而网上好多文章都说Makefile里的目标包含冒号的话会导致这个问题。那么,解决问题的思路应该是:定位到出问题的Makefile里面的那个目标,然后想办法把相关变量的值导出来看看里面有没有冒号。在本次问题中,/usr/.initramfs_data.cpio.d文件中恰好就是deps_initramfs变量的值,直接搜索冒号即可。

 

     一些疑惑:既然deps_initramfs所代表的路径包含冒号,那为什么第一次编译时OK的呢?而后面的编译就出问题? .initramfs_data.cpio.d 到底是什么文件,在使用initramfs挂载根文件系统时扮演什么角色。这些就得学习initramfs的知识了。这里推荐一篇博客:http://blog.chinaunix.net/uid-26009923-id-4072464.html

原文链接:http://blog.csdn.net/andoubi/article/details/52052186

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Initramfs挂载根文件系统,编译过程multiple target patterns(多个目标匹配)问题的解决 的相关文章

随机推荐

  • 如何提高英文的科研写作能力-施一公

    转自 http blog sciencenet cn home php mod space uid 46212 do blog id 349932 作为一个科研工作者 在国际学术期刊上发表科研论文是与同行交流 取得国际影响的必经之路 有些国
  • 第十章:C语言的调试

    很多小伙伴刚开始听到C语言的调试 这是个啥 表示很怀疑 敲代码不就是直接就是干嘛 结果很多小白们 一运行错误多的数都数不过来 就开始这改改 那删删 莫名奇妙就运行成功了 到最后都不知道到底那错了 有一种小朋友是否有多问号的感觉 可想而知代码
  • AndroidStudio历史记录找回本地修改代码

    今天干了一件特别无语的事情 在现有项目中将新需求开发的代码包想挪一下位置 结果在AndroidStudio中移动失败了 并且原有的包下所有代码都找不到了 搜索了整个项目都没有找到相应的java文件 瞬间心慌啊 这意味着该包下的代码白写了 想
  • npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法

    原因 我遇到这个问题的场景是用nvm1 1 7的版本安装了16 x以上的node 然后再下载依赖的时候就报错了 总结一下就是nvm版本太低了 他的里面没有集成高版本node导致的 解决 我们把nvm版本换到最新的就可以了 1 卸载掉当前所有
  • 第4章 R语言编程基础——数据整理与预处理

    目录 4 1 经济 金融数据库 4 1 1 金融数据与数据库 4 1 2 国外金融数据库概况 4 1 3 国内金融数据库概况 4 1 4 数据的主要内容 4 2 数据格式 4 3 数据的导入 4 3 1 从控制台上输入数据 4 3 2 上市
  • 异步模式之生产者与消费者

    1 定义 异步 由于存在消息队列 生产者产生的数据不能立刻被消费者处理 中间会有延迟 因此归为异步 异步与同步的区别 同步 线程A要请求某个资源 但是此资源正在被线程B使用中 因为同步机制存在 线程A请求不到 只能等待下去 异步 线程A要请
  • 存储过程违反GTID一致性的问题解决方法

    java sql SQLException Statement violates GTID consistency CREATE TEMPORARY TABLE 解决 2021 2 1项目现场反馈存储过程程序报错无法创建和删除临时表 语句违
  • io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further informati

    项目启动报错 io netty channel AbstractChannel AnnotatedConnectException Connection refused no further information 127 0 0 1 63
  • Linux访问ioctl访问失败的问题

    今天遇到一个ioctl访问失败的问题 做个记录 主要是用户态是32位 内核态时64位的 对于字符设备 内核中ioctl的挂接有不同 一 写64位driver驱动时 必须实现compat ioctl实现 用户态是32位时 会调用这个接口 否则
  • SpringBoot使用多线程

    一 概述 1 为什么使用多线程 在我们开发系统过程中 经常会处理一些好费时间的任务 如 向数据库中插入上百万数据 将会导致系统等待 这个时候就会自然想到使用多线程 2 为什么使用Spring来实现多线程 使用Spring比使用JDK原生的并
  • 企业人员信息管理(一)

    一 struts2和hibernate整合 1 整合 StrutsPrepareAndExecuteFilter作用详解 https blog csdn net clk esunny article details 80293978 过滤器
  • 跨境外贸业务,选择动态IP还是静态IP?

    在跨境业务中 代理IP是一个关键工具 它们提供了匿名的盾牌 有助于克服网络服务器针对数据提取设置的限制 无论你是需要经营管理跨境电商店铺 社交平台广告投放 还是独立站SEO优化 代理IP都可以让你的业务程度更加丝滑 达到事半功倍的效果 代理
  • python是不是面向对象的程序设计语言是_Python是一种面向对象程序设计语言

    Python是一种面向对象程序设计语言 答 正确 中国大学MOOC 构建人类命运共同体 要求在政治上 答 相互尊重 平等协商 成人膀胱空虚时膀胱尖不超过 答 耻骨联合上缘 课堂教学中常采用 读一读 议一议 练一练 讲一讲 的教学方式 这符合
  • 百度文心一言可以接入微信小程序啦!

    文心一言 英文名 ERNIE Bot 是百度全新一代知识增强大语言模型 文心大模型家族的新成员 能够与人对话互动 回答问题 协助创作 高效便捷地帮助人们获取信息 知识和灵感 接入小程序效果图 1 百度智能云 千帆大模型平台 注册登录账号 2
  • Qt Creator增强套装16.9.27.12更新

    HI 大家好 这里是jiangcaiyang 我们很高兴地告诉大家 我们将要发布Qt Creator增强套装新的版本了 这一次呢 主要是应大家强烈的要求 更新了我们的聊天神器 萌梦聊天室 现在它不再频繁地崩溃以及暂时性地无法回消息了 这个聊
  • docker安装seata

    下载seata docker镜像 docker pull seataio seata server 1 4 2 创建挂载目录和文件 mkdir p opt docker seata conf touch opt docker seata c
  • 创建老版本react-native项目,以0.59.10为例(0.60.0之前的版本)

    目录 创建react native 0 59 10版本项目前言 开始创建react native 0 59 10版本 创建react native 0 59 10版本项目前言 写这篇文章之前 有些东西要说明一下 当前rn的最新版本为 0 7
  • JavaFx转换为exe

    要点 首先导入依赖 在pom xml导入依赖 具体解释 而maven的两种方式 前者生成两个文件 程序jar包与复制所需的依赖jar包到lib目录 操作比较繁琐 而且在exe4j中进行打包的话会出现Caused by java lang N
  • JS基础知识(二十八):箭头函数

    1 箭头函数的使用 箭头函数有两种格式 一种只包含一个表达式 没有 和 return 一种包含多条语句 这个时候 return 就不能省略 箭头函数类型 代码 没有参数 gt 100 function return 10 一个参数 x gt
  • 使用Initramfs挂载根文件系统,编译过程multiple target patterns(多个目标匹配)问题的解决

    编译内核前 配置内核用Initramfs挂载根文件系统 配置选项如下 Genera setup gt Initial RAM filesystem and RAM disk initramfs initrd support home myr