NetApp ONTAPから他サーバに気軽にsshできる穴がふさがれてしまった

NetApp ONTAP 9.xに長らく存在していた diagアカウントをロックしていても、lsなどのコマンドを実行できる、という技があった。

ontap98::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

ontap98::*> systemshell -node localhost -command ls /
  (system node systemshell)
BUILD                           mroot_late
COMPAT.TXT                      mroot_late.tgz
COPYRIGHT                       netapp_nodar_build_check
INSTALL                         nfsroot
README.TXT                      ontap
VERSION                         ovl
bin                             partner
boot                            platform
cap.xml                         proc
cfcard                          root
clus                            sbin
dev                             sim
etc                             sldiag
fw                              tmp
kmip                            usr
lib                             var
libexec                         varfs.tgz
mnt                             vs_conf_files.tgz
mroot                           webjail
mroot.tgz

ontap98::*>

ONTAP 9.10.1でも使えていたのだが、Active Directory暗号化問題パッチを適用したONTAP 9.10.1P12で試したところ、実行できなくなっていた。

netapp9101::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

netapp9101::*> systemshell -node localhost -command ls /
  (system node systemshell)

Error: command failed: Error: Account currently locked. Contact the storage
       administrator to unlock it.

netapp9101::*>

え!?と調べたら ONTAP 9.12.1リリースのころからのパッチバージョンから使えなくなっていた模様。

diagアカウントがロックされている場合は、systemshellを禁止します

以降のバージョンが対象
9.7P22
9.8P15
9.9.1P13
9.10.1P9
9.11.1P5.
9.12.1.
9.13.0
9.13.1.

ということで、いまのONTAPだとdiag モードのロックを解除しないと実行できなくなっていました。

公式の解除手順 SystemShell diagユーザアカウントのロックを解除する方法

上記手順だと、diagユーザアカウントにパスワードを設定していますが、「systemshell -node localhost -command コマンド」で実行する場合はパスワード設定は必須ではありません。

現在のdiagユーザのロック状況を確認「security login show -username diag」(バージョンによっては security login show -user-or-group-name diag)

netapp9101::> security login show -username diag

Vserver: netapp9101
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
diag           console     password      admin            yes    none

netapp9101::>

「Acct Locked: yes」だとロックされている

「security login unlock -username diag」を実行して、ロック解除する

netapp9101::> security login unlock -username diag

netapp9101::> security login show -username diag

Vserver: netapp9101
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
diag           console     password      admin            no     none

netapp9101::>

ロック解除したあとであれば従来通り実行できた

netapp9101::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

netapp9101::*> systemshell -node localhost -command ls /
  (system node systemshell)
BUILD                           mroot_late
COMPAT.TXT                      mroot_late.tgz
COPYRIGHT                       netapp_nodar_build_check
INSTALL                         nfsroot
README.TXT                      ontap
VERSION                         ovl
bin                             partner
boot                            platform
cap.xml                         proc
cfcard                          root
clus                            sbin
dev                             sim
etc                             sldiag
fw                              tmp
kmip                            usr
lib                             var
libexec                         varfs.tgz
mnt                             vs_conf_files.tgz
mroot                           webjail
mroot.tgz

netapp9101::*>

なお、ONTAP OSの標準値が変わっていますので、利用が終わったら「security login lock -username diag」を実行してロック状態を戻しておきましょう

netapp9101::*> set admin

netapp9101::> security login lock -username diag

netapp9101::> security login show -username diag

Vserver: netapp9101
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
diag           console     password      admin            yes    none

netapp9101::>

NetAppのボリュームの言語設定についてのメモ

NetAppのボリュームには言語設定があり、設定内容に応じて使える日本語文字列が異なる。

2023年8月時点での最も対応できる範囲が広い設定は4バイトのUTF-8エンコード形式をサポートしている「utf8mb4」となる。

ドキュメント: マルチバイトを含むファイル名、ディレクトリ名、 qtree 名の ONTAP での処理

utf8mb4はONTAP 9.5以降で使える設定で、Windows側でファイル名に「サロゲート文字と補助文字」を含む文字をNetApp内に保存しようとする場合は、ボリュームがutf8mb4でなければ保存できない

なお、ONTP9.7P1以降では、UTF-8系言語をutf8mb4に変更できるようになっているとのこと(Can the volume language be changed after creation in ONTAP?)

問題は旧来から存在している言語設定である。

