ブロックモードとは何ですか?

ブロックモードとは何ですか?

私が知っている限り、GNU / Linuxではファイル権限をファイル権限とも呼びます。モデルそして「マスク」という用語は、少なくとも次のような他の意味を意味することができます。

  1. これマスクシェル組み込み(一般的な意味)。
  2. これマスクシェル組み込み応答システムコール
  3. これマスクそのコマンドはシェルに組み込まれていますumask
  4. シェルプロシージャの値は次のように知られています。ファイル生成マスク、またビットマスクそうでなければマスク
  5. ユーザー固有のファイルは、そのユーザーに固有のプロセスに影響を与えるマスクを作成します。ユーザーマスク→ユーザーのファイル作成マスク)。

これマスク内蔵ケース

1つは利用可能ですマスクumask適切な引数を使用してコマンドを実行してシェルを構築します。
これにより、マスク現在のためにシェルプロセスツリー;
現在、シェルプロセスツリー内のすべてのユーザーまたは私たち自身のユーザーに対して、通常、
これらの変更は新しいプロセスに継承されます。おそらく別の殻になるでしょう。)。

数学的論理の基礎

私は理解数学的論理包含作業接続会社また〜として知られています安定)は以下を基準とする。マスクケース内蔵。したがって:

オペランドのセットに対して true です。そして、もし、すべてのオペランドが真です。

そして同じ名前の人がいることがわかりました。ビット単位の演算このロジックに基づいています。 Andingは、x + y → z数値を加算する()または文字列を連結する()とは異なりますx alongside y → xy

私の質問

次のように「パターンをマスク」することが可能であることがわかります。

  OCTAL  BINARY       HUMAN-READABLE
  0666   0110110110  -rw-rw-rw-
∧ 0555   0101101101  -r-xr-xr-x
  0444   0100100100  -r--r--r-- 

しかし、これが正しいかどうかはわかりません。

私の質問

ブロックモードとは何ですか?どのように実装しますか0666 ∧ 0555 → 0444

答え1

umask、シェルコマンド、umask、関数、すべてとも呼ばれるファイル生成マスクを設定しますumask

あなたはそれを次のように書き直しました

Aは、umaskシェル組み込みコマンドとそのコマンドに基づいており、通常呼び出される変数を含むシェル関数を表します。ファイル生成マスクその価値はビットマスクそうでなければマスク

これは多くの点で正しくありません。

  • このumask関数はシェル関数ではありません。上記のリンクを参照してください。
  • この関数には変数はありません。現在のプロセスのファイル生成マスクを設定します。
  • ​​に基づく価値はよく言及される「ファイル生成マスク」としてはいファイル生成マスク(対応する値は「ビットマスク」または「マスク」と呼ばれません)

マスク変更される可能性がある他のシェルを含む、現在のプロセスツリーの一部のユーティリティに影響を与えます(したがって、シェルYにシェルXのマスクが必ずしも存在する必要はありません)。

マスクは通常影響を与えません。ファイル生成マスク現在のプロセスに影響を与え、継承されます。みんな新しく作成されたサブプロセス。子プロセスは自由に変更することができます。

このファイル作成マスクは、新しく作成されたファイルの権限に従って機能します。ファイルモードとも呼ばれるファイル権限は、ファイル所有者、グループ、およびその他のユーザーに対する12ビットでエンコードされたアクセス権のセットです。この標準的な回答もっと学ぶ。通常、4桁または3桁の8進値で表されます。それらいいえビットストリーム。

