CIFS (SMB、Samba)を快適に使いたい

この記事を作った動機 linux上で、cifsとVPNを使って自分のファイルサーバにアクセスしているのですが、以下のような不満点があり、どうしたらいいか考えてみた結果、いくつか興味深いオプジョンが見つかったので、それを記録しておくだけです。ちなみに、完全な解決とまでは行ってないですが、多少改善が見られた程度って感じです。 大きなファイルをやり取りすると、同時に他のファイル操作をしたときにもっさりする なにかと、特にvpn環境だと理由不明のファイルマネージャ等のプチフリが多発する ちょっとしたまとめ sudo mount -t cifs -o user=username,password="password",gid=1000,uid=1000,vers=3.11,multichannel,max_channels=16,compress //192.168.xxx.xxx/shareName /Path/To/Mount/Point 特に気になったオプション vers=3.11 smbプロトコルのバージョンを指定する項目で、以下のバージョンが選べる模様です。新しいほどいろんな機能が使えるようです。今回の場合は、使いたい機能が、3.11にあるので、それを指定している前提で、その他気になったオプションをリストアップします。 vers=arg SMB protocol version. Allowed values are: • 1.0 - The classic CIFS/SMBv1 protocol. • 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008. Note that the initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported. • 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. • 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012. • 3.02 or 3.0.2 - The SMBv3.0.2 protocol that was introduced in Microsoft Windows 8.1 and Windows Server 2012R2. • 3.1.1 or 3.11 - The SMBv3.1.1 protocol that was introduced in Microsoft Windows 10 and Windows Server 2016. • 3 - The SMBv3.0 protocol version and above. • default - Tries to negotiate the highest SMB2+ version supported by both the client and server. If no dialect is specified on mount vers=default is used. To check Di‐ alect refer to /proc/fs/cifs/DebugData Note too that while this option governs the protocol version used, not all features of each version are available. The default since v4.13.5 is for the client and server to negotiate the highest possible version greater than or equal to 2.1. In kernels prior to v4.13, the default was 1.0. For kernels between v4.13 and v4.13.5 the default is 3.0. multichannel manページを読んでいる限り、一つだけでなく複数のデータをやり取りするための、よくわかってないですが、複数のTCPセッション(複数の通信路)みたいなのを開くっぽいです。これを指定して見ると、大きなファイルを操作していても快適にファイルマネージャとか、レスポンスよくいろんなファイル操作が行える傾向にありました。一つだけの通信路では、やはり厳しいものがあるようです。 ...

March 25, 2025

linux 環境で指紋認証ができない

この記事を書いた動機 結構前から指紋認証機能が linux 上で使えないということがあった。それで、とりあえず以下の2つのパッケージをインストールすることで、センサーを認識して動くところまではやっていた。 yay -Qs fprint local/fprintd 1.94.5-1 (fprint) D-Bus service to access fingerprint readers local/libfprint 1.94.9-1 (fprint) Library for fingerprint readers その時は、Gnome の設定画面にも登録画面が出てきて、とりあえず登録することはできるようになった。しかし、結局登録した指紋と一致しないと言われ、認証機能が思ったように動かないことに気づき、めんどくさくなってまた問題をしばらく放置していた。 そして、最近になって、また linux 環境における指紋認証について調べてみたところ、問題の解決には至らなかったが、視覚的にどんな指紋が読み取られているのか確認する方法があることに気づいたので、それを記録してみようというわけです。 環境 Arch Linux linux kernel 6.13.4-arch1-1 Gnome XPS 13 2in1 (9365) 指紋認証センサー VFS7552 libfprint をコンパイルする libfprint 自体に、指紋認証センサーをテストしたりできるツール群が入っているので、それを使う。もしかするとパッケージマネージャ経由でインストールできたりするかもしれないが、GitHub - iafilatov/libfprint: libfrpint driver for a family of Elantech fingerprint sensorsに合わせて、今回は自前でコンパイルすることにした。 ちなみに、このgitリポジトリ 自体は古く、VFS7552 を検出しなかったので、現行のlibfprint / libfprint · GitLabを後にコンパイルし直した。 一応大まかなポイントだけ、ここには記録しておこうと思う。 ツールをいれる gimp # .pgm な画像を表示するために必要 ninja git python libglib2.0-dev libnss3-dev libpixman-1-dev libusb-1.0.0-dev libx11-dev libxv-dev pkg-config リポジトリのクローン mkdir ~/working cd ~/working git clone https://gitlab.freedesktop.org/libfprint/libfprint.git python 仮想環境の構築 # もし、anaconda が入っている場合は、事前に無効化しておく # conda deactivate python3 -m venv venv . venv/bin/activate pip install -U pip pip install meson “ModuleNotFoundError: No module named ‘distutils.util’” と言われてしまう場合は、以下のモジュールもインストールしていおく。 ...

