XubuntuとSambaでのNAS構築メモ

2020. 2. 22 (土) | XubuntuとSambaでのNAS構築メモ はコメントを受け付けていません。

Xubuntuのインストールまでは済んでいる前提です。

Xubuntu側ターミナルエミュレーターでの操作

・リモートアクセス時にわかりやすいようホスト名を変更(ここでは xubuntu-nas とします)
$ sudo nano /etc/hostname
1行だけホスト名が書かれているので xubuntu-nas に変更して保存

・SSHインストール
$ sudo apt install ssh

・再起動
$ sudo reboot

**** 再起動後 ****

WindowsPCからリモートで操作する場合はコマンドプロンプトから
> ssh Xubuntuユーザー名@xubuntu-nas
あるいは
> ssh Xubuntuユーザー名@xubuntu-nas.local
とすればパスワード入力後リモートでアクセスできます。
駄目だったら、Xubuntu側のコンソールで
$ ip a

$ ifconfig
でIPアドレスを確認して
> ssh Xubuntuユーザー名@IPアドレス
でアクセス。

・nas用共有ディレクトリ作成(ここでは /home/nas とします)
$ sudo mkdir /home/nas

・作成したディレクトリのパーミッションを変更
$ sudo chmod 0777 /home/nas

・Sambaインストール
$ sudo apt install samba

・NAS用ユーザーを作成(ここでは nasuser とします。Xubuntuの管理者ユーザー名を使う場合は不要)
$ sudo adduser nasuser
パスワードを聞いてくるので決める(2回目は確認)
ユーザー情報は全て未入力で[ENTER]でOK

・Samba用ユーザーを作成(ここでは nasuser とします。Xubuntuの管理者ユーザー名を流用する場合は同名で作成)
$ sudo pdbedit -a nasuser
パスワードを聞いてくるので決める(2回目は確認)

・smb.confを編集
$ sudo nano /etc/samba/smb.conf

行末に以下を追加

・Samba再起動
$ sudo systemctl restart smbd nmbd

********

Windows側操作

・PC(マイコンピュータ)アイコンを右クリック、「ネットワークドライブの割り当て」を選択
ドライブ: 空いている好きなドライブレターを選択
フォルダー: \\XUBUNTU-NAS\nas (参照ボタンから辿っても可)
「サインイン時に再接続する」にチェックして[完了]ボタン

「ネットワーク資格情報の入力」ダイアログが出たら、
ユーザー名: nasuser
パスワード: Samba用ユーザー作成時に決定したパスワード
を入力。
(Windowsのユーザー名、パスワードと一致している場合は出ません)

エクスプローラが表示されたらファイルやフォルダの読み書きができるか確認。
コピー、作成、編集、削除などできれば完了。

Windows側で作成したファイルをXubuntu側で見ると、ファイルの所有者が nasuser になっていると思います。
これをXubuntuの管理者ユーザを所有者としたい場合は、Samba用ユーザを管理者ユーザと同名で作成して smb.conf の valid users にそのユーザー名を指定すれば大丈夫です。
(「ネットワークドライブの割り当て」で別ユーザー名で割り当てたドライブ名が残っている場合は「ネットワークドライブの切断」で一旦切断してあらためて接続し直す必要があります)

********

USBハードディスク等、外付けドライブをNASのシェア対象にしたい場合

Xubuntu(Ubuntu)の場合はNTFSも読み書きできるようですが、ここではXubuntuでもデフォルトで使われているext4にしてみます。

まずUSBドライブを接続します。
接続すると大抵自動的に /media/ユーザー名/ 以下にマウントされますので、それを頼りにdfコマンドでデバイス名を調べます。
$ df
該当する位置にマウントされているデバイス名を控えておきます。
例: /dev/sdb1
環境によって変動しますので実際に確認してください。

マウントされていないようだったら、blkidコマンドで調べてください。
$ sudo blkid

・アンマウントします
$ sudo umount /dev/sdb1

・mkfsコマンドでラベル「USB-HDD」を付けてext4にフォーマット
$ sudo mkfs -t ext4 -L USB-HDD /dev/sdb1

・フォーマット完了したUSBドライブのUUIDを調べます
$ sudo blkid
フォーマット時に付けたラベルが LABEL=”USB-HDD” のように表示されていますので、そのデバイスのUUIDを控えておきます。
例: 89999481-ced4-480b-9e5f-20278bf543db

