それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

HDDの消費電力を測定する。

HDDの消費電力を測定する。

PCのCPU消費電力

今回は、n4200系統のCPUを用いた。

通常のPCのアイドリングの消費電力が5W未満-> 電力計で測定不可で0W表示

cpu と メモリでこれくらいの消費電力だった。 - sysbench memory run -> 7W - sysbench cpu run -> 9W

HDDを接続してみた

  • HDD接続 10W-15W
  • HDDがアイドル 7W
  • マウントして電源ON 10W
  • fio をぶん回す 13W
  • HDDアイドリング時 10W -HDDをスタンバイにする。0w
  • HDDにsleepを命令する。 7W

こんな感じでした。起動時の負荷は恐ろしくて、10w 近く起動時に必要だった。

4台接続したPCで起動時の一瞬だけ60Wを使っていた。CPUとファンが15Wくらいだから、HDD1台接続すると、起動時に12wが必要。電源が不足すると起動時にHDDが見つからなくてBIOSすら起動しなかった。

測定方法

測定方法には次のコマンドを用いた。電源消費電力は、ワットチェッカーとSwitcbotの両方で行った。

hdd にスリープを命令する

sudo hdparm -Y /dev/sdx

fio で測定する。

sudo mount /dev/sdb /mnt
cd /mnt
fio -filename=/mnt/test2g -direct=1 -rw=write -bs=4k -size=2G \
   -numjobs=64 -runtime=60 -group_reporting -name=file1

HDDをスタンバイにする。

sudo hdparm -S 0 /dev/sdb

マウント解除してスリープにする。

sudo umount /mnt
sudo hdparm -T /dev/sdb

SATAで接続して、ぶん回すと少し上がるけど、それ以外は極めて低い消費電力である。 高速なSSDのほうが電力をくってるかもしれない。

消費電力のまとめ

  • アイドリングで1-2W くらいだった。
  • ぶん回すと8Wくらいだった。
  • 起動時に10Wだった

つまり、倉庫仕様だと1台あたり、5Wもいかないということですね。

昔の情報だと、電源選びで80Plus関連を見ていると、25W/HDD1台だと書かれてたんだけど、そしてそれがコピされてて、25W位を見積もるみたいな事があったけど、どう考えても5Wで十分であるし、8W程度を見ておけばいいだろう。多めに見積もっても10Wである。起動時に電源を消費するので、10-15wで見積もれば良さそうだ。25wはやりすぎな見積もりだと思った。

8台のHDDを繋いだとしても常時にすべてのディスクに書きこむ(RAID5)でもすると、60WのACアダプタで賄えてしまう。のだが、、、起動時の負荷だけなんとか下げる必要があるよねぇ。

SSDが少なすぎ、HDDが多すぎでは?

ドスパラの自作PCサイトを見ると・・・SSDが3WでHDDが24Wだった。それは無いんじゃないの?って思うんですけどねぇ。

WinREを作り直したときの記録

WinREを作り直し。

WinREを作り直すことにした。

ディスク領域を末尾につくる

これは、末尾に作るのはgdisk が簡単だったと思う。

gdisk64.exe \\

Command (? for help): p
Disk \\.\physicaldrive0: 1000215216 sectors, 476.9 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 9DB1BCCA-303E-4D33-B11E-EBC1072C212B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1000215182 # 末尾は 1000215182
Partitions will be aligned on 2048-sector boundaries
Total free space is 390194566 sectors (186.1 GiB)


Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved ...
   3          567296       610022630   290.6 GiB   0700  Basic data partition

Command (? for help): n
Partition number (4-128, default 4): 607925478
Value out of range
Partition number (4-128, default 4): 4
## 末尾 から1GB確保する。
First sector (34-1000215182, default = 610023424) or {+-}size{KMGTP}: 998118064
Information: Moved requested sector from 998118064 to 998117376 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (998117376-1000215182, default = 1000215182) or {+-}size{KMGTP}:
Current type is 'Microsoft basic data'
Hex code or GUID (L to show codes, Enter = 700): 2700 # winREは 2700(27)
Changed type of partition to 'Windows RE'

Command (? for help): p

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved ...
   3          567296       610022630   290.6 GiB   0700  Basic data partition
   4       998117376      1000215182   1024.3 MiB  2700  Windows RE
   