March 14, 2025

ssh 経由でクローンできる git リポジトリを作るメモ

この記事を書いた動機 単に、リポジトリを作るところまではうまく行っていたのですが、リポジトリをクローンするときに、ユーザ名の指定をわかっておらず、ずっと以下のように間違った"git"というユーザを指定し続けていてなかなか気づけなかったということがあったのでメモすることにしました。 git clone git@[serveradress]:/Path/To/Target/Proejct/Root/Folder ちなみに、間違ったユーザを指定していると、ssh接続できないので、ずっと"Permission denied (publickey).“と言われ続けます。。。最初はなんでssh コマンド経由でつながるのに、gitではうまくいかないのかみたいになっていましたが、結局のところ間違ったユーザを意図せず指定し続けていただけなのでした。。。 リポジトリを作る cd /Path/To/Target/Proejct/Root/Folder git init --bare リポジトリをクローン git clone [username]@[serveradress]:/Path/To/Target/Proejct/Root/Folder 参考にしたサイトとか debugging - How can I debug git/git-shell related problems? - Stack Overflow https://stackoverflow.com/questions/6178401/how-can-i-debug-git-git-shell-related-problems (2025年3月10日) Git - Setting Up the Server https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server (2025年3月10日) Why doesn’t my SSH key work for connecting to github? - Stack Overflow https://stackoverflow.com/questions/9960897/why-doesnt-my-ssh-key-work-for-connecting-to-github (2025年3月10日) ChatGPT https://chatgpt.com/ (2025年3月10日)

March 10, 2025

Samba を設定するメモ

この記事を書いた動機 ssh サーバ (sshd) の設定のメモ の設定についてメモを書いたのと似たような動機で、sambaについても書いていく。疲れたので、説明も簡素に、とりあえずどんな設定にしているのかおいておくことにする。 ちなみにこれら設定は、プライベートネットワークでしか使うことを想定しておらず、外部に公開されるようなサーバでは使えない、セキュリティーホールになりえる設定になっている可能性が大いにあるので、注意する。 /etc/samba/smb.conf # ネットワークドライブ名 [data] comment = data folder # ファイル共有する場所を指定 path = /Path/To/ShareFolder browsable = yes writable = yes guest ok = yes read only = no force create mode = 0777 create mask = 0777 # 全体共通の設定項目 [global] min protocol = SMB2 max protocol = SMB3 Workgroup = WORKGROUP netbios name = dataserverName log file = /Path/To/LogFile/%m.log log level = 1 wins support = yes domain master = yes ユーザの追加 ついでなので、samba のユーザの追加方法についてもよく忘れるので記録を取る。 ...

February 7, 2025

ssh サーバ (sshd) の設定のメモ

この記事を書いた動機 最近、サーバーをセットアップする機会があって、sshd に関して最低限どんな設定をしていたか、忘れていたということがあった。そこではいちいち調べていたが、今後同じようなことがあったときのために、適当に記録しておくことにした。 ちなみに、今回以下に示す設定項目については、sshd のデフォルトの設定状態から、変更または追加した部分についてしか書いていない。使う linux ディストリビューション次第では、パッケージマネージャからインストールされる sshd のデフォルトのコンフィグの設定が地味に違う可能性があるので注意する。 /etc/ssh/sshd_config # Include drop-in configurations Include /etc/ssh/sshd_config.d/*.conf ... # ルート(管理者権限を持ったアカウント)でログインさせない PermitRootLogin no # 公開鍵によるユーザ認証を許可する PubkeyAuthentication yes # パスワードによるユーザ認証は許可しない PasswordAuthentication no # 多分これはなくても ".ssh/authorized_keys" が公開鍵の保存場所としてデフォルトで認識されるが、今回は明示的に示している AuthorizedKeysFile .ssh/authorized_keys ... 関連性のありそうな記事 Samba を設定する 参考にしたサイトとか 今回は自分のサーバの設定を見て、適当にどういう解釈で設定しているか記録を取っただけなので、特になし。