新しく作成されたファイルに対する権限は、そのファイルを生成したプログラムによって指定またはデフォルトで指定されます(つまりファイルの生成に使用する関数によって指定されます。前者の例には、以下を使用してファイル(またはディレクトリ)を生成するプログラムがあります。openまたはcreatまたはmkdir、必要なモードを明示的に指定する必要があります。後者の例には、以下を使用するプログラムがあります。fopenここで、ファイルはデフォルトの0666モードで終了します。現在umaskの値はこのモードをマスクします。

あなたはそれを次のように書き直します

  1. 次のいくつかのユーティリティmkdir独立モードでファイルを作成します(マスクは無視されます)。
  2. 一部のユーティリティの使用fopen()最初はデフォルトの0666モードを使用してファイルを生成しましたが、umask作成直後にマスクモードにモードを変更する機能です。

これは多くの点で正しくありません。

  • 要求されたパターンにマスクを適用した後ではなく、ファイルを生成する前に適用してください。
  • mkdir(ユーティリティではない機能ですが、同じ名前のユーティリティにも同じことが当てはまります)いいえファイル生成マスクは無視されます。

umask考慮すると、結果パターンは、要求されたパターンにビットマスクとしてumaskを適用した結果です。要求されたパターンに設定された各ビットは、対応するビットと比較して検証され、umask後者が設定されていない場合にのみ保持されます。バイナリ演算の場合、要求されたパターンANDの補数はビットANDedですumask。したがって、umaskモード0666の0022は減算ではなく、0666と0755(0022の補数)が0644であるため、0644を提供します。同様に、umaskモード0666を使用した0011の結果は0666です。

計算プロセスをもう少し詳しく見てみましょう。リンクされた回答に含まれるマイナスで表されることが多いが、umaskマスクとして使用されないことを理解することが重要です。したがって、値0022が適用されます。

       Octal Binary
Mode   0666  000110110110
Mask   0022  000000010010  Bits set here mask bits above
Result 0644  000110100100

       Octal Binary
Mode   0644  000110100100
Mask   0022  000000010010
Result 0644  000110100100

これは通常、パターンをマスクの補数とビット単位のANDとして計算します。

       Octal Binary
Mask   0022  000000010010
Compl. 7755  111111101101
Mode   0666  000110110110
Result 0644  000110100100

chmodに関係なく、コマンドラインで指定されたモードを適用しますumask。ファイルを生成するときでも、他のツールを使用してこれを行うことができます。したがって、権限を維持するように指示された場合、権限は関係なくコピーまたは復元されcpます。tarumask

この回答詳細については。

最後の質問は

私の理解は十分に正確ですか?どのように0666∧0555→0444になりますか?

最初の質問に対する答えは明らかに「いいえ」です。 2番目の質問に対する答えは、それがビット合計がどのように機能するかであるためです。オペランドを2進数で書き換えます。

Octal  Binary
0666   000110110110
0555   000101101101

次に、各ビット位置に対してビットごとのANDを実行します。これは、垂直に整列された各ビットペアを取ることを意味します。

       000100100100

(0∧0は0、0∧1は0、1∧0は0、1∧1は1です)。上記の内容を8進数に変換すると0444になります。

答え2

パターンは何ですか?

「ファイルモード」という用語は、Linuxシステムで使用できる標準ファイル権限を表します。アクセス制御リスト、これは他の品種です)。

ファイルモードは12ビットで構成されており、各ビットは許可または付与されない権限を表します(したがって、これを表すのに1ビットで十分です)。
たとえば、「グループメンバーがファイルを読み取ることができる」権限は、右から6番目のビットです。

使いやすさのために、この12ビットはそれぞれ3ビットで構成される4つのグループに分けられます。 3桁の2進数は8つの異なる値を持つことができます。これは、8進数(0〜7)が表すことができる値の数とまったく同じです。
したがって、これらの12の権限は、0から7777の範囲の4桁の8進数で表すことができます。
状況をさらに混乱させるために、8進数は通常0にゼロを付けて表示するため、0x16進数に慣例的に接頭辞が付けられているように、モードは0〜07777です。

簡単にするには、ほとんどの場合、下位9ビットにのみ興味があるので、ここでは0〜0777に焦点を当てます。

なぜ8進数で書かれたのですか?

なぜ8進数を使うのですか?パターンを読むのが簡単になります!

モードの最も低い9ビットは、次の許可ビットを表します。そのような順序で。バイナリ表現を使用する代わりに、そのビットの値を8進数で表示します(chmod(2)からコピー)。

00400 read by owner
00200 write by owner
00100 execute/search by owner
00040 read by group
00020 write by group
00010 execute/search by group
00004 read by others
00002 write by others
00001 execute/search by others

パターンが見えますか?1Alwaysは、実行/検索、2常に書き込み、4常に読み取りを意味します。読み取りと実行が許可されているが書き込みが許可されていない場合、数値は常にであり、5読み取り/書き込み/実行の両方を合計した3つの権限はすべて常にです7。比較のために10進値を見てください。

