md: kicking non-fresh sda6 from array!

本文介绍了一种解决Linux RAID阵列中硬盘被踢出问题的方法。通过使用mdadm工具,可以有效地移除并重新添加有问题的磁盘,从而恢复正常工作。
原贴:http://www.linuxquestions.org/questions/linux-general-1/md-kicking-non-fresh-sda6-from-array-416853/

md: kicking non-fresh sda6 from array!

Hello,

I have some raid1 failures on my computer. How can I fix this?

# dmesg | grep md
ata1: SATA max UDMA/133 cmd 0xBC00 ctl 0xB882 bmdma 0xB400 irq 193
ata2: SATA max UDMA/133 cmd 0xB800 ctl 0xB482 bmdma 0xB408 irq 193
md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: raid1 personality registered as nr 3
md: md2 stopped.
md: bind<sdb9>
md: bind<sda9>
raid1: raid set md2 active with 2 out of 2 mirrors
md: md1 stopped.
md: bind<sda6>
md: bind<sdb6>
md: kicking non-fresh sda6 from array!
md: unbind<sda6>
md: export_rdev(sda6)
raid1: raid set md1 active with 1 out of 2 mirrors
md: md0 stopped.
md: bind<sda5>
md: bind<sdb5>
md: kicking non-fresh sda5 from array!
md: unbind<sda5>
md: export_rdev(sda5)
raid1: raid set md0 active with 1 out of 2 mirrors
EXT3 FS on md2, internal journal
EXT3 FS on md0, internal journal
EXT3 FS on md1, internal journal


# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb5[1]
4883648 blocks [2/1] [_U]

md1 : active raid1 sdb6[1]
51761280 blocks [2/1] [_U]

md2 : active raid1 sda9[0] sdb9[1]
102799808 blocks [2/2] [UU]

unused devices: <none>


# e2fsck /dev/sda5
e2fsck 1.37 (21-Mar-2005)
/usr: clean, 18653/610432 files, 96758/1220912 blocks (check in 3 mounts)

# e2fsck /dev/sda6
e2fsck 1.37 (21-Mar-2005)
/var: clean, 7938/6471680 files, 350458/12940320 blocks (check in 3 mounts)
username is already is offline     Reply With Quote
Old 02-18-2006, 11:03 PM   #2
Senior Member
 
Registered: Jan 2005
Location: Manalapan, NJ
Distribution: Fedora x86, x86_64, PPC
Posts: 3,506
This can happen after an unclean shutdown (like a power fail). Usually removing and re-adding the problem devices will correct the situation:

/sbin/mdadm /dev/md0 --fail /dev/sda5 --remove /dev/sda5
/sbin/mdadm /dev/md0 --add /dev/sda5

/sbin/mdadm /dev/md1 --fail /dev/sda6 --remove /dev/sda6
/sbin/mdadm /dev/md1 --add /dev/sda6
macemoneta is offline     Reply With Quote
Old 02-19-2006, 04:04 AM   #3
Newbie
 
Registered: Dec 2005
Posts: 4
Yes, that is exactly what happend. There was a problem with a UPS.

Problem solved and everyone happy.

Thanks!
username is already is offline     Reply With Quote
Old 01-23-2007, 01:09 PM   #4
LQ Newbie
 
Registered: Jan 2007
Posts: 6
Quote:
Originally Posted by macemoneta
This can happen after an unclean shutdown (like a power fail). Usually removing and re-adding the problem devices will correct the situation:

/sbin/mdadm /dev/md0 --fail /dev/sda5 --remove /dev/sda5
/sbin/mdadm /dev/md0 --add /dev/sda5

/sbin/mdadm /dev/md1 --fail /dev/sda6 --remove /dev/sda6
/sbin/mdadm /dev/md1 --add /dev/sda6
Thank you!!! I had the same problem and it's now fixed!

CD
Complicated Disaster is offline     Reply With Quote
Old 06-03-2007, 11:09 PM   #5
Member
 
Registered: Jul 2003
Location: MA
Distribution: Ubuntu
Posts: 33
This came in handy for me too - I had a bad shutdown recently and my array didn't come back on it's own. ...I thought I had lost a disk! (67.7% recovered and climbing - Whooooohoo!)
the_tflk is offline     Reply With Quote
Old 07-29-2007, 07:34 AM   #6
LQ Newbie
 
Registered: Jul 2006
Posts: 8
Same here. This thread saved my day


Now my raid is syncing since sda6 and sda5 failed.


Personalities : [raid1]
md0 : active raid1 sda6[2] sdb6[1]
238275968 blocks [2/1] [_U]
[==>..................] recovery = 10.2% (24469056/238275968) finish=64.3min speed=55398K/sec

md2 : active raid1 sda5[0] sdb5[1]
5855552 blocks [2/2] [UU]

Last edited by jostmart : 07-29-2007 at 07:36 AM.
jostmart is offline  
Tag This Post raid1, raid, sync, mdadm
Reply With Quote
Old 08-12-2007, 05:46 AM   #7
LQ Newbie
 