1000215216
1000215182-1024*1024*1024/512=998118030

再フォーマットとドライブレターの割り当て

> diskpart

diskpart > list disk
diskpart > select disk 0 
diskpart > list part
diskpart > select part 4
diskpart > FORMAT QUICK FS=NTFS LABEL="WINRE"
diskpart > assign letter=r
diskpart > gpt attributes=0x8000000000000001
diskpart > set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"

実際のログ

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          476 GB   275 GB        *
  Disk 1    Online         1886 MB  1085 MB

DISKPART> select disk 0

Disk 0 is now the selected disk.

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             260 MB  1024 KB
  Partition 2    Reserved            16 MB   261 MB
  Partition 3    Primary            200 GB   277 MB
  Partition 4    Recovery          1024 MB   475 GB

DISKPART> select part 4

Partition 4 is now the selected partition.

DISKPART> FORMAT QUICK FS=NTFS LABEL="WINRE"

  100 percent completed

DiskPart successfully formatted the volume.

DISKPART> assign letter=r

DiskPart successfully assigned the drive letter or mount point.

DISKPART> gpt attributes=0x8000000000000001

DiskPart successfully assigned the attributes to the selected GPT partition.

DISKPART> set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"

DiskPart successfully set the partition ID.

DISKPART> exit

用意したWinReをコピーする

MD R:\Recovery\WindowsRE
## xcopy /h C:\Windows\System32\Recovery\Winre.wim r:\Recovery\WindowsRE
## 私はWinREを保存したPATHからコピーした
xcopy /h "C:\Users\takuya\Downloads\Winre.wim" r:\Recovery\WindowsRE

-- C: ドライブのWinREとして、 R:\ を指定する。

reagentc /setreimage /path R:\Recovery\WindowsRE /target C:\Windows
reagentc /setreimage /path r:\Recovery\WindowsRE /target C:\Windows
reagentc /enable
reagentc /info
PS C:\WINDOWS\system32> reagentc /setreimage /path r:\Recovery\WindowsRE /target C:\Windows
Directory set to: \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
REAGENTC.EXE: Operation Successful.

もし、enabledにならない場合は、

## 削除する。
rm "C:\Windows\System32\Recovery\ReAgent.xml" 

WinRE自体は、500MBなので、1GBも確保する必要はなかったかもしれない。

ここで、Cドライブ内部のWinREを指定することもできるが、Bitlockerが有効になってると、できない。

Bitlocker暗号化のCドライブ内部のWinREに起動前にアクセスできるわけがないですからね。

WinREがない場合の対応。

ISOから取り出す。

windowsのISOから取り出す。

ただし、WindowsのISOに含まれるWinREは「古くて脆弱」な可能性がるためにおすすめしません。修正パッチを当てて運用します。

リカバリメディアから