Allow read/execute for others:          0005, decimal   5.
Allow read/execute for group:           0050, decimal  40.
Allow read/execute for owner:           0500, decimal 320.
Allow read/execute for owner and group: 0550, decimal 360.
Allow read/execute for all, write
only for owner:                         0755, decimal 493.

したがって、8進数は一貫性をさらに高めます。数字の位置は所有者/グループ/タイタイで、数字は3つの読み取り/書き込み/実行ビットについてすべてを示します。

ウマスクとは?

ウマスクはプロセス属性(つまり、シェルなどの実行中のプログラム)各プロセスごとに1つずつ。権限を設定せずにプロセスを決定します。新しいファイルの作成。 shell コマンドはumaskシェルのマスクを設定します。いつこれシェルは別のプログラムを起動し、呼び出しシェルからumaskを継承します。したがって、シェルでumaskを設定すると、いいえ他のプログラムに影響を与え、〜しない限り彼らは最初の殻の子孫であり、創造されました。後ろにウマスクを設定してください。これがセッションの初期にスクリプトによってumaskを設定する必要がある理由です。

他の人が何を言っても使用してください077;-)

新しいファイルがあるとき作られた、プログラムを通じて、プログラムは必要な権限をopen(2) システムコールに渡します。オペレーティングシステムはumaskに設定されたビットを削除し、その結果を使用してファイルを生成します。これをテストするには、次のCプログラムを使用できます。

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <err.h>
#include <stdio.h>

int main(int argc, char **argv) {

    // check for enough command line arguments
    if (argc < 3)
        errx(1, "Usage: %s <filename> <octalmode>", argv[0]);

    // parse 2nd argument as octal integer
    char *endptr = NULL;
    int mode = (int)strtol(argv[2], &endptr, 8);
    if (!*argv[2] || *endptr || mode < 0)
        errx(2, "Not an octal mode: %s", argv[2]);

    // create new file with given mode
    int fd = open(
        argv[1],
        O_WRONLY|O_CREAT|O_EXCL,
        mode
    );
    if (fd < 0)
        err(1, "Failed to create file %s", argv[1]);

    printf("open(\"%s\", ..., 0%03o) successful\n", argv[1], mode);

    close(fd);

    return 0;
}

編む:

$ gcc -o mkfile mkfile.c

次の例に従ってください。

$ umask 77   # set umask to 0077
$ umask      # check umask
0077
$ rm -f foo           # delete old to make sure a new file will be created
$ ./mkfile foo 660    # create file `foo` with mode 0660
open("foo", ..., 0660) successful
$ ls -l foo
-rw------- 1 sk users 0 Nov  6 12:09 foo

プログラムはモード0660のrw-rw----権限を要求しますが、グループの権限はumaskによって完全に削除されることを確認してください。

umask:                              0077    000 000 111 111
umask bitwise negated:             07700    111 111 000 000
open's argument:                    0660    000 110 110 000