・外付けドライブ用のマウントポイントを作成します。
ここでは「/home/usb1」としておきます。

ディレクトリ作成
$ sudo mkdir /home/usb1

パーミッション変更
$ sudo chmod 0777 /home/usb1

・/etc/fstabに追記
$ sudo nano /etc/fstab

最終行に以下を追記します。
UUID=控えておいたUUID マウントポイント ファイルシステム nofail,noatime 0 0

/etc/fstab に書き込んでおくと再起動時やmount -aコマンド実行時に、指定されたマウントポイントにマウントされます。
取り外されることもあるデバイスですのでnofailを指定しています。
nofailではデバイスが見つかればマウントし、見つからなければその時点では無視されますが、無視された場合でも該当デバイスが接続されたタイミングでマウントされます。
noatimeはファイルを読み込むたびにアクセス日時のタイムスタンプが更新されるのを無効にします。

・再マウント
$ sudo mount -a

・マウントされたか確認
$ df

・マウントされたのを確認したら再度パーミッション変更(マウントポイントではなく外付けHDD側のパーミッション変更になります)
$ sudo chmod 0777 /home/usb1

・smb.confを編集
$ sudo nano /etc/samba/smb.conf

行末に以下を追加

・Samba再起動
$ sudo systemctl restart smbd nmbd

以降、同じようにWindows側からネットワークドライブとしてアクセスできます。

・PC(マイコンピュータ)アイコンを右クリック、「ネットワークドライブの割り当て」を選択
ドライブ: 空いている好きなドライブレターを選択
フォルダー: \\XUBUNTU-NAS\nas-usb
「サインイン時に再接続する」にチェック

NASとして使用しているPCでブート順位がUSBドライブ優先になっていると、USBドライブを繋いだまま再起動させた場合システムが立ち上がらない場合もありますので起動優先順位を変更しておいてください。

ここに記載した内容をもとに、システム(内蔵ドライブ)、データ(外付けドライブ)、バックアップ(外付けドライブ)と分けて構築し直した際の記事をnoteへ書いています。

XubuntuとSambaでのNAS構築メモ はコメントを受け付けていません。
PC by あけび

 EC-CUBE4用 スクロールページャー

2020. 2. 2 (日) | EC-CUBE4用 スクロールページャー はコメントを受け付けていません。

いわゆる無限スクロールに対応させるものですが、EC-CUBE4に特化させたかったので既存の無限スクロール支援ライブラリは使用していません。
普段は私自身jQueryもあまり使いませんが、EC-CUBE4がデフォルトでjQueryを使用しているので今回は使用しています。

ファイルダウンロード

 導入方法

verticalScrollPager.js の中身を html/user_data/assets/js/customize.js へ、
verticalScrollPager.css の中身を html/user_data/assets/css/customize.css へ
それぞれコピペすれば導入完了です。
ブラウザキャッシュが邪魔になる場合がありますので、その場合は必要に応じてキャッシュ対策等も行なってください。

デフォルトでスクロールでのページングになっていますが、件数/並び順プルダウンの上にある指アイコンをクリックすることで従来のページ遷移にも切り替えられます。(押すごとにトグル切替)

スクロールでのページング時にも現表示ページ数確認用も兼ねて画面下部に従来の遷移型ページャーを表示させていますが、邪魔であればページャー部分の余白部分か、スクロールページ内にあるページ区切り帯のページ数表示部分をクリックすれば消すことができます。
再度押すと再び表示します。

通常のページ遷移で途中ページから表示させた場合、それより若いページへスクロールで遡る動作には対応していません。

使用をやめる場合は、customize.js、customize.cssへそれぞれコピーした該当コードを削除するだけで元に戻ります。

次ページローディング中に画面下部へ表示させているCSSアイコンは、以下のサイトで作成したCSSコードを使わせていただきました。
CSSだけで作るloadingアイコンメーカー

EC-CUBE4用 スクロールページャー はコメントを受け付けていません。
ソフトウェア by あけび

 PHPとrsyncでディレクトリをローテーションバックアップ

2020. 1. 18 (土) | PHPとrsyncでディレクトリをローテーションバックアップ はコメントを受け付けていません。