Registered: Jan 2006
Location: Ukraine
Distribution: Debian, Ubuntu, Fedora
Posts: 21
Just helped me. Thanks!
gneeot is offline    
 
<think>好的,用户想查找关于AGameSession::KickPlayer函数的实现细节或调试信息。首先,我需要回忆Unreal Engine中游戏会话相关的类结构。AGameSession是负责管理多人游戏会话的类,KickPlayer通常用于踢出玩家。根据引用[3]提到网络复制和多人游戏相关内容,可能与此相关。 接下来,我需要定位这个函数的源码。在Unreal Engine的代码库中,AGameSession的实现在GameSession.h和GameSession.cpp里。不过具体版本可能有差异,用户可能用的是UE4或UE5。KickPlayer函数一般会处理玩家离开的逻辑,可能调用网络相关的函数,比如DestroySession或关闭连接。 另外,引用[2]提到C++与Unreal API交互,所以检查C++部分的实现。KickPlayer可能需要访问玩家的PlayerController,并调用Destroy或断开连接的方法。比如,可能调用APlayerController::ClientTravel强制玩家切换到其他服务器,或者调用UNetDriver::DisconnectClient。 调试方面,用户可能需要断点调试。在Visual Studio中,找到AGameSession::KickPlayer的实现,设置断点,观察调用堆栈和参数。引用[4]提到伤害系统的事件处理,类似地,踢出玩家可能触发某些事件,需要检查日志输出或使用UE_LOG记录信息。 此外,引用[5]提到FRotator的结构,虽然不直接相关,但说明代码中的某些细节可能在编辑器显示和C++中存在差异,需要注意变量对应关系。例如,PlayerId参数可能对应玩家的网络ID或其他标识符。 用户可能遇到的问题包括函数未被正确重写,或者网络同步问题。需要确认是否在子类中正确覆盖了KickPlayer,以及网络权限是否正确处理(如仅在服务器执行)。引用[3]的网络复制原理可能与此相关,确保函数在服务器端调用,并同步到客户端。 总结回答结构:先介绍函数的作用和源码位置,然后分析实现步骤,提供调试方法,最后注意事项和相关引用。需要确保回答清晰,帮助用户逐步解决问题。</think>关于Unreal Engine中$AGameSession::KickPlayer$函数的实现细节和调试方法,以下是分步骤解析: --- ### 一、函数作用与源码定位 1. **核心功能** $KickPlayer$用于将指定玩家从当前游戏会话中强制断开连接,常用于处理违规玩家或服务器管理[^3]。其函数签名通常为: ```cpp virtual void KickPlayer(APlayerController* KickedPlayer, const FText& KickReason); ``` 2. **源码位置** - 头文件:`/Engine/Source/Runtime/Engine/Classes/GameFramework/GameSession.h` - 实现文件:`/Engine/Source/Runtime/Engine/Private/GameSession.cpp` (实际路径可能因引擎版本不同略有差异) --- ### 二、实现细节分析 1. **基础流程** 典型实现会包含以下操作: ```cpp void AGameSession::KickPlayer(APlayerController* KickedPlayer, const FText& KickReason) { if (KickedPlayer) { // 发送断开连接通知 KickedPlayer->ClientWasKicked(KickReason); // 强制玩家离开 KickedPlayer->Destroy(); } } ``` 此逻辑通过$ClientWasKicked$通知客户端断开连接,然后销毁玩家控制器[^2][^3]。 2. **网络同步关键点** - 仅服务器端可执行此操作(通过`Role == ROLE_Authority`校验) - 需确保玩家控制器的网络连接有效(通过$GetNetConnection()$验证) --- ### 三、调试方法 1. **断点调试** 在GameSession.cpp中设置断点,观察调用堆栈: ```cpp // 断点示例位置 void AGameSession::KickPlayer(...) { UE_LOG(LogGameSession, Log, TEXT("Kicking player %s"), *GetNameSafe(KickedPlayer)); // 添加调试日志 // ... } ``` 2. **日志输出验证** 在Output Log中过滤`LogGameSession`类别,观察玩家断开时的日志信息。 3. **网络状态监控** 使用控制台命令`net.NetAnalytics 1`查看玩家连接状态变化[^3]。 --- ### 四、自定义扩展建议 若需修改踢出逻辑,应在子类中重写此函数: ```cpp // 自定义GameSession类声明 UCLASS() class MYGAME_API AMyGameSession : public AGameSession { GENERATED_BODY() virtual void KickPlayer(APlayerController* KickedPlayer, const FText& KickReason) override; }; // 实现新增逻辑 void AMyGameSession::KickPlayer(...) { Super::KickPlayer(...); // 添加自定义行为(如记录封禁信息) } ``` --- ### 五、注意事项 1. **权限验证** 必须通过`GetWorld()->GetAuthGameMode()`确保仅在服务器端执行。 2. **异步处理** 对已断开的玩家控制器执行操作可能导致崩溃,应添加有效性检查: ```cpp if (IsValid(KickedPlayer)) { // 安全操作 } ``` 3. **跨平台兼容** 不同平台的连接断开行为可能不同,需在目标平台测试验证[^3][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值