または、USBインストールメディア作成ツールで作ったUSBメモリから取り出す。(おすすめ

WinREの脆弱性修正版を取得する

WinREにはBitlocker回避バグがあるため、最新のものを用意したほうがいいらしい

USBインストール作成ツールで最新のものを用意してない場合やWinREが用意したWinREが危殆化パッチを当てる

reagentc /setreimage /path R:\Recovery\WindowsRE /target C:\Windows

以上の作業により、WinREが確保されるので、

リカバリメディアを作成することができる。

リカバリメディアをシステムを含めて作ることで、手間が大幅に軽減されて嬉しい。

出来上がったリカバリメディアからWinREを切り離してパーティションに導入すれば、最新版のWinREを作ることができる。

自動入力を妨害する最悪な実装(これセキュリティなの?)

銀行で自動入力を妨害するのは罪

ある銀行がパスワードの自動入力を妨害してくる。

自動入力が発動しないのでHTML調査

なんと、dummypass という passwordがありました。

自動入力のほうが安全です。

自動入力が危険だったのは「昔の話」です。昔は、自動入力のデータをウイルスに狙われました。今は、もう狙われません。というより、ウイルス感染の危険性がほぼゼロです。なんならiPhoneはすごく安全です*1

自動入力が安全な理由

主な利点は次の点です。

  • 自動入力は「フィッシングサイト」に気づける。
  • 自動入力は「複雑なパスワードを使える」
  • 自動入力は「ショルダーハッキングに強い」
  • 自動入力は「使い回し防止」になる
  • 自動入力は「入力前に顔認証」できる

とんでもなく、メリットが大きいです。使わない理由なんて無いんです。

自動入力妨害をしていたであろう理由はもうない

パスワードが盗まれるリスクがほぼ無いのですから、「自動入力を妨害する意味」はもう無いんですね。

デメリットの逆転

つまり、妨害により得られるメリットとデメリットの関係性が逆転しているのです。

技術の進歩によりセキュリティのメリット・デメリットが逆転しているのです。

いつまでも昔のテンプレをコピーして給与がもらえるとか、JTCは老害ですね。このダミー行為のために、「何人ものコンサルと上長と現場担当が会議をしている」と考えると恐ろしいですね。

セキュリティは棚卸しが必要

セキュリティは「リスクに応じて対策する」というのが基本です。昔のセキュリティ対策を見直しもせずに、コレが安全です。と利用者に提示するのは罪深いし、ましてやこっそり妨害行為とは許しがたいのです。

予算や知識がないのでなく、怠慢なのです。

過去の発見

自動入力は安全なのにいつまでも妨害する意味がわからない銀行たちの過去の記録など。

*1: サイドローディングという安全性を破壊する方法を日本政府は導入しようとしていますが、とても危険なことです。

Grep に'\K' という便利な書式がある。

Grep に'\K' という便利な書式がある。

look behind を使って、必要な場所を取り出すことができる。

(<?=xxx) を使った場合

ip -o addr show  dev br0 | grep -oP '(?<=inet )[\d.]+'

\K を使った場合

ip -o addr show  dev br0 | grep -oP 'inet \K[\d.]+'

\K の書式について

\K より前はマッチ結果に含まれない(マッチはチェックされる)

echo abcdefg | grep -oP 'abcd\Kefg'

\Kをつけることで、マッチ試行が行われるが、マッチ文字列には取り込まれない。

-o はマッチ結果を表示するオプション

だから、何かの後ろ にあるものを取り出すので look behinde expression (後読み)と呼ばれる。

\Kを使えば、マッチグループを省略できる

\Kが使える環境であれば、後方参照を省略して、マッチ部を取り出せるので、便利。

grep はマッチ部しか取り出さないので、grep と組み合わせると特に有効に働く。

関連資料

https://takuya-1st.hatenablog.jp/entry/2017/11/03/000000

TL-SG105E/SG108E で ポートミラーリング

アンマネージプロスイッチ が 2500円程度で購入できるので、家では何台か導入しました。

TL-SG105/108 で ポートミラーリングもできるので、WOLパケットの調査に使った。

Port2 のパケットをポート3にミラーリングする設定。

ポート番号を指定して、ミラーをEnabledにすればパケットが流れてくるのでそれをモニタリングすればOK

VLAN(タグ) VLAN(ポート)が作れて、2台買って5000円だからお買い得。

bash で変数にデフォルト値を設定する方法(bashで変数初期化)

bash で変数にデフォルト値を設定する方法

VARIABLE=default
if [ ! -z $VARIABLE ] ; then FOO=$3; fi   

これをぱぱっとかける。

FOO="${VARIABLE:=default}"

初期値を登録できると、本当に便利だし、この書式を知ってるだけで、記述量とifネストが改善されて、楽になると思う。

損保ジャパンの自賠責の更新ページが控えめに言ってクソだった

損保ジャパンの自賠責更新ハガキが届いたけどアレだった。

HTTPは有りません。HTTPです。ありえないです。 QRコード対応するより先にやることがあるはずです。

HSTS も効かない。

HSTSやリダイレクトが効いてるなら、まだ少しだけ救いようがある。

>curl http://ijibai.com

駄目です。CP932です。JSでリダイレクト代替してます。アウトです。

curl  http://ijibai.com | nkf
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   488  100   488    0     0   9967      0 --:--:-- --:--:-- --:--:-- 10166
<!DOCTYE HTML PUBL8IC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">
<META HTTP-EQUIV="Content-Type" Content="text/html; charset ="Shift_JIS">
<META HTTP-EQUIV="Content-Script-Type" Content="text/javascript">
<TITLE>自賠責保険インターネット契約【i自賠】</TITLE>
</HEAD>
<BODY onload="JavaScript:OnClick_smp();">
</FORM>
<script type="text/javascript">
function OnClick_smp()
{
  location.replace('https://ijibai.sompo-japan.co.jp/koukai_auth1');
}
</script>

</BODY>
</HTML>

リダイレクト先がめちゃくちゃ

LetsEncryptとかでHTSTSを設置してればいいものを

しかも、オレオレ証明書なので、CDN設定をミスってるのだろうか

てか、よく見ると、これ同居型のホスティングじゃね?

 curl -v https://ijibai.com
*   Trying 153.122.205.49:443...
* Connected to ijibai.com (153.122.205.49) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS header, Unknown (21):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self-signed certificate
* Closing connection 0
curl: (60) SSL certificate problem: self-signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

OH...ドメインパーキングですわ。

しかもリダイレクト先のURLは、最初のドメイン名と違う。

しかも多言語設定を放置している。

せっかくフレームワークに多言語設定があるのに、それを放置するので、表示が壊れている。

駄目すぎる

ポイントは次のところ

  • この記載URLはリダイレクト専用。
  • httpでリダイレクトする。
  • 実際の契約画面は別のドメイン

ドメイン名を軽視しているのは、違う。

リダイレクト専用であっても契約画面のドメイン名をはがきに記載しないと意味がない。

そもそも、手打ちでURLを入力させたいなら、短縮URLを社用の作成すべきだろう。 そうじゃないなら、QRコードを使うべきだろう。

HTTPSをちゃんと扱えてない。

HSTSあつかうどころか、JSでリダイレクトですよね。コレではプロトコルによる通信での安全確保が動かないです。そもそも、HTTPで運用するという神経がセキュリティを軽視している。

晒し上げ。

こんな会社が、セキュリティ対策を云々で高額な費用を掛けているとかちょっとねぇ。

基本的なところを見逃す。ってやばくないですかね。

客の安全より社内のセキュリティを重視しているのでしょうね。

こんな会社、サーバー書き換えられてクレカ情報入力フォームが改ざんされてカード情報を抜かれて事件になってもおかしくない。

ということで、晒し上げました。

cygwin/msys で ddすると、めっちゃ遅い。

まともに動かない。

普通にDDした場合

速度がちゃんと出る。SSDの問題ではない。

その差100倍。辛い。

windows の msys の問題であり、windowd のディスク管理の問題でもあるが、USBでWriteの速度が出ないのは、USBエンクロージャーの性能の悪さも影響していそう.SSDを使うならPCIeのほうが断然信頼性が高いが、msys ではUSB以前の問題だった。

時間がかかっても終わるから、動いてるといえば動いているが、CD-ROM程度なら我慢できた昔のCygwinのDDだが、SSDを丸ごとバックアップ取るには、もう使い物にならない。と思う。

msys を使ってパッケージをインストールする

msys を使ってパッケージをインストールする

パッケージのアップデート

pacman -Syuu

パッケージの検索

pacman -Ss fdisk

パッケージのインストール

pacman -S mingw-w64-x86_64-gptfdisk
pacman -S mingw-w64-x86_64-aria2

とりあえず、ddfdiskが使えるようになるので、ディスクをコマンドから操作できるようになる。

\\.\PHYSICALDRIVE1などWinの物理ディスク情報を調べる。

\.\PHYSICALDRIVE1などのディスク情報を調べる。

\.\PHYSICALDRIVE1

参考資料のとおりにコマンドを入れてみる。

Get-WmiObject Win32_DiskDrive | Select-Object -Property BytesPerSector, DeviceID, Model, Partitions, Size | Sort-Object DeviceID | Out-GridView

DataGridView って Ps から簡単に使えるんですね

wmic でやると

wmic でやると、ちょっとめんどくさい。

結果は長いので、vim などで見た方がいい

wmic partition list > part.txt
wmic diskdrive list > disk.txt
wmic volume list > vol.txt
wmic logicaldisk list > letters.txt
vim disk.txt

横ではなく縦に並べれば、詳細を見るのが便利かもしれない。

wmic partition get \* /format:list

ちなみに、番号を調べるだけなら、diskpartでもいい。

DISKPART> list disk
DISKPART> select disk 1
DISKPART> list part

パーティションが複数ある場合

\device\harddisk1\partition1

ディスクの採番書式

ディスクの番号の割当は、次のように順番になっている。

パーティション1と2という2つのパーティション構成のストライプボリュームがあるとしましょう。このボリュームは、図10-16のように、\Device\HarddiskVolumes\PhysicalDmVolumes\BlockVolume3というデバイスオブジェクトとして表現されているとします。また、管理者はこのストライプボリュームにドライブ文字Dを割り当て、I/Oマネージャは\Device\HarddiskDmVolumes\ComputerNameDg0\Volume3を参照するために、\Global??\D:というシンボルリンクを定義しているものとします。既に説明したように、このシンボルリンクは https://atmarkit.itmedia.co.jp/fwin2k/bookpreview/insidewin42/insidewin42_07.html

https://docs.oracle.com/cd/E57425_01/121/NTQRF/ap_raw.htm

物理ディスクは、ディスク全体を示し、次のように指定します。

\Device\Harddiskx\Partition0

シンボリック・リンク名\.\PhysicalDrivexは、コンピュータ内のすべてのハード・ディスクに対して、Windowsによって自動的に定義されます。たとえば、3つのハード・ディスクがあるコンピュータには、次のシンボリック・リンクがあります。 txt \\.\PhysicalDrive0 \\.\PhysicalDrive1 \\.\PhysicalDrive2 これらの名前は、内部的に次のように展開されます。

\\.\PhysicalDrive0 =\Device\Harddisk0\Partition0 
\\.\PhysicalDrive1 =\Device\Harddisk1\Partition0 
\\.\PhysicalDrive2 =\Device\Harddisk2\Partition0 

ということなので、パーティション番号とディスク番号がわかれば、そのドライブへアクセスできるとわかる。

たとえば、\\.\PHYSICALDRIVE1 があって、次のように wmic partition list の結果があったとする

GPT: Unknown     Disk #1, Partition #0  1
GPT: Unknown     Disk #1, Partition #1  1
GPT: Unknown     Disk #1, Partition #2  1

すると、次のようにアクセスできるはずである。

\Device\Harddisk1\Partition0 

ポイントとしては、パーティションはゼロから数えるということ。

msys / wsl から dd で 生デバイスにアクセスできるか試す。

msys で dd すれば良さそうに思えるが、\\?\Device\にはアクセスできずに、ファイルが作成されている。つまり、cygwin/msys のdd コマンドは、生デバイスをアクセス不能

何なら、WSLのDDもあるが、msysと同じくデバイスにはアクセスできずに終わる。

dd for windows なら

Windows版のDDコマンドを使うしかなさそうですね。

dd の windows 版を試してみる。 .\dd.exe if="d:\sdb3.img" of='\\?\Device\Harddisk1\Partition2' --progress 出来たっぽい

rufus は?

rufus はドライブが見えないとだめだしなぁ 内部的には使ってるんだろうけど、UIで見れない。

Drive? を扱うには

rawrite や windows 版 dd.exe を使うしかなさそう

パーティションtoパーティションってWindowsでは茨の道ですわ。

参考資料

CSSで隣接ノードの「先頭3つ」を取る。(自分の直後の3つのCSSセレクタ)

CSSの隣接ノードで、指定したIDの直後の3つまでを指定したい。

#id ~ div:nth-of-type(-n+3) {
 background-color:black; 
}
<div id="id"></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>

