内核编译不能找到standby.code错误解决办法

一 说明

使用全志(Allwinner )A20处理器,为其单独编译内核时,首次编译有时会遇到以下错误:

arch/arm/mach-sun7i/pm/standby.S:3: Error: file not found: arch/arm/mach-sun7i/pm/standby/standby.code

如下图所示:
这里写图片描述
其实不仅仅是该问题,还有以下几个错误:

arch/arm/mach-sun7i/pm/mem.S:3: Error: file not found: arch/arm/mach-sun7i/pm/standby/super/suspend/suspend.code

arch/arm/mach-sun7i/pm/mem.S:9: Error: file not found: arch/arm/mach-sun7i/pm/standby/super/resume/resume0.code

这两个问题其实和第一个问题是一个问题,第一个问题解决了这两个问题也会同时解决。

二 错误造成原因

该问题是在linux内核3.3版本中遇到的,并且是在全志官方提供的SDK(A20_SDK_20130319.tar.gz)中遇到的,用SDK中的脚本编译时有该问题,单独编译其中的内核(不使用SDK中的脚本,直接使用make编译内核源码)时也会遇到该问题,该问题只在第一次编译时出现,之后编译不会有该问题,如果distclean后编译可能会再遇到(未测试),遇到后的处理方法是一样的。
造成该问题的原因是arch/arm/mach-sun7i/pm/standby目录下的文件没有编译,至于为什么没有编译和之前怎么没有该问题等,在此处不讨论(关键是本人没有深入研究,也不知道原因),此处只说明遇到该问题后的解决办法。

三 解决办法

解决办法很简单,就是手动编译standby就好了。
此处需要注意的是,如果编译内核时的输出文件并非内核目录而是其他目录(make时使用了O参数,如make uImage O=/tmp/build),需要多做一些处理,这种情况在后边介绍。
打开standby目录下的Makefile,发现有两个变量KDIR和CROSS_COMPILE,由于该模块是单独手动编译,所以它不能从上层模块继承该变量,需要make时传进去。

#makefile for standby.bin

INCLUDE   = -I. \
        -I$(KDIR)/include \
        -I$(KDIR)/arch/arm/mach-sun7i/include \
... ...
CC = $(CROSS_COMPILE)gcc

知道需要的参数后就开始编译该模块:

#进入内核目录
$cd /home/linux/ex/linux-3.3/
#进入standby模块目录
$cd arch/arm/mach-sun7i/pm/standby
#编译模块
$make KDIR=/home/linux/ex/linux-3.3 CROSS_COMPILE=arm-linux-gnueabi-

此时就开始编译,编译过程中会有恨到打印信息,其中会出现以下4个信息:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

到此,模块编译完成,可以继续编译内核了。

上边提到编译内核时的输出文件并非内核目录而是其他目录,此时需要多两个操作:

  1. 修改该模块的Makefile
  2. 拷贝生成的.code文件到输出文件的对应目录

1)该模块编译时依赖内核配置时产生的include/generated下的头文件,所以需要将输出文件下的include路径添加到Makefile的INCLUDE变量中,添加后的Makefile如下:

#makefile for standby.bin

INCLUDE   = -I. \
        -I$(KDIR)/include \
        -I$(KDIR)/arch/arm/mach-sun7i/include \
        -I/tmp/build/include \

在Makefile中添加了-I/tmp/build/include \,其中/tmp/build是编译内核时的文件输出路径(make时的参数O的值)。
2)编译后要将生成的standby.code、suspend.code、resume0.code及resume1.code分别拷贝到编译目录(如/tmp/build)下的对应位置:

/tmp/build/arch/arm/mach-sun7i/pm/standby/
/tmp/build/arch/arm/mach-sun7i/pm/standby/suspend/
/tmp/build/arch/arm/mach-sun7i/pm/standby/resume/

到此,该问题解决。

