BLOGTIMES
» ArchiveList (Tag for "sh / windows" )
«Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
2023/03/25

OmniOS/ZFS サーバに wbadmin でイメージバックアップが取れない時に確認すべきこと

omnios  windows 

以前、SMB 2.0 以降を使う Samba サーバの共有フォルダを対象にして Windows のイメージバックアップを取ろうとすると Sparse File の関係でバックアップが取れたり取れなかったりするという問題がありました。

同じような問題が OmniOS(illumos) でも発生していたので困っていました。
OmniOS は Open Solaris の系譜なので、ファイル共有は Samba ではなく Kernel 内蔵の smb です。
というわけで、Linux のSamba と同じテクニックは使えず、原因も Sparse File ではありません。

まず、結論から

いつも通り、解決するための結論から書いて置きます。

以下のようなコマンドで zfs 共有の nbmand(Non Blocking mandatory locks)*1*2 プロパティを on にしてやります。

zfs set nbmand=on tank/share

どうもこの nbmand というプロパティが off だとクライアントがファイルをうまくロックすることができず、これが原因になっていたようです。

nbmand のデフォルトは off ですし、おそらくパフォーマンス等に対するペナルティもあると思われるので、今回はバックアップに使う共有でだけ on にしています。Open Solaris の時から nbmandcross-protocol locking (例えば NFS と SMB を同時に使う)が必要な時だけ on にする必要がある*3という認識だったのですが、どうやらちょっと僕の認識が間違っていたようです。これまで off でもファイルサーバとしては特に問題になる挙動に当たったことがなかったのですが、このあたり近日中に詳しく調べてみたいと思います。

実際に発生するエラー

実際にバックアップを取ろうとすると発生するエラーは以下のような感じです。

Microsoft Windows [Version 10.0.22621.1413] (c) Microsoft Corporation. All rights reserved. C:\Windows\System32>wbadmin start backup -backuptarget:\\192.168.0.1\path\to\dir -include:c: -allCritical -quiet wbadmin 1.0 - バックアップ コマンドライン ツール (C) Copyright Microsoft Corporation. All rights reserved. 注意: この保存先では、バックアップ データを安全に保護することはできません。 リモート共有フォルダーに保存されたバックアップは、ネットワーク上の他の ユーザーによってアクセスされる可能性があります。バックアップは、信頼できる ユーザーがアクセスする場所か、セキュリティ対策が実施されているネットワーク にのみ保存してください。 ボリューム情報を取得しています... これにより (EFI システム パーティション),(C:),(\\?\Volume{00000000-0000-0000-0000-000000000000}\) が \\192.168.0.1\path\to\dir にバックアップされます。 \\192.168.0.1\path\to\dir へのバックアップ操作を開始しています。 バックアップに指定されたボリュームのシャドウ コピーを作成しています... バックアップに指定されたボリュームのシャドウ コピーを作成しています... ボリューム (EFI システム パーティション) (100.00 MB) のバックアップを完了できませんでした。エラー: プロセスはファイルにアクセ スできません。別のプロセスがファイルの一部をロックしています。 バックアップ操作の概要: ----------------------- バックアップ操作が完了する前に停止しました。 バックアップ操作が完了する前に停止しました。 エラーの詳細: プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。 正常にバックアップされたファイルのログ: C:\WINDOWS\Logs\WindowsBackup\Backup-25-03-2023_15-08-17.log バックアップに失敗したファイルのログ: C:\WINDOWS\Logs\WindowsBackup\Backup_Error-25-03-2023_15-08-17.log バックアップ セットのいずれかのボリュームのバックアップ イメージを準備しているときにエラーが発生しました。 プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。

at 19:59 |
2023/02/17

xargs で複数のコマンドを実行する

sh  cli 

xargs を使って複数のコマンドを一度に実行する方法がないかと思って調べてみました。

sh -c と組み合わせて、以下のような感じで実行しているパターンが多いようです。
例えばこの例だと find で探したファイルに対して chown でオーナーを変えつつ、パーミッションも同時に変更することができます。

find . -type f | xargs -i sh -c 'chown root "{}" && chmod 600 "{}"'

