web-dev-qa-db-ja.com

クォータが有効になっているフェールオーバークラスターに共有を追加すると、10分かかります

ファイルサービスのリソースの1つが〜50,000ユーザーのホームディレクトリをホストしているファイルサービスクラスターがあります。 [〜#〜] fsrm [〜#〜] によって割り当てられたクォータテンプレートがホームディレクトリにあります。

フェールオーバークラスターマネージャーの「ファイル共有の追加」ウィザードを使用して新しい共有を追加しようとすると、最初に、定義されたすべての共有フォルダーのすべてのクォータを取得しますファイルサーバークラスターリソース。この環境では、約10分かかります。

どうすれば

  • クォータ列挙のプロセスを高速化する
  • クォータ列挙プロセスを単一のファイルサーバークラスターリソースに制限する
  • 新しい共有ウィザードのクォータ列挙を完全に無効にします

6
the-wabbit

私はついに、ファイル共有の作成にGUIを使用するという要件を完全に解除することで、この問題を回避しました。代わりに、共有作成手順としてのNew-SmbShareの使用について説明しました。この方法で共有を追加すると、クォータの列挙を含め、GUIウィザードが実行しているすべての事前構成チェックがバイパスされます。

New-SmbShare -Name <ShareName> -ScopeName "<CAPName>" -Path "<LocalDirectoryToBeShared>" -FullAccess "Everyone" -Description "<Comment>"

New-SmbShareコマンドレット は、Server 2012 R2/Windows 8.1で導入されました。以前の(2012、2008R2、2008)バージョンのファイルサーバークラスターの場合、 NetShareAdd 関数をNetapi32.dllからインポートするNativeMethodsクラスを借りることができます スクリプトFileover Clusterスコープの共有に関するMSDNブログ投稿 とともに公開されます。

私の大幅に短縮されたバージョンは次のようになります。

#Using Win32 API NetShareAdd via p/invoke to be able to specify the scope in SHARE_INFO_503
$signature = @"

    using System;
    using System.Runtime.InteropServices;
    using System.Collections;

    public class NativeMethods
    {
        [DllImport("Netapi32.dll")]
        public static extern uint NetShareAdd([MarshalAs(UnmanagedType.LPWStr)] string strServer, Int32 dwLevel, ref SHARE_INFO_503 buf, out uint parm_err);

        [StructLayoutAttribute(LayoutKind.Sequential)]
        struct SECURITY_DESCRIPTOR {
            public byte revision;
            public byte size;
            public short control;
            public IntPtr owner;
            public IntPtr group;
            public IntPtr sacl;
            public IntPtr dacl;
        }

        public enum SHARE_TYPE : uint
        {
            STYPE_DISKTREE = 0,
            STYPE_PRINTQ = 1,
            STYPE_DEVICE = 2,
            STYPE_IPC = 3,
            STYPE_SPECIAL = 0x80000000
        };

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct SHARE_INFO_503
        {
            public string shi503_netname;
            [MarshalAs(UnmanagedType.U4)]
            public SHARE_TYPE shi503_type;
            public string shi503_remark;
            [MarshalAs(UnmanagedType.U4)]
            public int shi503_permissions;
            [MarshalAs(UnmanagedType.U4)]
            public int shi503_max_uses;
            [MarshalAs(UnmanagedType.U4)]
            public int shi503_current_uses;
            public string shi503_path;
            public string shi503_passwd;
            public string shi503_servername;
            [MarshalAs(UnmanagedType.U4)]
            public int shi503_reserved;
            public IntPtr shi503_security_descriptor;
        }


        public static uint ShareFolder(string servername, string sharename, string path, string remark)
        {
            SHARE_INFO_503 shInfo = new SHARE_INFO_503();
            shInfo.shi503_netname = sharename;
            shInfo.shi503_type = SHARE_TYPE.STYPE_DISKTREE;
            shInfo.shi503_remark = remark;
            shInfo.shi503_permissions = 0;
            shInfo.shi503_max_uses = -1;
            shInfo.shi503_current_uses = 0;
            shInfo.shi503_path = path;
            shInfo.shi503_passwd = null;
            shInfo.shi503_servername = servername;
            shInfo.shi503_reserved = 0;
            shInfo.shi503_security_descriptor = IntPtr.Zero;

            uint nRetValue = 0;
            uint param_err = 0;

            nRetValue = NetShareAdd(servername, 503, ref shInfo, out param_err);

            //Console.WriteLine("Sharing " + path + " on " + servername + " as " + sharename + " returned " + nRetValue + " (" + param_err+ ")");

            return nRetValue;
        }
    }
"@


#Import the FailoverClusters PowerShell module if it is not already imported
Import-Module FailoverClusters

#Add the function type that will be used to share the folder in the defined scope
Add-Type -TypeDefinition $signature

使い方は簡単です:

[NativeMethods]::ShareFolder("<CAPname>", "<ShareName>", "<LocalDirectoryToBeShared>", "<Comment>")

ShareFolder関数は、正常に実行されると0を返し、クォータが有効になっている場合でも即座に終了します。 CAP /ファイルサーバーリソースをホストしているクラスターノードの1つで実行されます。デフォルトの共有作成ACLはEveryone:Readであり、このメソッドでは指定できないため、後で共有ACLを修正する必要がある場合があります。

3
the-wabbit