ONTAP 8.3.2(7-mode)にある日本語系設定
 ja (Japanese euc-j+)
 ja_v1 (Japanese euc-j)
 ja_JP.PCK (Japanese PCK(sjis)*)
 ja_JP.932 (Japanese cp932*)
 ja_JP.PCK_v2 (Japanese PCK(sjis))

ONTAP 9.10.1にある日本語系設定
 ja
 ja_JP.PCK
 ja.UTF-8
 ja_v1
 ja_v1.UTF-8
 ja_JP.PCK.UTF-8
 ja_JP.932
 ja_JP.932.UTF-8
 ja_JP.PCK_v2
 ja_JP.PCK_v2.UTF-8

問題はドキュメントにここらへんの説明が見当たらないこと

volume create」にある-languageオプションの解説は「Language code」としかなく、標準ではvserverのlanguageと同じとあるので「vserver create」を参照してもたいしたことは書いていない

[-language <Language code>] – Default Volume Language Code
This optionally specifies the default language encoding setting for the Vserver and its volumes. The recommended format is to append .UTF-8 for the language encoding values. For example, for the en_US language, the recommended format is en_US.UTF-8 . The default setting is C.UTF-8 .

NetApp KBに What is the difference between ja_JP.PCK.UTF-8 and ja_JP.PCK_v2.UTF-8? があるのだが

ja_JP.PCK uses cp932_v1.ntt and eucj_v1.ntt.
ja_JP.PCK_v2 uses cp932_v1.ntt and sjis_v2.ntt.

・・・いや説明になってないのでは?という記述のみ

ONTAP 8.3時代のドキュメントの「言語オプション一覧」もたいした記述は無い

ja_v1日本語(euc-j)
ja_v1.UTF-8日本語(euc-j)(UTF-8)
ja_jp.pck_v2日本語PCK(sjis)
ja_JP.PCK_v2.UTF-8日本語PCK(sjis)(UTF-8)

おそらくPCKはSolarisにおける「PC漢字コード」が由来と想定される。

Solaris 2.6 では、従来の日本語 EUC に加えて PCK (シフト JIS あるいは MS 漢字コード) で日本語を扱う環境を新たに提供します。PCK は、Microsoft が Windows3.1 で規定したマイクロソフト標準キャラクタセットと同等の文字集合およびエンコーディングを提供するものです。また、PCK は、従来の Solaris リリースで MS 漢字コード (または シフト JIS) と呼ばれていたものに、ユーザー定義文字やベンダー定義文字を加えたもので、JIS X 0201、JIS X 0208 の 1-84 区 (13 区除く) までに関しては従来のものと互換性があります。

これがベースであるとすれば、PCKはWindows 3.1ベースのもので、PCK_v2はWindows それ以降対応。ONTAP 7.2などで既にPCK_v2は存在していたので、Windows2000ぐらいをベースにしていると想定される。

詳細を探すとSolaris 8のマニュアル PCK(5) に記載があった。

(内容については省略)

同じくONTAP 7.2ぐらいでja_v1, ja_JP.UTF-8 が登場していた。

cp932/932はMicrosoftコードページ932 と呼ばれるWindows 3.1J用にマイクロソフトとNECが定義したShift JISの独自拡張となる。

定義的に考えると、cp932とpckは同一ということになるのだが、先に出てきたWhat is the difference between ja_JP.PCK.UTF-8 and ja_JP.PCK_v2.UTF-8? によると、NetAppのPCKには、cp932範囲の他にも含まれているものがある、ということになる。

で・・・

これ以上の情報が見つからないのである

困ったもんだ

メモ veeamバックアップの資料 2023/07/06版

Veeamバックアップの資料を調べたのでメモ

とりあえずの基本: Veeam Help Center Technincal DocumentのVeeam Backup&Replication

物理サーバを取る場合につかうVeeam Agentの資料:for Windowsfor Linux

Veeamのソフトウェアバージョン確認

Build Numbers and Versions of Veeam Backup & Replication

Build Numbers and Versions of Veeam Agent for Microsoft Windows

Build Numbers and Versions of Veeam Agent for Linux

NetApp 切り替え時 メモ書き

ボリューム言語切り替えは面倒

NetAppのボリューム言語をja_JP.PCKからutf8mb4に変えたいな、と思うとsnapmirrorでのボリューム以降ではなくて、rsyncやrobocopyなどを使ってコピーする必要がある。

