oommf 提示 mmArchive 保存场文件失败
文章目錄
- 問(wèn)題描述
- 原因分析:
- 解決方案:
- 1.在mmarchive.tcl源碼中注釋掉檢查場(chǎng)文件“所有者”屬性的語(yǔ)句
- 2.新建一個(gè)非管理員用戶來(lái)運(yùn)行 oommf
問(wèn)題描述
最近第一次在操作系統(tǒng)為 Windows Server 的(云)服務(wù)器上使用 oommf 的過(guò)程中,發(fā)現(xiàn) oommf 的子程序 mmArchive 不能將(OVF格式)場(chǎng)文件保存到 .mif 文件所在的目錄中。在(云)服務(wù)器上的用戶類(lèi)型為“Administrator”,即管理員用戶。
這里使用新版本的oommf(OOMMF 2.0 beta 0 (30-Sep-2022)),它能更加詳細(xì)的提示 oommf 保存文件失敗的原因,如下:
< XX> mmArchive 2.0b0 warning:
Error replying to socket message
‘datafile {C:/Users/ADMINI~1/AppData/Local/Temp/XXX C:/Users/Administrator/XXX}’:
Can’t move file C:/Users/ADMINI~1/AppData/Local/Temp/XXX to C:/Users/Administrator/XXX:
File “C:/Users/ADMINI~1/AppData/Local/Temp/XXX” not owned by current user (BUILTIN/Administrators vs.XXX/Administrator)
(Net_Protocol)
從提示框中可以看出,oommf 提示需要保存的場(chǎng)文件不屬于當(dāng)前用戶。但是,我們可以在 oommf 的默認(rèn)緩存目錄中(C:/Users/ADMINI~1/AppData/Local/Temp/XXX)找到該場(chǎng)文件,只不過(guò)它的文件名并不規(guī)范。
原因分析:
oommf 的各個(gè)子程序之間是模塊化設(shè)計(jì)的,專(zhuān)門(mén)用于加載 .mif 文件并計(jì)算的子程序 Oxsii / Boxsi 會(huì)將需要保存的每一個(gè)場(chǎng)文件都存放在緩存目錄 “C:/Users/ADMINI~1/AppData/Local/Temp/XXX” 中,專(zhuān)門(mén)用于保存文件的子程序 mmArchive 會(huì)將緩存目錄中的場(chǎng)文件移動(dòng)到用戶指定的輸出目錄(默認(rèn)情況下就是 .mif 文件所在的目錄),接著對(duì)它以約定好的命名風(fēng)格進(jìn)行重命名。
在 mmArchive 移動(dòng)緩存目錄中的場(chǎng)文件到輸出目錄之前,它會(huì)先對(duì)緩存目錄中的場(chǎng)文件進(jìn)行一系列的文件屬性識(shí)別,詳情參考 oommf\app\mmarchive\mmarchive.tcl中的 proc CheckFileMove { f1 f2 errmsg_var } 函數(shù),其中關(guān)于對(duì)場(chǎng)文件的“所有者”屬性的識(shí)別語(yǔ)句如下:
if {![file owned $f1]} {set errmsg "File \"$f1\" not owned by current user"set sidfile [Oc_WinGetFileSID $f1]set siduser [Oc_WinGetCurrentProcessSID]set fileowner [Oc_WinGetSIDAccountName $sidfile]set user [Oc_WinGetSIDAccountName $siduser]if {[string compare $fileowner $user]!=0} {append errmsg " ($fileowner vs. $user)"} elseif {[string compare $sidfile $siduser]!=0} {append errmsg " ($sidfile vs. $siduser)"}if {[Oc_AmRoot]>0} {global tcl_platformif {[string compare windows $tcl_platform(platform)]==0} {append errmsg \"\nOOMMF applications should not be run as administrator"} else {append errmsg \"\nOOMMF applications should not be run as root"}}return 0 ;# Require ownership}通過(guò)判斷場(chǎng)文件的“所有者”屬性,從而 mmArchive 知道了該文件的“所有者”不屬于當(dāng)前用戶,于是就報(bào)錯(cuò)了。而且根據(jù)源碼中 if {[Oc_AmRoot]>0} 的提示可知:oommf 不應(yīng)該被“管理員”用戶(即Windows操作系統(tǒng)中的Administrator用戶,Linux操作系統(tǒng)中的Root用戶)運(yùn)行。
解決方案:
暫時(shí)找到兩個(gè)解決方法:
1.在mmarchive.tcl源碼中注釋掉檢查場(chǎng)文件“所有者”屬性的語(yǔ)句
這是最簡(jiǎn)單的方法!首先,完全關(guān)閉 oommf 。接著在 oommf\app\mmarchive\mmarchive.tcl 中的 proc CheckFileMove { f1 f2 errmsg_var } 函數(shù)里面直接注釋掉關(guān)于檢查場(chǎng)文件“所有者”這一屬性的語(yǔ)句,即注釋掉上文出現(xiàn)的代碼片段。最后,無(wú)需重新編譯,直接打開(kāi) oommf,就可以正常保存場(chǎng)文件了。
不過(guò),由于本人并沒(méi)有了解過(guò) oommf 的源碼,對(duì)它的設(shè)計(jì)思想也不了解,所以并不清楚在源碼中注釋掉這一代碼片段會(huì)有什么潛在的影響,或者說(shuō)場(chǎng)文件的“所有者”屬性對(duì) oommf 到底有什么作用。 但目前來(lái)看,確實(shí)沒(méi)看出有什么影響。
2.新建一個(gè)非管理員用戶來(lái)運(yùn)行 oommf
這個(gè)方法稍微麻煩一點(diǎn)!在不修改 oommf 源碼的情況下,根據(jù)上文代碼片段中的錯(cuò)誤提示信息,我們不用管理員的用戶身份去運(yùn)行 oommf,而是新建一個(gè)普通用戶來(lái)運(yùn)行。
關(guān)于如何在Windows Server(Windows 10 類(lèi)似)上新建用戶的操作請(qǐng)參考:
windows server 2012r2 如何新建一個(gè)用戶并且可以遠(yuǎn)程登錄
關(guān)于在遠(yuǎn)程登錄新建用戶的賬號(hào)時(shí)可能遇到的問(wèn)題,請(qǐng)參考:
連接被拒絕 因?yàn)闆](méi)有授權(quán)此用戶賬戶進(jìn)行遠(yuǎn)程登錄
windows server 2016 開(kāi)啟多用戶登陸
總結(jié)
以上是生活随笔為你收集整理的oommf 提示 mmArchive 保存场文件失败的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 7-42 愿天下有情人都是失散多年的兄妹
- 下一篇: 阿里云资深技术专家易立:我对云原生软件架