February 7, 2025

Gnome Mutter と ネットワーク共有フォルダ(SMB CIFS)

この記事を書いた動機 ただ単に、すぐに気づけなかったけど、後々気づいたことがあったので、それを記録するだけです。具体的には、Gnome の mutter において、ネットワークドライブ上を参照している場合においても、サムネイルを表示するようにすることについて、記事を書いていく予定です。 Gnome Mutter と ネットワーク共有フォルダ デフォルトの設定 gnome mutter ではデフォルトで、ネットワーク共有フォルダの中身のサムネイルなどを表示しない。 サムネイルを表示する設定に変更 以下の画面で、サムネを表示したりその他情報についてどうするか、設定できる。デフォルトでは、全ての項目がトラブルを避けるためか、ネットワーク共有フォルダなどを含まない、端末上のディスク内にしか機能しないように設定されている。 設定を開く サムネイルを表示するように設定を変更 変更後の様子 設定を変更し、ネットワーク共有フォルダ等をのぞいてみると、サムネイルなどが見えるようになったりする。 参考にしたサイト ただ気づいたことを書いただけなので特になし。

January 6, 2025

linux 休止状態の動作を確認したい

この記事を書いた動機 (Nov 14 あたりの出来事) 最近、HP Proliant ML 150 (9 Gen) の消費電力削減の目的で、休止状態を利用できるようにしようとした過程で、それが正しく機能しているのか調べたくなった。そこで、ただメモリをたくさん指定した量だけ消費するプログラムを作成し、とりあえず動くところまで作ったので、ここに置いておこうというわけである。どこまで意味があるのかは不明。 ちなみに、一応メモリ割り当てに失敗したとき用に、再度メモリ割り当てを試みる機能や、メモリ割り当てに完全に失敗したときにプログラムを終了するなど、セーフティも実装しているが、結局使うことはなかったので正しく動く保証はない。 使い方 プログラムのコンパイル gcc useram.c -o useram プログラムの利用 # 10 GB のメモリを埋めるときの例 useram 10 Too many ram will be allocated by your request. denied operation. と出てくる時 プログラム内の定数 margin の大きさが大きすぎる可能性があるので、適宜調整する。 後は単純に、実装されているメモリサイズより大きなサイズを指定してしまっているので、小さい値で再度プログラムを実行してみる。 プログラム本体 #include <stdio.h> #include <stdlib.h> #include <sys/sysinfo.h> // unit GB #define margin 10 #define retry 3 // Get the amount of entire installed RAM. // No args are required. // return: amount of entire installed RAM int checkRAM(){ unsigned int amount = 0; // GB struct sysinfo info; sysinfo(&info); // convert unit byte to Giga byte (10^9) amount = info.totalram / 1000 / 1000 / 1000; return amount; } // allocate RAM (amount GB) // args:(Unit -> GB) // amount: allocation size unsigned int // maxAmount: entire system RAM amount unsigned int // return: // pointer: pointer to allocated area void* // If all ram allocation attempts are failed, return NULL. void* allocateRAM(unsigned int amount, unsigned int maxAmount){ // find specified allocation size is exceed entire system RAM amount or not. if(amount >= maxAmount - margin){ printf("Too many ram will be allocated by your request. denied operation.\n"); return 0; } // allocate ram but still the allocated area is not utilized. unsigned long allocateSize = (long)sizeof(char) * (long)amount * (long)1000 * (long)1000 * (long)1000; void* pointer = (void*)malloc(allocateSize); // retry ram allcation if it is failed. if(pointer == NULL){ printf("ram allocation is failed. retry %d times\n",retry); int counter = 0; while(pointer == NULL && counter < retry){ printf("retry %d\n",counter); void* pointer = (void*)malloc(allocateSize); counter++; } } // If all ram allocation attempts are failed, return NULL. if(pointer == NULL){ printf("allocation failed!\n"); return NULL; } printf("allocation OK\n"); return pointer; } // amount unit GB void useRAM(void* pointer,unsigned int amount){ // 4 mean size of int unsigned long loopAmount = (long)amount * (long)1000 * (long)1000 * (long)1000 / (long) 4; int* arr = (int*)pointer; // For each loop, fill up the allocated area with random value by 4 byte(size of int) for(unsigned long i = 0; i < loopAmount; i++){ arr[i] = (int)rand(); } printf("Loop amount %lu\n",loopAmount); printf("RAM area is filled up. The process is finished.\n"); return; } int main(int argc,char **argv){ // find entire system ram unsigned int ramAmount = checkRAM(); // If The allocation size is not specified, exit this program. if(argc <= 1){ printf(" The size of ram amount that will be filled up is not specified. (GB)\n"); return -1; } unsigned int amount = atoi(argv[1]); // find correct value is entered or not if(amount != 0){ printf("%d GB\n",amount); }else{ printf("You may enter string or 0 as args. Stop.\n"); return -1; } printf("System info: \n %d GB RAM is installed\n",ramAmount); // ram allocation and filling up process void* pointer = allocateRAM(amount,ramAmount); useRAM(pointer,amount); // If ram allocation is failed, exit this program if(pointer == NULL) { printf("went worng\n"); return -1; } // wait until get user input. // The filled up RAM area will not be free while there is no user input for 'q' key. char input = 'a'; while(input != 'q') scanf("%c",&input); free(pointer); return 0; } 参考にしたサイト How to determine memory size via C code - Stack Overflow https://stackoverflow.com/questions/45259131/how-to-determine-memory-size-via-c-code (2024年12月12日)