<think>好的,我现在需要解决用户遇到的Hadoop问题,具体是当NameNode处于standby状态时,不支持WRITE操作,错误信息是“Operation category WRITE not supported in state standby”,用户希望找到解决方法。 首先,我要回忆一下Hadoop HDFS的高可用(HA)架构。通常,HA配置中有两个NameNode,一个处于Active状态,处理所有客户端请求,另一个处于Standby状态,作为热备。如果用户遇到WRITE操作在Standby节点上被拒绝,那可能是因为他们错误地尝试向Standby节点写入数据,而Active节点才是处理写入的。 接下来,我需要根据用户提供的引用内容来寻找解决方案。引用[3]提到需要检查NameNode的状态,引用[4]展示了如何用`hdfs haadmin -getServiceState`命令查看状态,而引用[5]则提到了手动切换状态的命令。这些引用都是关于READ操作的问题,但用户现在遇到的是WRITE操作的问题,不过根本原因类似,都是NameNode处于Standby状态。 可能的解决步骤包括: 1. 确认当前各个NameNode的状态,确定哪个是Active,哪个是Standby。 2. 如果Active节点确实处于Standby状态,需要手动切换到Active状态。 3. 检查自动故障转移的配置是否正确,比如ZooKeeper是否正常运行,是否自动故障转移未正确触发。 4. 检查配置文件如hdfs-site.xml,确保HA相关的配置正确无误,例如nameservice、RPC地址、HTTP地址等。 5. 查看日志文件,确认是否有其他错误导致Active节点无法正常工作。 需要注意的是,用户之前提供的引用中关于手动切换的命令是针对READ错误的,但同样的命令可能适用于WRITE问题,因为都是状态切换的问题。例如,使用`hdfs haadmin -transitionToActive`命令强制切换节点状态。同时,用户可能需要检查ZooKeeper的配置,如果启用了自动故障转移,ZooKeeper的健康状况可能影响节点状态。 另外,用户的问题中提到s.apache.org/sbnn-error链接,可能需要建议用户访问该链接获取更详细的错误说明和解决方案,但根据引用内容,用户可能已经参考过这个页面,所以需要更具体的步骤。 总结起来,解决方案应该包括检查状态、手动切换状态、验证配置和检查自动故障转移机制。同时要提醒用户谨慎使用强制切换命令,避免数据不一致的问题。</think>### 解决Hadoop Standby状态不支持WRITE操作的方法 #### 1. 确认NameNode状态 首先需检查当前NameNode的状态,确定哪个节点处于`Standby`模式: ```bash hdfs haadmin -getServiceState nn1 # 检查nn1节点状态 hdfs haadmin -getServiceState nn2 # 检查nn2节点状态 ``` 若发现本应为`Active`的节点处于`Standby`,则需手动切换[^4][^5]。 --- #### 2. 手动切换NameNode为Active状态 通过HA管理命令强制切换节点状态: ```bash hdfs haadmin -transitionToActive --forcemanual nn1 # 将nn1设为Active ``` *注意:* `--forcemanual`参数会绕过ZooKeeper的自动故障转移机制,需谨慎使用[^5]。 --- #### 3. 验证HA自动故障转移配置 若集群配置了自动故障转移(依赖ZooKeeper),需检查: 1. **ZooKeeper服务状态**:确保ZK集群正常运行 2. **ZKFC进程**:确认`ZKFailoverController`进程在NameNode节点存活 3. **配置参数**:检查`hdfs-site.xml`中以下配置: ```xml <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> ``` --- #### 4. 检查关键配置项 在`hdfs-site.xml`中确认HA基础配置正确: ```xml <!-- Nameservice名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- NameNode唯一标识列表 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- RPC地址配置 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop02:8020</value> </property> ``` --- #### 5. 查看日志定位根本原因 检查`NameNode`日志文件(通常位于`$HADOOP_HOME/logs/`): ```bash tail -100f hadoop-{user}-namenode-{hostname}.log ``` 重点关注以下关键词: - `Transitioning to standby state` - `Unable to become active` - `ZooKeeper session expired` --- #### 注意事项 1. 强制切换可能导致数据不一致,建议先执行`hdfs dfsadmin -safemode leave`退出安全模式 2. 切换完成后,通过Web UI(默认`http://<ActiveNN>:9870`)验证状态 3. 对于生产环境,建议优先修复自动故障转移机制而非手动干预 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值