結果

ここから、隣接ノードで自分の直後の3つ(隣接ノードの中の先頭3つ)を選ぼうとしたら

#id ~ div:nth-of-type(-n+4) 

コレで、取れることがわかります。

メモ (2024-05-13)

ただし、has と組み合わせするとうまく動作しなかった。

css has と同じことをXPATHで実現したい。

css has と同じことをXPATH

子ノードにformを持つTableを探すことが:hasでできる

table:has( form[name='WebMeisai')

xpath:hasを記述とすると

document.xpath("//table[.//form[@name='WebMeisai']]")

これは過去に〇〇を持つ〇〇要素をXpathで抜くというXPATHを考えまくったことがあるので簡単だった。

たとえば、twitter の who to folllow あたり

##:xpath(//div[@data-testid="cellInnerDiv"][.//h2[@role="heading"][@aria-level="2"]]/following-sibling::div[position() <= 4])

CSSのHasの場合、兄弟ノードが動作不良だった。なので[position() <= 4]のようなことを書くことができない

xpath なら //id/a[position() <= 4]css なら #id ~ a:nth-of-type(-n+4) とかけてもいいはずなのだが、has といっしょに使うと思ったように動かないので困った。バクじゃね?

デフォルトのPDFのアイコンがEdgeとChromeで奪い合い

デフォルトのPDFのアイコン

C:\Program Files (x86)\Microsoft\Edge\Application

Google chrome は味気ないアイコン過ぎる

ひどいよね

アイコンを変えても、しばらくしたら、元に戻される。 Google Chromeに紐づけすると、頻繁に更新が来て、あっという間にもとに戻される。

名前も取られる。

PDFじゃなくて、MSEdgePDFという名前になる。

無理やり変えてもアップデートで

関連付けを変えてもアップデートで変更されるし

アイコンを変えてもアップデートで変更されるし

シェア奪い合いの戦争ならほかでやってほしい。

困ります。

なにかいい方法がないんですかねコレ。

暫定的対応法

FileTypesManでPDFを強引に変更する

MSEdgePDF -> ChromeHTMLに
アイコンを PDFに(PDFアイコンはEdgeかAdobeから取ってくる)

MSEdgePDF をChromeHTMLとしてコピーして上書きした。

PDFを変えた結果

その他の方法

今回は、FileTypesManを使ったが、他の方法もある。

PDFファイルをChromeに関連付けしたときのアイコンを変える #Windows - Qiita

snap なしで、firefoxをインストールする。

snapd を排除したい。

USBメモリubuntu を入れると、めっちゃsnapdがメモリやストレートを浪費して遅いので、firefoxdeb で入れたい。

そもそも、usbメモリubuntuインストールで、snapdを使いたくない。

snap なしで、firefoxをインストールする。snapdを消したい。

snap 版を消す。

snap を排除するのは以前やっている。

ubuntuから snapd(snap/snapcraft) を除去(アンインストール)て snapcraft 抜きのubuntuにする - それマグで!

firefoxのapt版(.deb版)を使えるようにする。

参考資料にしたがってやった

mozilla のppaを追加

sudo add-apt-repository ppa:mozillateam/ppa

ubuntu の場合firefoxはsnap 版が優先されるので、mozillaレポの.debを優先するように書き換え

echo '
Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 900
' | sudo tee /etc/apt/preferences.d/mozilla

アップデートして

sudo apt update && sudo apt upgrade 

インストール

sudo apt install firefox

今回は、USBメモリ・インストールなのでキャッシュをtmpfsにした。

echo tmpfs /home/takuya/.cache/mozilla tmpfs uid=$UID,defaults,nodiratime,noatime,mode=0700 0 0 | sudo tee -a /etc/fstab

参考資料

https://www.how2shout.com/linux/how-to-install-firefox-on-ubuntu-22-04-or-24-04-without-snap/

firefox のプロファイルをunionfs(+tmpfs)にして揮発性にして寿命を延ばし高速化する。

firefoxのプロファイルを揮発性(ramdisk)にする

USBメモリUbuntuをインストールし、LiveUSBのように使っているのですが、Firefoxを起動すると遅い。ファイルのキャッシュを作成するときに時間掛かっている模様。これはUSBの寿命にも良くない。

そこで、firefoxのキャッシュフォルダをtmpfs にした

tmpfs /home/takuya/.cache/mozilla tmpfs uid=1000,defaults,nodiratime,noatime,mode=0700 0 0

それでも、まだ遅い。書き込みを見ていると、プロファイルも大量に更新が入ってる。そうかクッキーやヒストリがプロファイル・フォルダに書き込まれるのか。

それなら、プロファイルもramdisk にしたいところ。

プロファイルのramdisk

プロファイルをramdisk 化すると、毎回初回案内が出てきてうざったいし、設定が残らないのも困るので、最低限設定しておいいて、初期設定済みのプロファイルにramdisk をかぶせ使う(unionfs)することにした。

次のようにフォルダを作って、unionfs で使うようにした

役割 変数名 パス
tmpfs volatile /home/$name/.mozilla/volatile
unionfs upper /home/$name/.mozilla/volatile/upper
unionfs work /home/$name/.mozilla/volatile/work
元プロファイル base /home/$name/.mozilla/firefox.base
unionfs merged /home/$name/.mozilla/firefox

最初に、tmpfs をつくって、そのなかにプロファイル格納用の揮発性マウントを作成。
unionfs はワーク領域が必要なので、最初に作ったtmpfs内部に作業エリアを設置。
揮発性マウントの下側に、baseとなるプロファイルをマウント。
揮発性マウントの中に、キャッシュを格納するマウントを追加。

まぁunionfs をためてしてみたかったというのがある。

これでメモリに書き込むfirefoxの設定とした。

ただ、とってもめんどくさいのでfstabに記載することを諦め、起動時に、自動的にマウントを作るようにした。

履歴を保存するときは、手作業でmerged の内容を base へcopy する。umount イベントで実行しようかと思ったけど、後回し。

/etc/systemd/scripts/firefox.mount.sh

#!/usr/bin/env bash

function mount_cache(){
  mount -t tmpfs tmpfs -o uid=$id,defaults,nodiratime,noatime,mode=0700 $cache_mozilla
}
function umount_cache(){
  grep -qs $cache_mozilla /proc/mounts && umount $cache_mozilla

}
function load_env(){
  name=$1
  id=$( id -u $name )

  cache_mozilla=/home/takuya/.cache/mozilla

  volatile=/home/$name/.mozilla/volatile
  upper=/home/$name/.mozilla/volatile/upper
  work=/home/$name/.mozilla/volatile/work
  base=/home/$name/.mozilla/firefox.base
  merged=/home/$name/.mozilla/firefox

  ibus=/home/$name/.cache/ibus
}

function mount_ibus(){
  mount -t tmpfs tmpfs -o uid=$id,defaults,mode=0700 $ibus
}
function umount_ibus(){
  grep -qs $ibus   /proc/mounts && umount $ibus

}

function mount_overlay_profile(){

  [ ! -e $volatile ]; mkdir -p $volatile
  mount -t tmpfs tmpfs -o uid=$id,defaults,nodiratime,noatime,mode=0700 $volatile
  [ ! -e $upper ]; mkdir -p $upper
  [ ! -e $work ]; mkdir -p $work
  mount -t overlay overlay -o lowerdir=$base,upperdir=$upper,workdir=$work $merged

}
function umount_overlay_profile(){
  grep -qs $merged   /proc/mounts && umount $merged
  grep -qs $volatile /proc/mounts && umount $volatile
}

function main(){
  name=$2
  [ -z $name ] && name=takuya
  load_env $name
  case $1 in
   mount)
     mount_cache
     mount_overlay_profile
     mount_ibus
     ;;
   umount)
     umount_cache
     umount_overlay_profile
     umount_ibus
     ;;
   *)
     echo "$0 [mount|umount]";
  esac
}