December 12, 2024

yay コマンドのインストール

この記事を書いた動機 単純に別の記事を更新してて、一応書いとくかってなっただけです。二番煎じというか、自分用のメモとしての補足的な記事なので、シンプルに書きます。 環境 arch linux (2024/11/13の時点で最新のやつ) yay のインストール 必要なコマンドをインストール sudo pacman -S base-devel git 作業ディレクトリとして適当な場所に移動 cd /tmp git から yay のリポジトリのクローン git clone https://aur.archlinux.org/yay.git cd yay yay をインストール makepkg -si 以上で、yayコマンドが使えるはずである。。。 まとめ sudo pacman -S base-devel git cd /tmp git clone https://aur.archlinux.org/yay.git cd yay makepkg -si 参考にしたサイト Arch Linux に yay をインストール #archLinux - Qiita https://qiita.com/ekzemplaro/items/6714469c1fb1ae06b80f (2024年11月14日)

November 14, 2024

linuxカーネルを設定したりする📓

この記事を書いた動機 最近linuxのカーネルパラメータとか、コンフィグをいじる機会があったって、どうやっていじるんだっけとなったので、メモを残そうということになった。 いつものように、基本は自分のために書いてるというのもあって、他人が見るためのコンテンツとしてはクオリティは終わってるので、そこは承知ください。。。。 環境 ここには、簡易的にどんな環境でやることについて書いているか、記録してみる。 arch linux linux kernel version: 6.9.7 UEFIに対応したハードウェア環境 grub をブートローダーとして使っている x86 系列の 64 bit CPU (Intel の core i シリーズとか、ryzenとか、、、) カーネルをビルドする 今使っているlinuxのバージョンを確認 uname -r 6.9.7 作業用のフォルダを作成 いろいろ、コンフィグだのカーネル本体だのをいじくりまわして散らかるので、一つのフォルダにそれらをまとめる。 mkdir ~/kernel cd ~/kernel linux をダウンロード linux archivesから、自分の使っているlinuxのバージョンに合った、linux をダウンロードしてくる。私の場合は、以下のように、リンクを改変することで、バージョンを合わせた。 改変前 https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.11.7.tar.xz 改変後 https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.7.tar.xz linuxのダウンロードには、ブラウザから直接ダウンロードボタンを押したり、リンクを踏むことでできたり、gitが使えたりする。いろいろあるが、めんどくさかったので、wgetコマンドを使った。 wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.7.tar.xz ダウンロードしたカーネルを展開する tarコマンドで以下のようにして、適当に中身を展開する。 tar xfv linux-6.9.7.tar.xz cd linux-6.9.7 # オプションのヒント # x: extract (抽出) # f: file (展開するファイルを指定する) # v: verbose (途中経過の表示ができる) カーネル設定ファイルをコピー linuxでは、何も設定がないところからスタートする場合は、たぶん自分で以下のようにして、一つ一つコンフィグを設定していくっぽいが、そんなことを一からしていたら日が暮れてしまうので、今動いているカーネルの設定を使いまわす。 make menuconfig ... # 何かしらのメニューがしばらくすると表示され、圧倒的な量の設定項目があることに圧倒されるまでがセット。。。 linuxカーネルのバージョンを合わせたのは、バージョンがあっていないと、新たにカーネルの設定が追加されていたりして、その設定をするのが面倒だし、それで動かなかったらさらに面倒だからである。arch linuxの場合だと以下のようにして、設定をコピーできる。 ...