通常ならこういったバッチ処理は.sh等のシェルスクリプトで記述するところかと思いますが、個人的に使い慣れたPHPで書いています。

PHPで行なっているのはローテーションさせるためのバックアップ先ディレクトリ名の管理くらいで、バックアップ処理そのものは単純にrsyncに任せています。

使用方法

backup.phpと、バックアップ対象パスなどrsyncへ渡すオプションを設定するbackup_config.phpを同一のディレクトリへ置いて使用します。
ローテーション回数の設定はbackup.php側にあります。
ローテーション回数を2以上に設定すると、--link-destオプションを使用した差分バックアップを行います。初回はフルバックアップになりますが、2回目以降は変化のなかったファイルに対してはハードリンクのみを作成し、変化のあったファイルのみが実体ファイルとしてコピーされますので、ローテーション回数が比較的多めでもディスク消費量やバックアップにかかる時間を必要最小限に抑えることができます。
動作の概要についてはこちらを。

ローテーションを1回に指定した場合は--link-destオプションは使わず、既存のバックアップの中のいちばん新しいものに対して、--deleteオプションを付けて実行します。
ローテーション有り(2回以上)か無し(1回)かのどちらか一方で動作させるだけでも良いですが、backup.phpを例えばbackup_sub.phpという名前でコピーし、backup.php側をローテーション指定で1日1回実行、backup_sub.php側をローテーション無し(1回)指定で例えば1時間おきに実行させることで、1時間おきに最新の状態にミラーリングさせつつ、1日1回履歴バックアップを残すといった使い方もできます。

PHPファイルですが、Webアプリケーションではないのでシェルから実行します。

 $ php /スクリプト設置パス/backup.php

YYYYMMDD_hhmmss.bak という名前のディレクトリにバックアップ、
YYYYMMDD_hhmmss.log にrsyncのログを保存します。

cronでスケジューリングする場合は以下のようになります。
設定例(毎日午前4時に実行)

 # rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null

設定例 毎日午前4時に履歴差分バックアップをしつつ、毎正時にミラーリング
(backup.php側でローテーション回数2以上で設定、backup.phpをコピーしたbackup_sub.php側でローテーション回数1を指定している前提です。)

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null

設定によっては複数が同時に実行開始される場合がありますが、実行の際にはロックファイルを用いて排他処理しているので、同時に複数のバックアップ処理が回ってしまうことはありません。
また、ローテーション無しでの実行の場合はバックアップ開始まで5秒遅らせるようにしてありますので、同時に走り出してもローテーション有りのほうが優先して実行されるようになっています。

オプションでold_delete.phpとcapacity_check.phpも用意しました。
backup.phpでローテーション回数を多く設定した場合のサポート的な位置付けです。
使用する場合は、どちらもbackup.phpと同じディレクトリへ設置してください。
old_delete.phpは古いバックアップを間引くスクリプトで、1日以上経過したらその日のバックアップの中で最終のものを残して削除、1か月以上経過したらその月のバックアップの中で最終のものを残して削除します。
capacity_check.phpはバックアップディスクの容量をチェックし、指定した割合に達したら下回るまで古いバックアップから順に削除するスクリプトです。
どちらか一方でも、両方設置しても問題ありません。

cronでスケジュール実行する場合は、1日1回程度backup.phpとは時間をずらして実行すればよいかと思います。

設定例 old_delete.phpを毎日5時に、capacity_check.phpを毎日5時5分に実行するよう設定しています。

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null
 # olddata delete
 0 5 * * * php /スクリプト設置パス/old_delete.php &> /dev/null
 # diskcapacity check delete
 5 5 * * * php /スクリプト設置パス/capacity_check.php &> /dev/null

スクリプト

backup.php

backup_config.php

old_delete.php

capacity_check.php

PHPとrsyncでディレクトリをローテーションバックアップ はコメントを受け付けていません。
PC by あけび

 PHPで画像表示およびconvertコマンドでサムネイル生成

2020. 1. 9 (木) | PHPで画像表示およびconvertコマンドでサムネイル生成 はコメントを受け付けていません。

何をするもの?

WEBサイト上でデフォルトサイズの画像ファイルを元に自動的にサムネイル画像を作成し、サムネイル画像作成の手間を省くのと通信容量を必要最小限に抑えることを目的としたものです。