参考


    at 15:58 |
    2022/12/05

    File Locksmith でファイルをロックしているプロセスを探す

    windows  windows11 
    File Locksmith - File Locksmith でファイルをロックしているプロセスを探す

    以前、Windows でファイルをロックしているプロセスを調べることができる LockHunterというアプリについてのエントリを書きましたが、これと同じことをすることができる MS 謹製の File Locksmith というユーティリティをみつけました。PowerToys というユーティリティ群のひとつとして搭載されています。

    導入する場合、以下の GitHub のリリースから PowerToys としてダウンロードすることになります。

    使い方はファイルを右クリックして「このファイルは何で利用していますか?」という項目を選択するだけです。PowerToys は File Locksmith に限らず便利なツールがいろいろ揃っているので、導入しておくと良いと思います。

    PowerToysWindows 用の File Locksmith ユーティリティ | Microsoft Learn

    エクスプローラー内の 1 つ以上のファイルまたはディレクトリを選択します。 ディレクトリが選択されている場合、そのすべてのサブファイルとサブディレクトリもスキャンされます。 がアクティブ化されると File Locksmith 、アクセスできる実行中のすべてのプロセスがスキャンされ、使用しているファイルが確認されます。


      at 21:11 |
      2022/03/02

      AI Suite III の代わりに使える「Fan Control」

      windows  asus 
      Fan Control - AI Suite III の代わりに使える「Fan Control」

      ASUS の AI Suite 3 の代わりに使えるファンコントロールユーティリティを見つけたのでメモ。

      AI Suite 3 は一旦インストールしてしまうと微妙なので・・・

      ASUS のマザーボードには専用のユーティリティとして AI Suite 3 というものがあるのですが、これがちょっと曲者で、アンインストールしてもファイルやサービスが残ってしまったり、一旦構成が壊れると再インストールしても動かなかったりでどうしようもありません。

      もちろんファンスピードは UEFI から調整できるのですが、いちいち UEFI を起動するのも面倒なので Windows 上からファンコントロールできるサードパーティ製のアプリがないかと思って探してみたら、なんとか見つけることができました。今後は AI Suite 3 ではなく、こっちだけを使っていこうと思います。


        at 22:42 |
        2022/02/20

        Windows 上で .pfx/.p12 の中身を確認するには

        ssl  windows 

        Windows 上で .pfx の中身をチェックするためには certutil -dump (cert.pfx) のようにコマンドを使えば確認できますが、面倒なのでドラッグアンドドロップで確認できるスクリプトを書いてみました。

        show_pfx.bat

        @echo off cd /d %~dp0 for %%f in (%*) do ( echo "%%~nxf" certutil -dump "%%~dpf%%~nxf" ) pause

        実行例

        以下のような感じで証明書の中身が表示できます。
        ちなみに PFX のパスワード入力はエコーバック(画面表示)されないので注意しましょう。

        "www.example.com.pfx" PFX パスワードの入力: ================ 証明書 0 ================ ================ 開始入れ子のレベル 1 ================ 要素 0: シリアル番号: 00 発行者: OU=Security Communication RootCA2, O=SECOM Trust Systems CO.,LTD., C=JP この日以降: 2009/05/29 14:00 この日以前: 2029/05/29 14:00 サブジェクト: OU=Security Communication RootCA2, O=SECOM Trust Systems CO.,LTD., C=JP 署名は公開キーと一致します ルート証明書: サブジェクトと発行者は一致します Cert ハッシュ(sha1): 5f3b8cf2f810b37d78b4ceec1919c37334b9c774 ---------------- 終了入れ子のレベル 1 ---------------- キー プロバイダー情報がありません 暗号化の解除のための証明書と秘密キーが見つかりません。 ================ 証明書 1 ================ ================ 開始入れ子のレベル 1 ================ 要素 1: シリアル番号: 22b9b154f33c5e5e00 発行者: OU=Security Communication RootCA2, O=SECOM Trust Systems CO.,LTD., C=JP この日以降: 2018/08/22 16:41 この日以前: 2028/08/22 16:41 サブジェクト: CN=FujiSSL Public Validation Authority - G3, O=SECOM Trust Systems CO.,LTD., C=JP 非ルート証明書 Cert ハッシュ(sha1): e659885ddd3fd3e36b3a29ff6f94585e0b40de40 ---------------- 終了入れ子のレベル 1 ---------------- キー プロバイダー情報がありません 暗号化の解除のための証明書と秘密キーが見つかりません。 ================ 証明書 2 ================ ================ 開始入れ子のレベル 1 ================ 要素 2: シリアル番号: 99999999999999999999999999999999 発行者: CN=FujiSSL Public Validation Authority - G3, O=SECOM Trust Systems CO.,LTD., C=JP この日以降: 2099/99/99 99:99 この日以前: 2099/99/99 99:99 サブジェクト: CN=www.example.com.pfx 非ルート証明書 Cert ハッシュ(sha1): 9999999999999999999999999999999999999999 ---------------- 終了入れ子のレベル 1 ---------------- プロバイダー = Microsoft Enhanced Cryptographic Provider v1.0 暗号化のテストに合格しました CertUtil: -dump コマンドは正常に完了しました。 続行するには何かキーを押してください . . .

          at 19:11 |
          2021/12/19

          全角スペースが入りのファイルを bat にドラッグアンドドロップする

          bat  windows 

          昔、作ったドラッグアンドドロップでファイル名に日付を追加する .bat ファイルですが、全角スペースが含まれたファイルが上手く扱えないので、使えるように改良してみました。

          bat ファイルでの全角スペースの扱いは、半角スペースの扱いと違うのでみんな苦労しているようです。
          今回は一度違う文字(___)に置換してから、ループ内で逆に置換するようにしました。
          作成時の注意点は文字コードを Shift-JIS にして保存する必要があるということだけです。

          @echo off cd /d %~dp0 set args=%* set args_escaped=%args: =___% echo args: %* echo args_escaped: %args_escaped% setlocal enabledelayedexpansion for %%f in (%args_escaped:"=%) do ( set fname=%%~dpnf set fname_org=!fname:___= ! echo fname_org!fname_org! echo -------- ) endlocal pause

          こんな感じで、全角スペース入りの複数のファイルをドラッグアンドドロップしても大丈夫になりました。

          args: D:\hoge\い う.txt D:\hoge\あ あ.txt args_escaped: D:\hoge\い___う.txt D:\hoge\あ___あ.txt fname_orgD:\hoge\い う.txt -------- fname_orgD:\hoge\あ あ.txt -------- 続行するには何かキーを押してください . . .

            at 22:21 |
            2021/08/15

            bash の変数と改行

            sh 

            シェルスクリプトで echo をするときに、変数をダブルクオートで囲った場合とそうでない場合で挙動が違うことに気付いたのでメモ。

            具体的には以下のような感じで、変数内に改行が含まている場合の改行の扱いが変わるようです。
            かれこれ 20 年くらいシェルスクリプト書いていますが、こういう決まりがあることに気付いてませんでした。

            $ hoge=`cat <<EOF > aaa > bbb > ccc > EOF > ` $ echo $hoge aaa bbb ccc $ echo "$hoge" aaa bbb ccc $ echo $hoge | wc -l 1 $ echo "$hoge" | wc -l 3

              at 18:41 |
              2021/05/22

              git リポジトリのリモート URL を一撃で書き換える ( Linux 編 )

              git  sh 

              git のサービス等を乗り換えたりする場合には、ローカルリポジトリのリモート URL を書き換える必要が出てきます。

              1つずつやっても良いのですが、いろいろと面倒なので、現在の URL の一部を置換することリモート URL を書き換えるワンライナーを書いてみました。通常、サービスの乗り換えの場合にはリポジトリ名は URL の一部のみが変わるだけだと思うので、これで十分機能するはずです。

              ここではリモートの URL が https://example.com/foo/bar.githttps://example.jp/foo/bar.git に変更されると仮定すると、以下のような感じでリモート URL の変更が可能です。

              git remote set-url origin $(git remote get-url origin | sed "s|example\.com|example\.jp|")

              ちなみに、Windows の場合は PowerShel を使って同様の操作ができます。


                at 22:28 |
                2021/05/13

                SH-60L の試作機の飛行試験を開始

                SH-60L 

                海自の SH-60K の能力向上型試作機(完成すれば SH-60L)の飛行試験が始まったようです。

                見た目は SH-60J と SH-60K のようなわかりやすい見た目の変化もないようですが、どこかで見にいきたいところです。


                  at 22:55 |
                  2021/05/08

                  bat でコマンドを途中で改行するには

                  bat  windows 

                  Linux でシェルスクリプトを書くときに長いコマンドを途中改行するためには改行の直前に \ を書きますが、Windows の bat ファイルでは同様のやり方を知らなかったので調べてみました。

                  これはどこにドキュメンテーションされているのか

                  ネットを検索すると ^ を使えば良いというのはすぐに見つかりました。
                  書いて見ると実際に問題なく動きましたが、公式のドキュメントで仕様を確認しておきたかったのでどこに記載があるのかちょっと調べてみました。

                  エスケープに関する記述は set コマンドの解説の以下でしょうか。明確に escape character が ^ である と書いてありますが、これが bat 全体で使えるという記述は見つけることができませんでした。この仕様はおそらく DOS の時から変わっていないと思われるのですが、DOS に関するドキュメントは今や MS のサイトにはないですからしょうがないですね。

                  set | Microsoft Docs

                  The characters <, >, |, &, and ^ are special command shell characters, and they must be preceded by the escape character (^) or enclosed in quotation marks when used in (for example, "StringContaining&Symbol").


                    at 18:45 |
                    «Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
                    » ArchiveList (Tag for "sh / windows" )