November 10, 2024

https通信をプライベートネットワークで使いたい

この記事を作った動機 私はプライベートネットワークにおいて、自分のためだけのサービスをhttpプロトコル経由で利用できるようにしているが、拡張機能とかの作成にあたり、httpsじゃないと不都合が生じるようになったことがきっかけで、https化に苦労することになり、もう嫌だということでこの記事を書くことになった。 例えばyoutube上で動作する拡張機能が、自分だけのためのサービスが動いているhttpサーバをバックエンドとして使うことを考えると、http通信とhttps通信が一つのWebページを表示するために混在してしまうために、ブラウザ側で通信がブロックされたリ、騒がしいエラーが出てきてしまい、非常に不快な思いをすることになる。 前提としていること 参考程度に前提条件とかも書いておく。 httpdを使っている。 opensslパッケージがインストール済み すでにhttpdを使っていて、ブラウザでなんか表示できる状態にある。 あくまで個人用など、閉じられた環境において、https通信を実現したいと考えている。 このブログの様な、大っぴらに公開されているWebサイトには使えない手法であることを理解している。 https通信の実現方法 証明書を作る HTTPsを実現するために、mkcertコマンドを使って証明書を作成するが、どんな証明書が必要が一応自分の理解の範囲であり、間違っているかもしれないが、簡易的に書いておく。必要そうな証明書は以下のとおりである。 サーバ自体を証明する証明書 各httpサーバとかのためにサービスごとに個別に用意される証明書 この中で、サーバと通信するパソコンがインストールしているべき証明書は、「サーバ自体を証明する証明書」の証明書の公開鍵であり、「各httpサーバとかのためにサービスごとに個別に用意される証明書」の公開鍵ではない。 mkcert コマンドのインストールを行う 私は arch linux を使っているので、以下のようにパッケージマネージャを利用した。 yay -S mkcert # たぶんリポジトリの分類がExtraにあるので、pacmanでもインストールできる # pacman -S mkcert mkcertの初期化を行う サーバ自体を証明する証明書の作成を行う。 mkcert -install # 証明書が保存された場所を調べるためには以下のコマンドでできる。基本的にmkcert -installを実行したユーザのホームディレクトリのどこかにある。 # mkcert -CAROOT # /home/username/.local/username/mkcert # 自分の環境だとこのような出力が得られる。 httpサーバ用の証明書を作る 次に以下のようにして、httpサーバが動いているドメイン名やIPアドレスを引数として、サービス用に証明書を作成する。この証明書は今回の場合であれば、httpdサーバの443番ポートを経由して、通信しているブラウザ等に送られることになる。 # コマンドを実行したファイル内で証明書の公開鍵と秘密鍵ができてしまうため、一応作業用のフォルダを作っている。 mkdir ./sslLocal/ cd ./sslLocal # 各httpサーバとかのためにサービスごとに個別に用意される証明書を作成 mkcert mydomain.name ipAddr # ドメイン名やIPアドレスなど複数指定できるらしいが、自分はとりあえずドメイン名だけにしてた。 # あっ、mydomain.nameやipAddrとかは適宜読み替えてください httpdが使う証明書を配置 私は以下の様にして、httpサーバ用の証明書を配置した。 # 証明書を作成したディレクトリへ移動 cd ~/sslLocal/* # ファイル内容を確認し、証明書の公開鍵と秘密鍵があることを確認する。 ls -rw-------⠀username⠀1708⠀Nov 4 02:06:02⠀⠀mydomain.name-key.pem -rw-r--r--⠀username⠀1452⠀Nov 4 02:06:02⠀⠀mydomain.name.pem # httpdのconfigがあるところに、証明書を置いておく場所も作る。 sudo mkdir /etc/httpd/conf/ssl # 署名書を作成したフォルダまで移動する。 cp ~/sslLocal/* /etc/httpd/conf/ssl/ httpdの設定 ssl通信に必要なモジュールを読み込む。 ...

November 4, 2024