例えば、robocopyでやるなら以下の様なバッチファイルを動かしてコピーする

@echo off
set TIME2=%TIME: =0%
set LOGDATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%-%TIME2:~0,2%%TIME2:~3,2%
robocopy \\netappfs\shares1  \\netappfsnew\shares1 /mir /copyall /R:0 /W:0 /LOG+:D:\LOGS\netappfs-shares1-%LOGDATE%.txt
robocopy \\netappfs\document \\netappfsnew\document /mir /copyall /R:0 /W:0 /LOG+:D:\LOGS\netappfs-document-%LOGDATE%.txt

D:\LOGS に実行ログを吐き出すが、バッチファイルの実行開始時間を元にしたファイル名となるので、ログ確認がしやすい

失敗した切り替え手順

IPアドレスが確保出来なかったということなので、旧NetAppのサービス用IP と 新NetAppの仮接続用IPしかない、ということなので

旧NetAppのネットワークケーブル抜いてから
新NetApp側のIPアドレスを切り替えてAD参加
旧NetApp側のIPアドレスを新NetAppについてた仮接続用IPに切り替え
旧NetAppのネットワークケーブルを接続して、AD参加

ということをやればいいかなーと以下の手順で実施した。

が・・・これだと旧NetAppがnetappfsとして参加していた情報の方が勝つらしく、12の段階で旧サーバがnetappfsだとしてAD上のアクセス情報を持っていこうとしているっぽく、問題が発生した。

このため新NetAppをもう1度Active Directoryに参加させるという対処を行う羽目になった。

  1. 旧NetAppが ADに netappfs で参加している
  2. 新NetAppが ADに netappfsnew で参加してデータ移行
    新::> vserver cifs create -vserver netappfs -cifs-server netappfsnew
  3. 切り替え日
  4. 旧NetAppのADをdown
     旧::> vserver cifs modify -vserver netappfs -state-admin down
  5. 新NetAppのADをdown
     新::> vserver cifs modify -vserver netappfs -state-admin down
  6. 旧NetAppのネットワークケーブルを外す
     (旧NetAppのIPアドレスは変更していない)
  7. 新NetAppでIPを引き継ぎ
    新::> network interface modify -vserver netappfs -lif ~ -address サービス用IP
  8. 新NetAppをnetappfsとしてAD参加
     新::> vserver cifs modify -vserver netappfs -cifs-server netappfs
  9. 新NetAppにクライアントからアクセスできるか確認
     問題ないことを確認
  10. ケーブルを外した状態で旧NetAppのIPを変更
    旧::> network interface modify -vserver netappfs -lif ~ -address 別IP1
  11. 旧NetAppのネットワークケーブルをつなぐ
  12. 旧NetAppをAD再参加
     旧::> vserver cifs modify -vserver netappfs -cifs-server netappfs-old
      → クライアントから新NetApp(netappfs)にアクセスできなくなる
       新NetAppで「vserver cifs check」コマンドを実行すると
       「down SecD Error: no server available」といったエラーが出ている
  13. 新NetAppのAD登録名を一時的に別のものに参加したあと、正式名で再参加
     新::> vserver cifs modify -vserver netappfs -state-admin down
     新::> vserver cifs modify -vserver netappfs -cifs-server netappfstmp
     新::> vserver cifs modify -vserver netappfs -state-admin down
     新::> vserver cifs modify -vserver netappfs -cifs-server netappfs
      → クライアントから新NetApp(netappfs)にアクセスできるようになる

同じではないが、OUがちゃんと変更されていない場合の再変更手順「Organizational Unit (OU) is not updated in ONTAP after Active Directory object move」を見ると「vserver cifs stop -vserver netappfs」で止めたあと、もう1回「vserver cifs modify -vserver netappfs -cifs-server netappfs -ou OU=NewOU」と実行する、という風になっていた

いつもの切り替え手順

いつもは旧NetAppのサービス用IP と 新NetAppの仮接続用IP、旧NetAppの仮接続用IPの3つを用意してもらって切り替えている

1. 旧NetAppが ADに netappfs で参加している
2. 新NetAppが ADに netappfsnew で参加してデータ移行
  新::> vserver cifs create -vserver netappfs -cifs-server netappfsnew
3. 切り替え日
4. 旧NetAppのADをdown
 旧::> vserver cifs modify  -vserver netappfs -state-admin down