main $@

マウントを試してみる。

sudo /etc/systemd/scripts/firefox.mount.sh mount
findmnt 
sudo /etc/systemd/scripts/firefox.mount.sh umount
findmnt 

サービスを作って有効化

つくったスクリプトを呼び出すためにサービスとしてログイン時や起動時に実行することにした。

/etc/systemd/system/firefox-tmpfs@.service

[Unit]
Description=Mount %s firefox 
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/systemd/scripts/firefox.mount.sh mount %s
ExecStop=/etc/systemd/scripts/firefox.mount.sh umount %s


[Install]
WantedBy=multi-user.target

有効化

sudo systemctl daemon-reload
sudo systemctl enable firefox-tmpfs@takuya.service

履歴の保存

明示的に保存するときは lower にコピーすればいい

rsync -av ~/.mozilla/firefox/ ~/.mozilla/firefox.base/ 

メリット

爆速。本当に速い。キャッシュ作成がブラウザの遅延の原因だとよく分かる。

長寿命。USBメモリMicroSDカードだと書き込みが本当に減るので寿命が長くなる。

懸念点

終了時に保存する方法に、いい方法があればいいんだけど・・・・

unionfs は実装が古いので、aufs やfsprotecで書ければよかったけど詳しくないので。

今回は、apt の firefoxを使っている。ubuntuのsnapstore 版のmozilla はこの方法だとうまくいかないかもしれない。