動作条件

サーバ上で以下のものが動作することが前提です。

 PHP
 .htaccess 及び mod_rewrite
 ImageMagickのconvertコマンド

ImageMagickはインストールされていてもPHP用ImageMagickモジュール(imagick)まではインストールされていない場合も多いのと、convertコマンドのほうが私にとっては扱いも手っ取り早いのでこちらを使用しています。

設置方法

対象とする画像ファイルのあるディレクトリに
.htaccess
thumbnail.php
をアップロードするだけです。

ファイルをダウンロード

使用方法

WEBブラウザから、通常通り画像がアップロードされているディレクトリのURLを指定します。

https://akebi.jp/thumbnail_sample/sample.jpg

サムネイルを表示する場合は、?t=サイズ オプションを使います。

https://akebi.jp/thumbnail_sample/sample.jpg?t=200
.htaccess に記載した mod_rewrite の記述が、画像ファイル名とそれに付けたクエリパラメータを thumbnail.php に渡す役割をしています。
ここで Internal Server Error が表示された場合は残念ながら convert コマンドが使用できないと思われます。

t= で指定したサイズは、thumbnail.php 内で設定してあるサイズに一番近いものに補正されます。
サイズの種類を増やすこともできますが、あまり多く設定するとその分キャッシュファイル用フォルダも多く作られますので、サーバ容量に余裕がない場合はご注意ください。

その他のクエリパラメータ

s: (squareの略) 正方形でない画像から中央部分を取り出して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?s

sf: (square fillの略) 正方形でない画像の短辺側に余白色を追加して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?sf

p: (progressiveの略) JPEG、PNG画像をプログレッシブ(インターレース)化
https://akebi.jp/thumbnail_sample/sample.jpg?p

複数のクエリパラメータを合わせて指定できます。
https://akebi.jp/thumbnail_sample/sample.jpg?t=200&sf

処理の概要

 画像ファイル名が渡される
   ↓
 有効なクエリパラメータは付いているか
   │       ↓
 付いている   付いていない
   │       ↓
   │     オリジナルの画像をそのまま表示
   ↓
 クエリパラメータに対応する画像キャッシュファイルは存在するか
   │       ↓
 存在しない   存在する
   │       ↓
   │     対応する画像キャッシュファイルをそのまま表示
   ↓
 convert コマンドにて対応する画像キャッシュファイルを生成、表示

convert コマンドで作成された画像はサーバ側にキャッシュすることで、以降同じ条件のパラメータで呼ばれた場合には無駄に convert コマンドが実行されないようにしています。

画像ファイル表示処理に関しても、ブラウザから受け取ったリクエストヘッダ内に If-None-Match ヘッダがあるかを確認し、If-None-Match があって画像に対応する ETag との比較結果が一致していれば、HTTP レスポンスステータスとして Not Modified を渡し画像データ自体は送信しないことで、ブラウザ側のキャッシュファイルを有効に働かせ無駄に通信も行なわないようにしています。

使用を中止する場合

画像ディレクトリにアップロードした .htaccess と thumbnail.php 、thumbnail.php によって作成された thumbnail から始まるディレクトリとその中の画像キャッシュファイルを削除して下さい。

参考

ImageMagick Command-line-Tools: Convert
MDN HTTPヘッダー

PHPで画像表示およびconvertコマンドでサムネイル生成 はコメントを受け付けていません。
internet, ソフトウェア by あけび

 Raspberry Pi Zero用 簡易UPSの作成

2019. 4. 26 (金) | Raspberry Pi Zero用 簡易UPSの作成 はコメントを受け付けていません。

電気二重層コンデンサ(スーパーキャパシタ)を使用して、ラズパイZero用の簡易UPSを作成してみました。
あくまでACアダプターが不意に抜けたり停電が発生した場合に安全にシャットダウンさせるだけの時間的猶予を確保するのが目的で、これだけで長時間稼働させられるものではありません。
(コンデンサの容量やラズパイの動作状態にもよりますが、数分程度です)
Zero基準で作ったものですので、消費電力の大きなモデルでは各パーツを適宜変更する必要があるかと思います。

回路と主な使用パーツ