(open's argument) AND (NEG umask)   0600    000 110 000 000

通常、プログラムは最も許容可能な状況で役に立つと見なされる権限を提案し、権限の削除はオペレーティングシステムのumaskに委ねられなければなりません。したがって、(2)を使用してディレクトリを作成する場合は0777を使用しmkdir、(2)を使用して通常のファイルを作成する場合は0666を使用しますopen。たとえば、暗号化ツールはopen0600を使用して秘密鍵を保存し、コンパイラはそれを0755生成する実行可能なバイナリに使用できます。これらすべての場合、umaskはファイルが実際に作成されたときにファイルから不要な権限を削除します。

以下は、誰でも読んで実行できますが、umask 077設定でユーザー(モード0755)のみを書き込むことができるファイルを生成したいコンパイラの例です。

$ rm -f foo
$ umask 77
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwx------ 1 sk users 0 Nov  6 12:15 foo

umask 0設定(プログラムで要求されたすべてのビットが許可されています):

$ rm -f foo
$ umask 0
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwxr-xr-x 1 sk users 0 Nov  6 12:16 foo

実際、gccパターン0777も要求されます。

$ umask 0
$ rm -f mkfile
$ gcc -o mkfile mkfile.c
$ ls -l mkfile
-rwxrwxrwx 1 sk users 17k Nov  6 12:19 mkfile

だから欲しくないumask 0を使用してください。

答え3

Linuxでは、デフォルトのファイル権限は0644、デフォルトのディレクトリ権限は0755、デフォルトのumaskは0022です。

ファイルの完全な権限は0666なので、デフォルトの権限は(0666 - 0022 = 0644)から出て、ディレクトリのデフォルトの権限は(0777 - 0022 = 0755)です。

フル666/777権限を持つファイルとディレクトリを生成する設定マスクを使用できます#umask 0000(ただし、これは非常に安全ではありません)。

答え4

GNU / Linuxのumaskが何であるかを理解できません。

いいね

そしてandingを使って計算します。

私はあなたに次の式を提示しました。

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

default=0666 と umask=0022 を使用すると、次のようになります。

$ printf "%04o\n" "$(( (8#0666) & (~(8#0022)) ))"
0644

Linuxでは、umaskはシェル組み込みコマンドとシステム値を変更するカーネル関数(しばしばファイル生成マスクとも呼ばれ、ビットマスクとも呼ばれます)、または引数を含む組み込みコマンドによって呼び出されるカーネル関数の両方を意味します。

次のように書く必要があります。

Linuxでは、umaskはシェル組み込み関数の名前、カーネル関数の名前、プロセス値の名前です。組み込み機能と機能の両方でプロセス値を変更できます。

  • システム値ではありません。各プロセスには子プロセスにコピーされるumaskがあります。
  • プロセス値は次のとおりです。一般に名前付きファイル生成マスク、それはいこれファイル生成マスク
  • ビットマスクやマスクとは言いません。

マスクは、マスクを変更できる他のシェルを含む、現在のプロセスツリーの一部のサブプロセスに影響します。したがって、シェルYにはシェルXのマスクが必ずしもある必要はありません。

これマスク定義されたプロセスとそのプロセスで開始された子プロセスに影響します。

  • すべての子供は自分の外観を変えることができます。マスク

ファイルモードとも呼ばれるファイル権限は、ファイルのユーザー、グループ、およびファイルに対する他のユーザーのアクセス権をエンコードする12ビットのセットです(ugo→bbbbbbbbbbbbストリーム)。

ファイルモードは、数値(2進数12桁または8進数4桁または16進数3桁)です。

$ bc <<<'ibase=8; mask=1644; obase=2; mask; obase=8; mask; obase=16; mask'
1110100100
1644
4A8

ただし、ファイル権限は通常4〜3個の8進値(0644または644など)で表されます。

パターンは3からなる数字です。または4桁。とは10進数と
同じです。1230123

数学的論理は、「and」(∧)とも呼ばれる結合演算を含む。これは、「すべてのオペランドが真である場合にのみ、オペランドセットの合計が真」の場合に発生します。このロジックに基づく同じ名前のビット操作があります。

いいね

Andingは、数値を追加する(x + y→z)または文字列を連結する(xおよびy→xy)とは異なります。

いいね

umaskなしまたは埋め込みモードの設定(マスク経由)

モードは常にumaskを使用して設定されます。

一部のユーティリティ(mkdirなど)は、umaskを使用せずに独立モードでファイルを生成します(したがって、これらのファイルのモードはマスクされません)。

いいえ、umaskは常に動作します。

他のいくつかのユーティリティは、特定の「シールドされた」権限(つまり、ブロックのために許可されている)を持つファイルを生成します。たとえば、ユーティリティはfopen()関数を使用してファイルを生成します。この関数は最初にマスクを識別し、それに基づいて特権ファイルを生成します。

パターンは次の結果です。

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

マスキングモードはビットごとのANDで実行され、結果は次のようになります。

パターンはデフォルト値の合計です。否定的なマスク。

             OCTAL  BINARY        HUMAN-READABLE
umask        0222   000010010010  --w--w--w-
not-umask    7555   111101101101  N/A
default    ∧ 0666   000110110110  -rw-rw-rw-
result       0444   000100100100  -r--r--r-- 

私の理解は十分に正確ですか?どのように0666∧0555→0444になりますか?

改善が必要ないくつかの問題があります。唯一のanding(否定なし)は次のとおりです。

0666 → 0 011 011 011
0555 → 0 101 101 101

一致すれば垂直このバイナリは次の規則に従います。 - 同じ場合は、以下に別の同じ数字を書きます。 - 異なる場合は、以下に0を書きます。

0666 → 0 110 110 110
0555 → 0 101 101 101
       0 100 100 100
       0  4   4   4
0444 → 0 100 100 100

関連情報