5. ケーブルを外した状態で旧NetAppのIPを変更
  旧::> network interface modify -vserver netappfs -lif ~ -address 旧NetAppの仮接続用IP
6. 旧NetAppをAD再参加
 旧::> vserver cifs modify  -vserver netappfs -cifs-server netappfs-old
7. 新NetAppのADをdown
 新::> vserver cifs modify  -vserver netappfs -state-admin down
8. 新NetAppでIPを引き継ぎ
  新::> network interface modify -vserver netappfs -lif ~ -address サービス用IP
9. 新NetAppをnetappfsとしてAD参加
 新::> vserver cifs modify  -vserver netappfs -cifs-server netappfs
10. 新NetAppにクライアントからアクセスできるか確認
 問題ないことを確認

メモ

secd logにログが出ているらしい?

/mroot/etc/log/mlog/secd.log というパス? (Overview of ONTAP Logs)

SVMのマシンアカウントのパスワードを再設定する「vserver cifs domain password reset」を実行することで解消する?


2023/11/23追加

Windowsサーバ→NetAppのrobocopy実行時にいくつか問題がある

(1) audit/監査設定周り

Windowsサーバ上で監査設定をちゃんと使っている場合、NetApp ONTAP側で使える監査機能との差異によって監査設定が期待通りにコピーできずにrobocopyがエラーになる。

具体的には「/copyall」もしくは「/copy:DATSOU」ではエラーとなる

robocopy D:\share\ \\netapp\share\ /COPYALL /MIR /B /EFSRAW /R:1 /W:1 /NP
<略>
	          古い		   3.0 g	SW_DVD5_Windows_Svr_DC_EE_SE_Web_2008_R2_64Bit_Japanese_w_SP1_MLF_X17-22600.ISO
2023/11/01 xx:xx:xx エラー 31 (0x0000001F) NTFS セキュリティをコピー先ファイルにコピーしています D:\share\ISO\SW_DVD5_Windows_Svr_DC_EE_SE_Web_2008_R2_64Bit_Japanese_w_SP1_MLF_X17-22600.ISO
システムに接続されたデバイスが機能していません。
<略>
2023/11/01 xx:xx:xx エラー 32 (0x00000020) ファイルをコピーしています	F:\COMMON\document\testdocument.docx
プロセスはファイルにアクセスできません。別のプロセスが使用中です。
エラー: 再試行が制限回数を超えました。
<略>

(オマケ:Notepad++でrobocopyのログ確認する時は、「^(.+新しいディレクトリ).+\r\n」「^(.+新しいファイル).+\r」「^(.+更新済み).+\r\n」の3つを「」(置き換え文字列を何も指定しない)に置き換えると問題となっているファイルを探しやすい。英語の場合はNew Dir,Newer,New File,Modified)

How to move files to a NetApp CIFS server using Robocopy to retain Windows ACLs

Does robocopy need to use /copy:datso option if the source has Windows Mandatory Level permission? (対象がcloud volumes ONTAPと書いてあるが、一般のONTAPも対象)

Robocopy unable to set all ACLs on a file (The SACL includes a Mandatory Label which is not supported by ONTAP)

対象方法は「/copy:DATSO」でコピーする、とある

(2) 毎回modifyになるという事象

タイムスタンプまわりの挙動がWindowsサーバとONTAPとで違うらしく、それが差分と認識されることがあるようだ。

ただ、情報の更新だけが行われているようで、ファイルの実体コピーは行われていない模様


robocopyのログで出る「*EXTRA File」は、コピー先にしか存在しないファイル

代表的なrobocopyエラーコードと対処一覧

エラー 2 (0x00000002)→指定したフォルダが存在しない
エラー 5 (0x00000005)→アクセス権がない。robocopyに/Bオプションを付ける
エラー 31 (0x0000001F)→コピー先に元と同じNTFSセキュリティ設定が行えない(OS制約などの可能性)
エラー 32 (0x00000020)→ファイルがアプリケーションからロックされているのでアプリを閉じる
エラー 64 (0x00000040)→指定した共有にアクセスできない
エラー 87 (0x00000057)→指定した共有にアクセスするためのユーザ名/パスワード指定が誤っている
エラー 112(0x00000070)→コピー先容量が足らない

参考:SEの道標【robocopy】のログの見方、エラーコード一覧〜不一致、EXTRAS〜
robocopyのエラーコードはWin32のエラーコードそのままなので上記以外については 「Win32 Error Codes」を参照