■電気二重層コンデンサ
5V 10F程度あれば、アイドリング状態のラズパイZeroを2~3分程度稼働させる電力が得られます。
(電圧はDC-DCコンバータ等で5Vに安定化する必要があります)
私は手元に2.7V 3.3Fのものがいくつかあったので、これを4並列x2直列で5.4V 6.6F相当として使いました。
5Vでの充電なのでコンデンサの耐圧まで0.4V残っていますが、これくらいであればマージン分と割り切ってもいいでしょう。
気になるようなら充電側にもDC-DCコンバータを入れて充電電圧を5.4Vにする手もあります。
並列は単純に繋げば大丈夫ですが、直列部分はバランス抵抗を入れるなどして均等に電圧がかかるようにしないと、充電状態のばらつきなどで耐圧を超えて充電されてしまうものが出る場合があるので注意が必要です。
面倒であれば最初から耐圧5V以上のものを使ったほうが良いですね。
例えばこれなんかはサイズの割に容量も大きくて良さそうです。
耐圧5.6Vですが、USB ACアダプタの5Vで充電、DC-DCコンバータにTPS63020(最低動作電圧1.8V、変換効率約90%)を使うと仮定して、消費電流500mAの機器で6分弱、150mAの機器であれば20分弱稼働できる計算になります。
コンデンサの静電容量を電池の放電容量に置き換えて考えるために以前作成した変換スクリプトもありますので、使いたいコンデンサの容量を決める際の目安にどうぞ。

TPS61020可変型低電圧DC-DCコンバータモジュール
テキサス・インスツルメンツ社のTPS61020を搭載した、Strawberry LinuxさんのDC-DCコンバータモジュールです。
電気二重層コンデンサは電池と違って直線的に電圧が下がっていくので、このコンバータでラズパイを動作させるための5Vに変換するために使用します。
入力電圧0.9Vまで動作してくれますので、電気二重層コンデンサに溜めた電荷を結構無駄なく使ってくれます。
500mA程度の負荷電流を供給できるのでラズパイZeroであればまだ余裕がありますが、ラズパイ3などではより大きな負荷電流を流せるTPS63020等を検討する必要があるかもしれません。

■ショットキーバリアダイオード SBM1045VSS
コンデンサの電流逆流防止用

定電流源IC NSI50350AS
電気二重層コンデンサは容量が空の時には抵抗がほぼ無く、ゼロからの充電開始時は電源ラインを短絡したのと同様の状態になってしまい、使用している電源によっては負担やダメージを与えてしまいますので、これで電流を制限しています。
350mAを3個並列で使って約1A相当で制限がかかるようにしました。
ラズパイ3等ではここも余裕を持たせる必要があるかと思います。

■各抵抗
アダプタから5Vが供給されている場合と、供給が切れて電気二重層コンデンサ駆動になった場合とでの状態変化をGPIOへ送る電圧を作っています。
この抵抗値の組み合わせだと、他のパーツとの兼ね合いもありますがアダプター供給時に2.4~2.6V前後、供給が切れた時に0.2~0.4V前後になります。
3.3Vと0Vできっちり分かれていませんが、これくらいの電圧であれば迷うことなくHIGH/LOWを判別できるようです。

スクリプト

該当GPIOピンの状態を監視して、アダプターからの電源供給が断たれて15秒経過したらシャットダウン、15秒以内に電源の供給が復帰したらそのまま続行という流れで動作させています。
起動時に自動実行するよう /etc/rc.local に追記して使っています。

実装例と動作の様子



前回記事で電波時計リピーターを作成しましたが、私は今回はその基板の空きスペースにUPSを追加する形で実装しました。
ラズパイZero本体に加えて基板自体も電気二重層コンデンサでのバックアップ範囲としてあるのでラズパイ本体のみの場合よりも猶予時間が短いですが、それでも実測で1分半は持っていますので、最初の15秒を復帰猶予時間としてその後シャットダウンさせても十分間に合っています。

おまけ

稼働時間計算機

電気二重層コンデンサ
静電容量(F)
充電電圧(V)

DC-DCコンバータ
最低動作電圧(V)
変換効率(%)

負荷
電圧(V)
平均消費電流(mA)

稼働時間:

Raspberry Pi Zero用 簡易UPSの作成 はコメントを受け付けていません。
Raspberry Pi, ソフトウェア, ハードウェア by あけび