oommf 提示 mmArchive 保存场文件失败
文章目錄
- 問題描述
- 原因分析:
- 解決方案:
- 1.在mmarchive.tcl源碼中注釋掉檢查場文件“所有者”屬性的語句
- 2.新建一個非管理員用戶來運行 oommf
問題描述
最近第一次在操作系統為 Windows Server 的(云)服務器上使用 oommf 的過程中,發現 oommf 的子程序 mmArchive 不能將(OVF格式)場文件保存到 .mif 文件所在的目錄中。在(云)服務器上的用戶類型為“Administrator”,即管理員用戶。
這里使用新版本的oommf(OOMMF 2.0 beta 0 (30-Sep-2022)),它能更加詳細的提示 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 提示需要保存的場文件不屬于當前用戶。但是,我們可以在 oommf 的默認緩存目錄中(C:/Users/ADMINI~1/AppData/Local/Temp/XXX)找到該場文件,只不過它的文件名并不規范。
原因分析:
oommf 的各個子程序之間是模塊化設計的,專門用于加載 .mif 文件并計算的子程序 Oxsii / Boxsi 會將需要保存的每一個場文件都存放在緩存目錄 “C:/Users/ADMINI~1/AppData/Local/Temp/XXX” 中,專門用于保存文件的子程序 mmArchive 會將緩存目錄中的場文件移動到用戶指定的輸出目錄(默認情況下就是 .mif 文件所在的目錄),接著對它以約定好的命名風格進行重命名。
在 mmArchive 移動緩存目錄中的場文件到輸出目錄之前,它會先對緩存目錄中的場文件進行一系列的文件屬性識別,詳情參考 oommf\app\mmarchive\mmarchive.tcl中的 proc CheckFileMove { f1 f2 errmsg_var } 函數,其中關于對場文件的“所有者”屬性的識別語句如下:
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}通過判斷場文件的“所有者”屬性,從而 mmArchive 知道了該文件的“所有者”不屬于當前用戶,于是就報錯了。而且根據源碼中 if {[Oc_AmRoot]>0} 的提示可知:oommf 不應該被“管理員”用戶(即Windows操作系統中的Administrator用戶,Linux操作系統中的Root用戶)運行。
解決方案:
暫時找到兩個解決方法:
1.在mmarchive.tcl源碼中注釋掉檢查場文件“所有者”屬性的語句
這是最簡單的方法!首先,完全關閉 oommf 。接著在 oommf\app\mmarchive\mmarchive.tcl 中的 proc CheckFileMove { f1 f2 errmsg_var } 函數里面直接注釋掉關于檢查場文件“所有者”這一屬性的語句,即注釋掉上文出現的代碼片段。最后,無需重新編譯,直接打開 oommf,就可以正常保存場文件了。
不過,由于本人并沒有了解過 oommf 的源碼,對它的設計思想也不了解,所以并不清楚在源碼中注釋掉這一代碼片段會有什么潛在的影響,或者說場文件的“所有者”屬性對 oommf 到底有什么作用。 但目前來看,確實沒看出有什么影響。
2.新建一個非管理員用戶來運行 oommf
這個方法稍微麻煩一點!在不修改 oommf 源碼的情況下,根據上文代碼片段中的錯誤提示信息,我們不用管理員的用戶身份去運行 oommf,而是新建一個普通用戶來運行。
關于如何在Windows Server(Windows 10 類似)上新建用戶的操作請參考:
windows server 2012r2 如何新建一個用戶并且可以遠程登錄
關于在遠程登錄新建用戶的賬號時可能遇到的問題,請參考:
連接被拒絕 因為沒有授權此用戶賬戶進行遠程登錄
windows server 2016 開啟多用戶登陸
總結
以上是生活随笔為你收集整理的oommf 提示 mmArchive 保存场文件失败的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-42 愿天下有情人都是失散多年的兄妹
- 下一篇: 阿里云资深技术专家易立:我对云原生软件架