それマグで!

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

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

journald がログエラーで無限ループになってサーバーが応答なしになった。journald の上限を決める

サーバーの容量不足で無限ループになった

知らない間に、サーバーにDockerのキャッシュを溜めすぎて、残容量が底をついた。

気づかずに発生した

journald が無限ループ

journld は閾値をもっていて、一定量以上のログを書き込みしないはずだが、容量不足なってエラーになり、エラーログを書き込もうとしてまたエラー、そのエラーを書き込もうとして更にエラーになった

journald の設定を明示的に書いておくことにした。

自動設定ではjournald は無限ループになってしまうことがわかったので。 /etc/systemd/journald.conf に設定を明示することにした。

/etc/systemd/journald.conf

[Journal]
SyncIntervalSec=10m
RuntimeMaxUse=5G
RuntimeKeepFree=10G

こちら(https://isleofhoso.com/journald-conf/)を参考にいくつか設定を書いた。

設定を反映

sudo systemctl restart systemd-journald

docker を整理

sudo docker image prune -a 
sudo docker volume prune -a 
sudo docker container  prune

image がいい感じに消えてくれないので 明示的に消した。

docker 怖いよ。。。

2022-06-20 追記

また、エラーになった。SSDがぶっ壊れか、XFSがエラーになったかどちらかだと思う。

XFSをリペアして様子見する。

phpでThe server requested authentication method unknown to the client.

php で次のようなエラーが出る

The server requested authentication method unknown to the client

原因 php-mysql の接続でエラー

エラーの原因は mysql の認証方式の変更に対応できないエラー

いままで、mysql は mysql_native_password だったが、mysql8 あたりで caching_sha2_password になっている

対処方法

候補は次の通り、

mysql 8 の caching_sha2_password を殺し、mysql_native_password を使う。

または、

mysql_native_password 時代に対応した mysql 5.x 系を使う。

mysql 5.x 系を使う場合

ubuntu / debianmysql を併存させるのは苦労でしかないので docker を使う

docker run -d --rm \
   --name mysql-5 \
   -p 3304:3306 \ 
   -v /data/mysql5-server/data:/var/lib/mysql \ 
   -e MYSQL_ROOT_PASSWORD=**PASS** \
   mysql:5

あえて古いUbuntuDebianを用意してもいいけど、基本的に非推奨だし、Dockerに閉じ込めればいいわけですから、これでいいでしょう

mysql8 に mysql_native_password を使わせる

これは、ちょっと茨の道。いくつかのポイントを抑える必要がある。

ユーザーの現在の認証方式を確認する。 以下のユーザの通り、mysql_native_password にしていると、mysql_native_passwordを使って認証することになる。

mysql > select User, Plugin from mysql.user;
mysql root@(none):(none)> select User, Plugin from mysql.user;
+---------------------------------+-----------------------+
| User                            | Plugin                |
+---------------------------------+-----------------------+
| connect_test                     | mysql_native_password |
| takuya                          | caching_sha2_password |
| mysql.infoschema                | caching_sha2_password |
+---------------------------------+-----------------------+

mysql_native_password を使う設定

my.cnf で設定を変更する

[mysqld]
default_authentication_plugin=mysql_native_password

再起動する

systemctl restart mysql

注意点。デフォルト値の変更

デフォルト値を変更すると、mysql_native_passwordが優先される。

接続時に mysql_native_password がクライアントに通知される。

caching_sha2_password は使えるけど、トラブルが多い。mysql_native_passwordが先に通ってしまうので。クライアントはmysql_native_passwordを送ってくる。

なので、mysql_native_password と caching_sha2_passwordを混ぜた運用はしないほうがいい。

また caching_sha2_password に未対応のphp といえば、php5.6 や php7.0 なので、そのような古いPHPでしか動かないコードを最新版のMySQLで動かそうとするほうが無茶なので、素直にphpソースコードをアップデートしてパッチを當てるか、古いものは古いものと合わせてDocker環境に閉じ込めて動かしたほうが素直だと思います。

参考資料

https://improve-future.com/mysql-php-the-server-requested-authentication-method-unknown-to-the-client.html

iCloudフォトのデータを全部取り出す方法(エクスポート)

Windows版のiCloud を使って iCouldの写真データを取り出す。

これ駄目です「iPhone をUSBにつないでデータ取り出したらいいじゃん?」

iCloudサブスクリプションを契約したiOSのデバイスは、端末に写真を持っていません。

大事なので繰り返します。iphoneは端末に写真を持っていません。しかも画質とサイズを劣化させたファイルを持っています。なので、DCIMフォルダからUSB経由で取り込んでも、無駄です。ごく一部しか取り込めません。iphone取り込みはicloud契約後は機能していません。

iPhoneサブスクリプションの広告を出すが、Apple ははエクスポートについて大事なことは知らせてくれないのです。

WEBダウンロードすればいいじゃん→出来ません。

「WEB版 iCloud.com からバックアップ」 をしようとして、iCloudフォトにアクセスし、データをダウンロードしようとすると、次のようになる。

写真は、個人でも軽く3000枚を超えることでしょう。項目を選択してダウンロードは事実上不可能なのです。

エキスポート機能(取り出し)はありません。

icloudサブスクリプションを契約して、icloud photo にデータをアップロードしたアップロードデータを纏めて取り出す機能は、現在(2022-06-10)のところ存在しません。

Googleアカウント・Googleフォトであればエクスポート機能があり、一括ダウンロードと分割ダウンロードができるようになっていますが、Appleにはありません。

繰り返します。WEB版 icloud.com には「取り出し・一括ダウンロード」はありません。

無茶を言うAppleiPhone にダウンロードで取り込め」

Appleの公式サイトを見ると、取り出し方の指示が書いてある。

Appleの指示は「iphoneにダウンロードでicloudから取り出せ。」です。むちゃくちゃです。

Appleの公式にある手順を見ると、次のようなマニュアルになっています。

iOSでPhoto.appを開き、 写真をすべて選択、 メニューからダウンロードを選ぶ、 ダウンロード完了を待て。

このようにと書いてある。しかし、この手法は絶対に実現不可能です。なぜならiOSが容量不足になるからです。

iCloudの容量よりiPhone端末容量のほうが圧倒的に小さい。

AppleiPhone写真をiCloudに移動して容量を節約と言って売り込んでいる。だから根本的にダウンロードは不可能なはずだ。なのにiPhoneへダウンロードを推奨される。完全に詰みである。

では、どうするのか。

解決策。Windowsicloudで取り出す。

Windowsicloudアプリケーションを使うと確実に取り出すことが出来ます。

icloudをダウンロードしてログイン

iCloudアプリケーション(win)は、Microsoftストアに用意されています。これをダウンロードし、インストールし、AppleIDでログインします。

iCloud 写真」フォルダを開く

Apple IDでログイン後に、iCloud photoを有効にすると、WindowsiCloudフォルダの「同期フォルダ」が出来ます。

この専用フォルダ(仮想フォルダ)を通してファイルが一覧できるようになります。

ただし、これはクラウドのファイルをWindowsエクスプローラで見ているに過ぎない(仮想フォルダ・同期フォルダ)。ファイル自体は、Windowsにまだ同期されていません。

次の手順で、iCloudからファイルをダウンロードします。

ファイルを選択肢「このデバイスに保存」

ファイルを選択し、右クリックから「Alaways Keep On This Device」を選びます。すると、iCloudのサーバーからダウンロードが始まります。

ファイルの一覧が同期中の例

注意点。枚数に注意

icloud.com にアクセスし、「写真の枚数」と「ビデオの本数」を確認します。

このファイル数と同じファイルが、Windowsに一覧表示されるのを待ちます。

同じ枚数分の一覧がウィンドウズに出てくるまで待ちます。(icloudのファイル・リストがWindows同期されるのに1時間かかります。)

すべて選んでダウンロード

すべて選択し、枚数が同じになることを確認したら、ダウンロードです。

ファイルの一覧が「すべて同期」された状態で、ファイルの中身をダウンロードします。

繰り返しになりますが、ファイルの一覧が動機済み状態で、ファイルのダウンロード(このデバイスに保存 / Always keep on this device ) を選びます。

タスクトレイから同期状況を確認

Windowsのタスクトレイに、iCloudアイコンがあります。クリックしてダウンロードの状況を確認します。ダウンロードはすごく時間がかかります。3時間位は覚悟してください。

転送エラーになる。でも辛抱強く

大量にダウンロードすると、Appleサーバーからキックされて、接続エラーが出ます。また、短時間に大量にダウンロードするのでISPからコネクションを切断されることもあります。

スリープに注意

ダウンロードを予約して、Windowsを放置すると、Windowsがスリープします。Windowsがスリープすると、ダウンロード転送も止まるので注意が必要です。

ダウンロードが完了した状態

次のように、ファイルに✔がついたら、ダウンロードは完了です。

ただ、この状態は、iCloudと「同期」した状態、且つ、ローカルコピーを作った状態です。

この状態では、icloudで写真が追加削除されると、その状態に同期されてしまいます。

デスクトップに取り出す。

iCloud 写真」から「デスクトップ」に写真をコピーしてください。

これで、同期を解除してもデータが喪失することはありません。

以上の手順まとめ

  • windowsicloudを使う
  • icloud写真フォルダを開く
  • ローカルコピーを作る
  • 同期を辛抱強く待つ
  • 同期が終わったら別の箇所へコピーして保存

です。

エクスポート機能がない、同期フォルダを経由しないといけない。という点が必須知識ポイントです。

同期フォルダに馴染みがある人にはわかりやすく、馴染みのない人には全く理解できない手順になっています。

初心者には理解が無理な仕様

AppleiCloud photo は、安いです。130円です。円ドルレートを考えても安いです。

 しかし、漁師の定置網漁のようなものです。定置網に誘導されたお魚は一生そこから脱出することが出来ず、漁師(Apple)にすくい上げられるのです。

 ダウンロードはここまで述べたような注意点に留意が必要です。スマホしか触ってない世代には、このようなデータ取り出し方法は理解も実行も困難です。

 PC初心者が、データ取り出してiCloud photoの課金停止は不可能です。課金停止しようとしたら、「データを諦める」のが最有力の選択肢に出てきます。データを諦めるほうが優先されてしまうことでしょう。

 本文中で述べたように、Appleの指示はわかりにくく、詰みが発生します。そもそも初心者に課金停止後の安全なデータの取り出し方法の「手順」がまともに提供されてません。そんなAppleicloud photo に一生課金続けますか?それとも今すぐやめますか?

 今すぐiCloud課金をやめて、データを自分の手に取り戻し、同期先を変えるべきだと考えます。nextcloud などほかサービスに転送すべきだと考えます。

 年間2500円程度の支出を気にし過ぎだろ。と思うかもしれません。

 そんなあなたに言いたい、また次のiPhoneを買うんですか。データを取り出せないために、乗り換えが心理的負担になっていませんか。お金で換算できない価値を失っていませんか。選択肢も所有権も私達にあるべきです。  また、古い写真は捨ててしまってもいいと思いますよ。整理されてない情報は持っていても無意味です。

その判断も、私たちの管理下にあってこそ意味があります。方法が分からずデータを捨てるなんて悔しくないですか?私たちの管理下に取り戻し、自分で決断し捨てる行為に意味があるのではないでしょうか。

HTMLのリセット(reset)ボタンで検索条件をクリアのときに、すでにデータがあるとクリアされない

html で検索フォーム

HTMLのFormで検索フォームを作ると、検索条件のリセットが欲しくなる。

とくにテストしているとリセットボタンが欲しくなる。

フォームのリセット

フォームのリセット、とても簡単です。HTMLの遺物を使えばいいんです。

<form action=search method=get>
<input type=search name=user value='' >
<input type=submit value=search>
<input type=reset value=reset >
</form>

とても簡単です、ボタンを一つおけばいいのですから

<input type=reset value=reset >

問題点:リセットはクリアじゃない

WEB側のCGI*1でHTMLを生成するとき

サーバー側でHTMLレンダリングを行っていると

<input type=search name=user value='takuya' >

サーバー側から送られた状態にリセットされます。

リセットボタンは、ユーザーの入力による変更を破棄であり、フォームのクリアではない。

解決策1

input[type=search] を使えばいい。検索フォームに input[type=text] は使わない

なぜか?input[type=search] はMDNに記載があるように、ブラウザ側でフォームの値を持ち回してくれる。なんちうHTML要素だ。

phpなどでecho が不要になるのである。

search なら次は書く必要がない。

よく見る、検索文字列のHTML代入だけど、これが不要。

<input type=search name=user value='<?php echo $cond;?>' >

type=search ならこれだけ

ブラウザが勝手にやります。

<input type=search name=user  >

これを使っておけば、input[value]は常に空っぽの状態になる。そのためリセットボタンは正しく動作する。

できる限りsearch を使っておく

できる限りsearchを使っておくと、リセットボタンが正しく動作する(HTMLにデフォルト値を入れないため)ということなので、type=searchがうまく使えるようにdisplay:noneと組み合わせて組み立ててあげればいい。ただし、ブラウザ次第で戻るボタンで値が戻る場合があり、ブラウザごとの挙動を調べ上げるのがちょっと不便。

解決策2

古のオーパーツ(FormElements)のAPIを使う。

ボタンにセレクトやチェックボックスが混じってるとDOM操作でフォームのインプットの各要素のValueを設定しておくのは面倒すぎる。

そこで、太古の昔に存在したFormElementsを使う。

var myForm = document.getElementById("#btn").form
myForm.elements[0].value='';
myForm.elements[1].value='';

ちょっとだけ、最近のJSぽく書いて、クリアボタンを設定する。

document.addEventListener("DOMContentLoaded", () => {
    document.getElementById("form_clear_btn").addEventListener('click', ev=>{
      const form = ev.target.form;
      Array.from(form.elements).forEach( e => e.value='' )
    });
})

MDN にドキュメントが残されていて、HTMLFormElement.elements の使い方が見れる。DOMにアクセスして値を書き換えるのだが、アクセス方法はHTMLFormElementsであり、HTMLFormElementを介してアクセスする。

JSのこの仕様を久しぶりに使ったんだぜ。この form.elements 関連のAPIって未完成だけど、React/Angularのように、フォームとDOMの分離を企図したような残滓(?)を感じる。

方法3

リセットボタンで、フォームの書き換えは諦めて、GETのquery_string ( ?name=value)を除去し、ブラウザを移動させてしまえばいい。

location.href=location.href.split('?')[0]

何も検索条件が入力されてない状態のURLを読み込めば、リセットボタンと同じ効果が得られるのである。実にシンプルな解決方法である。

リセットボタンの扱い

リセットボタンは、デフォルト値にリセットするわけです。

デフォルト値は<input value=123456 >のようにHTMLに仕込まれた値です。

リセットが効かない。フォームにリセットは無用ではありません。使いどころが大事なのである。

問い合わせフォームにクリアボタンを置くのは、たしかし無用の長物です。でも。検索フォームは違う。

「リセットボタンは検索時に使う」のです。データを検索しフィルタリングするときこそ、リセットボタンが役に立つのです。

リセットボタンは設置したたらだめ。と古い記事を見かけますが、それは”問い合わせフォーム”などPOSTするフォームの話であり、検索条件を入力するGETのフォームの話ではありません。「リセットボタンはだめ」と覚えていたなら、それは大きな間違いです。

といっても、問い合わせフォームで値をvalue=aaa で戻したときは不便です。

このようなめんどくさいところをさくっとJSON取得で解決できるので、ReactやAngularやVueが便利だと思うんだけどね。それら使ってないサイト・プロジェクトに、検索条件の維持とリセットのためだけにVueを埋め込むのもありえないよね。

ということで、検索系のHTMLをサーバーサイドレンダリングで十分なパフォーマンスが得られると考える場合、Vue・ReactでSPAする意味もあまりない気がするんですよねぇ。*2

参考資料

*1:あえてこういう古い言いまわしをている

*2:検索結果のHTML生成がキャッシュされ、多人数がリバプロ経由で再配信を受けとれる場合ね

Raspi Zero / WH をOTGで使う。

Raspi Zero / WH をOTGで使う。

OTGで使うと、pi zero がUSBデバイスのフリをすることができる。

こんな事ができる。

  • USBシリアルポートデバイス
  • USBネットワークデバイス
  • USBストレージデバイス
  • USBキーボード(HID)
  • USBマウス

のように、USBに挿し込んだPi ZeroがPCからUSB機器に見える。

対応機種

pizero と raspberry pi 4 以降がOTG対応

raspi3 もバージョン次第で大応してた気がする。

USB ガジェットモードの主な使い方 / PC → Pi zero へアクセス

主な使い方は、Pi Zeroをセットアップするための使います。

USBシリアルデバイスやUSBネットワークデバイスとしてPi ZeroをPCへ接続し、PC側からSSHで、Pi Zeroにログインして使うと便利です。

またPi Zeroを「USBストレージ」にしてPC側からファイルを書き換えたり送り込んだりするのに便利です。

Pi zero → PC にアクセスで使う(逆)

ネットワークで認識させた場合

Pi Zero WH はWifiを使えます。ノートPC→ Pi zero へWifi経由でSSHで接続したうえで、Pi ZeroからPCへUSB経由で接続すると、PCをリモート管理ができるようになりますが、あまり使いどころは無いと思います。

キーボードとして認識させた場合

USBキーボードとして認識させたうえで、Pi ZeroへSSHしてPCにキーを送り込むことが可能になります。これは便利かもしれません。PCをリモートで管理するときにUSBキーボードとしてショートカットを送り込んでしまえば、ほとんどの機器で自動化のツールとして使えるようになります。

出番は少ない

インストールで使うためにありましたが、現在では出番は少ないかもしれませんが

Raspi Imagerみたいな初心者向けツールを使わずに、昔からのdd / ddrescue などでサクッとイメージをコピーしてたら、初期設定ではまだまだ使います。Windowsとは限らないです専用ソフトもいらないので重宝します。

OTG有効にする

これらのUSB機能を有効にするには、cmdline.txt に書き込みます。

OTG 設定

modules-load=dwc2,g_cdc

dwc2 がOTGの有効化で、g_cdc はシリアルコンソール+イーサネットの略称です。

cmdline.txt の例

console=tty1 root=PARTUUID=055f10f4-02 rootfstype=ext4 fsck.repair=yes rootwait modules-load=dwc2,g_cdc

シリアルコンソールで通信

OTG(dwc2,g_cdc) でシリアルコンソールを有効にした場合、シリアルポートが使えるが、一部不安定だった。g_cdc の代わりに g_serial を使ったほうが良さそう。

pi zero 側にシリアルコンソールデバイス ttyGS0が生成

raspberry pi zero 側に ttyGS0 が生成される。

ls /dev/ttyGS0

[PC側] PCはシリアルコンソール /dev/ttyACM0 が生成される

USB経由で接続されたPC側には、 /dev/ttyACM0 が生成される(Linux)の場合

ls /dev/ttyACM0

名前が似ているので注意する

OTG側(Raspi側)/dev/ttyAMA0
OTG差し込み(PC側) /dev/ttyACM0

シリアル通信のテスト

あとは、これを使って、gettyがリッスンすればいい。

PC 側にログインする場合。

PC側でgettyを起動

sudo systemctl status serial-getty@ttyACM0.service
sudo systemctl start serial-getty@ttyACM0.service

pi-zero 側で screen を使って接続

takuya@pi-otg $  sudo screen  /dev/ttyGS0

逆にやれば、Raspi側にログインできる。

OTGつないだときだけ起動するとか。systemdで制御すればいい。(後で考える。)

イーサネットで通信

USBイーサネットは、初期設定がDHCPになっているのでDHCPでIPを渡してあげればいいはず。

pi zero側のデバイス

Pi Zeroからは、usb0の名前で見える

ip link show  dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

PC側のデバイス

PC側からも usb0で見える(Linux)の場合。Windowの場合はイーサネットバイス

Raspberry Pi と PCがLANケーブル(クロス)でつながった状態になる。

pizero が usb0 経由して接続できるよう、PCのusb0 を 外部に接続してあげればいい

ネットワークの共有はOSや目的や手段によって異なる(Linuxの場合 btrctl など、詳細は割愛)

pi のOTG側から見たとき。

takuya@pizero-otg:~ $ ip link show dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 56:bd:66:c1:06:02 brd ff:ff:ff:ff:ff:ff
takuya@pizero-otg:~ $ ip addr show dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 56:bd:66:c1:06:02 brd ff:ff:ff:ff:ff:ff
    inet 169.254.39.187/16 brd 169.254.255.255 scope global noprefixroute usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::e05d:3a75:e46a:83e1/64 scope link
       valid_lft forever preferred_lft forever
takuya@pizero-otg:~ $

USBキーボード(HID)

USBキーボードとして動作させることができる。

差し込むだけで、あれこれ自動入力をしてくれる機械の完成です。やったね。

USBキーボードを差し込んでリモートからコマンドを流し込んでー。。。とか出来ますね。Raspiにはカメラが付いてるので、カメラで画面出力を監視しし画面を学習してしまえば。。。リモートから大体のデバイスは制御できますね。

他のWebサイトにはg_hidというモジュールを使ってUSB入力機器化する情報が掲載されている可能性がある。これは古いOSでしかできない方法のようで、実際にやろうとしてもg_hidが見当たらず読み込めないハズ。最近のOSの場合にはlibcompositeを使う必要があるようだ。

https://qiita.com/exthnet/items/98aa9b6d6a606f8f2cf8

キーボードとして認識された時点で満足したので詳細は割愛。

USBストレージ

USBストレージ機器として振る舞う事ができます。

USBマスストレージに対応した機器にRaspiをつないでしまえばいいのです。

USBメモリになる。USBメモリ領域はRaspi側からも見えるので、リモートから書き換えができるUSBメモリが完成する。

ネットワーク非対応のフォトパネルやTVなど、家電にUSBメモリを差し込んで設定を流し込んだりするとき、いちいち抜き差しなどせずに、USBメモリの中身を書き換えるので便利。うちの機器でためしたときは、既存ファイルの再読み込みがUSB抜き差しタイミングで発生知るので、Raspi側でUSBストレージのオンオフしなくちゃいけなかった。そもそUSBメモリが機器の預かり知らないタイミング書き換わるなど想定されるはずもない。なので、意外と使い途はないかもしれない。

https://qiita.com/haniokasai/items/427b7481881e065ae2f2

USB マウス

コロナ禍でマウスを少し動かすUSBがガジェットがバカ売れしましたが、RaspberryPiがあれば、その機能を作ることができる。僕は監視されてないので、ここまでする必要なかかったけど、ゲームのマクロなどをUSBマウスで実行するととても楽になるかもしれない。ようはプログラマブルなマウス、自動化・マウスしかもUSBの正しいデバイスとして作ることができる。最高じゃん?ラグナロク・オンラインやメイプルストーリーが流行ってた頃にほしかったよ。

動かし方は、次のサイトを参考に動かした。 https://toki-blog.com/pi4-gadget-mouse/

マウス1ピクセル動かして飽きたので、詳細は割愛。

USBドングル化

USB-OTGを使えるデバイスとして挿しっぱなしで使えるようにした。

これで、Raspi zero W をPCに差し込んでしまえば、USB機器に見えるが

Raspi自体はWifi ( AP or Client ) でネットワークに接続されるので、PCにいろいろインジェクションできる機械の出来上がりである。

このUSBドングル化キットは、https://wiki.52pi.com/index.php?title=EP-0097#How_to_use のURLで仕様と利用方法が公開されていて。

  1. Open up the "boot" partition and edit "config.txt", adding "dtoverlay=dwc2" to the bottom
  2. Open up "cmdline.txt" and add "modules-load=dwc2,g_ether" after "rootwait"
  3. Create a new file named "ssh" in the boot folder
  4. Insert this TF card to Raspberry Pi Zero/Zero W
  5. Pop your newly set up SD card into your Pi Zero
  6. plug it into a USB port and you should be able to SSH in to "raspberrypi.local",

とのことである。

パッケージの内容は次のとおりです。

  • 1 x USB dongle extension board
  • 4 x M2.5 Long Screws
  • 4 x M2.5 Nuts
  • 2 x Acrylic Sheild

動作時の注意(USBハブは使わない)

理由として、OTGの先にハブが接続されていた場合。 ここから想像するに、Zero にハブをいれたらOTGが無効になるのではないか

RaspberryにUSBハブを付けて、ドングルを挿し込む→PC側にUSBとして認識される。

dwc2 を指定したとき

RaspberryにUSBハブを付けて、ドングルを挿し込む→PC側にUSB機器が見えない。

takuya@pizero-otg:~ $ dmesg | grep -i otg
[    2.426245] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[    2.426696] dwc_otg: FIQ enabled
[    2.426719] dwc_otg: NAK holdoff enabled
[    2.426733] dwc_otg: FIQ split-transaction FSM enabled
[    4.037631] systemd[1]: Set hostname to <pizero-otg>.
[   19.194164] dwc2 20980000.usb: DWC OTG Controller
[   19.195087] usb usb1: Product: DWC OTG Controller
[   19.195110] usb usb1: Manufacturer: Linux 5.10.92+ dwc2_hsotg

https://raspberrypi.stackexchange.com/questions/271/can-i-use-raspberry-pi-as-a-usb-peripheral-device#:~:text=Yes%20you%20can%20if%20you,class%20you%20want%20to%20implement.

Raspi A/B は OTGが無効になってる。

理由として、OTGの先にハブが接続されていた場合。 ここから想像するに、Zero にハブをいれたらOTGが無効になるのではないか

rasberry PI A/A+/B/B+ models have OTG mode disabled by variety of reasons:

  • USB port occupied with USB hub (ethernet),
  • missing OTG 5th pin (grounded), or
  • data pins are not connected (power port). You’d need Raspberry PI Zero for OTG or so called Gadget Mode. Data USB port can be used for OTG and “power”. As of time of this writing Serial and Ethernet were tested, but others should work with proper amount of efforts (keyboard, disk, camera, etc.) Composite devices should work as well. See more info at

ドングル化しているばあい、USBハブを開いてるからと繋いだら面倒くさい。

今回使った商品

参考資料

スタートメニューから検索できなくったWindowsを治す

プログラムがみつからないです・・・

プログラムがみつからないです・・・

スタートメニューから、Win-S(Cortana/Win search)からアプリを探しても何もありません。こんな状況初めてです。

Google Chrome もみつからないです・・・

再起動したら治った。

なんでかわからないが、再起動したら治った。

service.mscwindows インデックスを再起動したけどだめだった。

Explorer再起動(デスクトップ再起動・再ログイン)で治った。

Windowsってほんとに不思議なOSですね。

コントロールパネルを「コマンドから開く」、ネットワーク詳細を「コマンドから開く」

コントロールパネルをサクッと開きたい。

コントロールパネルは、とても簡単に開けます。

Windows10からコントロールパネルの設定が遠くなったので手軽に開く方法として覚えておく。

Win-Rから "control"

control をコマンドとして入れれば、すぐに開く。しかも覚えやすい。

開いた

ネットワーク詳細(接続)を開くncpa.cpl

ネットワークの接続画面を開くとき、コマンドプロンプトから開きたい

ネットワークの接続詳細は、よく使う割に、設定から開くのがめんどくさい。

Win-R から ncpa.cpl

ncpa.cpl でサクッと開く。

開いた

アドレスバー

Win-Rで呼び出さなくても、アドレスバーから同じことができる。

mac os で npm i がgyp エラーになるときのサクッとした対応

npm i がエラーになる

npm は利用しているmac のバージョンを見ていて、npm は該当のpython を呼びに行く 私の場合、最新版のmacOSはなるべく使わないことにしているので、python2 がないと怒られた。

takuya@~$ npm i
npm ERR! code 1
npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb `which` failed Error: not found: python2
(snip)
npm ERR! gyp ERR! stack   File "<string>", line 1
npm ERR! gyp ERR! stack     import sys; print "%s.%s.%s" % sys.version_info[:3];
npm ERR! gyp ERR! stack                       ^
npm ERR! gyp ERR! stack SyntaxError: invalid syntax

mac brew 環境での npm i の gyp 環境のエラーは、殆どの場合python パスのエラー

対応

python のバージョンを変えてあげる

pyenv local system
npm i

または、python2 を作ってあげる

ln -sr /usr/bin/python2.7 /usr/local/bin/python2

npm をどうやって入れたかによる。

再度インストール

rm node_modules/ -rf
npm i

node_modules に中途半端なコンパイルが残るので一回消しておくほうが無難。

それでもだめな場合

node のバージョンと、npm のバージョン、そしてパッケージのバージョンを見直す

要は、package.json に記載されたバージョンが古いままで、いまのnodeだとコンパイルが通らないとかある。

たとえば、node-sassの4.0x は最新のnodeだとインストール時にエラーになる。

npm -i # エラー(package.json が4 を指してる)
npm -i node-sass@4  # エラー
npm -i node-sass@6  # インストールできる

またはその逆で、nodeを古い方にあわせる

brew install node@14
brew unlink node
brew link node@14 --force-overwite 
npm i 
brew unlink node@14
brew link node

ruby gems をユーザ空間にインストールする

ユーザ空間を使う

sudo とかつかってグローバルを汚したくないし、bundler でプロジェクト単位にインストールも不便ってとき。

自分のユーザ空間の環境があるって最高ですよね。

ユーザ空間にgem をインストール

gem install --user-install PKG_NAME 

たとえば、nokogiri の場合

gem install --user-install nokogiri

また、この設定は、rbenv などでも使われていて普段意識することはないと思います。

デフォルトインストール先

現在の gem 環境設定を調べればいい

$ gem environment

私の場合は次のとおりだった。rbenv とruby-buildがあるのでちょっと複雑。

takuya@Desktop$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 3.1.2
  - RUBY VERSION: 2.7.1 (2020-03-31 patchlevel 83) [x86_64-darwin18]
  - INSTALLATION DIRECTORY: /Users/takuya/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0
  - USER INSTALLATION DIRECTORY: /Users/takuya/.gem/ruby/2.7.0
  - RUBY EXECUTABLE: /Users/takuya/.rbenv/versions/2.7.1/bin/ruby
  - GIT EXECUTABLE: /usr/local/bin/git
  - EXECUTABLE DIRECTORY: /Users/takuya/.rbenv/versions/2.7.1/bin
  - SPEC CACHE DIRECTORY: /Users/takuya/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/takuya/.rbenv/versions/2.7.1/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-18
  - GEM PATHS:
     - /Users/takuya/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0
     - /Users/takuya/.gem/ruby/2.7.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - :sources => ["http://rubygems.org/"]
     - "benchmark" => false
     - "gem" => "--no-document"
     - "install" => "--no-ri --no-rdoc"
     - "update" => "--no-ri --no-rdoc"
  - REMOTE SOURCES:
     - http://rubygems.org/
  - SHELL PATH:
     - /Users/takuya/.rbenv/versions/2.7.1/bin
     - /usr/local/Cellar/rbenv/1.2.0/libexec
     - /Users/takuya/.rbenv/shims
     - /Library/Frameworks/Mono.framework/Versions/Current/Commands
     - /Users/takuya/.composer/vendor/bin
     - /Users/takuya/.lib/node/bin
     - /Users/takuya/.rbenv/shims
     - /Users/takuya/.pyenv/shims
     - /usr/local/share/dotnet
     - /Users/takuya/.go/bin
     - /Users/takuya/.bin
     - ~/.dotnet/tools
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/libexec
     - /opt/X11/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin

参考資料

phpstorm で scss-lintを行う

phpstorm でSCSSをチェックする

SCSSファイルを開くと、Lintの設定をレコメンドされる。配布元 →GitHub - idok/scss-lint-plugin: SCSS Lint plugin for intellij

ちなみにscss lint には npm もある。最近はnpmを使うことが多いハズ。そしてさらに最近はDartSassになってるはず。

ただし、このプラグインは設定が古いため、ruby 版を使うことになっている。

phpstorm のプラグインruby 版を想定してるので、想定通りに動かしてあげる。

私は更に想定して、古いバージョンのruby を使ってインストールしておいた。

scss-lintのインストール

gem install --user-install scss-lint

実行結果

Fetching scss-lint-0.38.0.gem
Fetching sass-3.4.25.gem
Fetching rainbow-2.2.2.gem
WARNING:  You don't have /Users/takuya/.gem/ruby/2.7.0/bin in your PATH,
      gem executables will not run.
Successfully installed sass-3.4.25
Building native extensions. This could take a while...
Successfully installed rainbow-2.2.2
WARNING: `scss-lint` has been renamed to `scss_lint` to follow proper RubyGems naming conventions. Update your Gemfile or relevant install scripts to install `scss_lint`.
Successfully installed scss-lint-0.38.0
3 gems installed

インストールされた場所

takuya@Desktop$ ls /Users/takuya/.gem/ruby/2.7.0/bin
sass  sass-convert  scss  scss-lint

設定

phpstorm などで、SCSSで設定を検索し、上記のパスを入れてあげる。

無事に動作した。

参考資料

pdoのprepareで名前に数字を入れると、bindValue出来ないエラー

php の pdo でエラーがでるので数日ずっと頭を抱えてた

出てくるエラー

: Invalid parameter number: number of bound variables does not match number of tokens

エラーは、php pdo の prepare statement で、execした時にエラーになる。

<?php
/// できる
$stmt->bindValue(":n1", $val );
$stmt->bindValue("n1", $val );
$stmt->bindValue("123n", $val );
///  出来ない
$sth->bindValue(':123', $val );
$sth->bindValue('123', $val );

エラーに気づかないわけ。

bindValue( $key, $value ) は $key が文字列だと、文字列インデックスでバインドし、ハッシュ :name から文字列キーを探す。

ところが、「数字に解釈できる文字列」だと、数字だと思って疑問符( = ? )に入れようと、該当の疑問符の数字インデックスを探す→見つからない→bindParamがありません。エラーとなる。

<?php
$sth->bindValue('123', $calories);   //
$sth->bindValue(':123', $calories);  // 123 番目を探しに行く

内部で$params[123] を探しに行く。そんなものあるわけがない。探してほしいのは $params[":123"] なんだよね 指定したけどintになる文字列だと、? を探しちゃってbindValue指定時のキーに入れられない。だからエラーになる。

しかもexecするまでわからない。(←ここが辛い)

コード作者はちゃんと値を入れてるから、値がないなんて考えないよね。でもbindValueエラーが出るんだよね。頭抱えるよね。

対策

文字列であることを明確にする

<?php
$key="123"
$sth->bindValue($key.'__', $v ); 

型変換怖い

原因がわかればなんてことないが、php7以降は「型」に強いと思ってると痛い目に遭う。

組み込み関数の型は相変わらず、自動変換される。phpは自動型推測で動いたのに、いまはソースコードに型を明示するようになったので、本当に気づかない。

とくに、SQLを自動生成してるとこのバグを踏みまくる。 随分前にこの仕様を踏んでめっちゃ頭を抱えた記憶があるのだが、7−8年越しにまた踏んで頭を抱えたので、メモ。

ここ数年はLaravelしか使わないし、PDOを素で使うことなんてないからこういうのすっかり忘れてハマりました。

systemdでネットワーク待ちを何とかする。Failed to start Wait for Network to be Configured.

ubuntu が起動時にエラーを吐いてネットワーク待ちで時間がかかる。

Failed to start Wait for Network to be Configured.

ネットワークを見てみる。

基本的に、networkdに管理させてないが、念のために確認する。

takuya@:~$ networkctl
IDX LINK            TYPE     OPERATIONAL SETUP
  1 lo              loopback carrier     unmanaged
  2 eth0            ether    carrier     unmanaged
  3 br0             bridge   routable    unmanaged
  4 lxcbr0          bridge   no-carrier  unmanaged
  5 docker0         bridge   no-carrier  unmanaged
 52 br-8938dceff93b bridge   routable    unmanaged
 54 veth61a80a4     ether    carrier     unmanaged

network-onlineを編集

systemd で上記のネットワークを無視してあげる

takuya@:~$ /lib/systemd/systemd-networkd-wait-online --help
systemd-networkd-wait-online [OPTIONS...]

Block until network is configured.

  -h --help                 Show this help
     --version              Print version string
  -q --quiet                Do not show status information
  -i --interface=INTERFACE[:MIN_OPERSTATE[:MAX_OPERSTATE]]
                            Block until at least these interfaces have appeared
     --ignore=INTERFACE     Don't take these interfaces into account
  -o --operational-state=MIN_OPERSTATE[:MAX_OPERSTATE]
                            Required operational state
     --any                  Wait until at least one of the interfaces is online
     --timeout=SECS         Maximum time to wait for network connectivity

See the systemd-networkd-wait-online.service(8) man page for details.
takuya@:~$

設定を編集

sudo systemctl edit systemd-networkd-wait-online

無視を追加

[Service]
ExecStart=/lib/systemd/systemd-networkd-wait-online \
  --ignore=docker0 \
  --ignore=lxcbr0 \
  --ignore=eth0 \
  --timeout=20

後は様子見。

参考資料

https://qiita.com/tsuru2_mitsuru/items/f3041cdb11dff18eb5c3

btrfs 内部にスワップ・ファイルを設置する

btrfs はカーネル5 からswap をサポートした

## 空のファイル
sudo truncate -s 0 /swap.img
## CoW / 圧縮を無効に
sudo chattr +C /swap.img
sudo btrfs property set /swap.img compression none
## chmod 
sudo chmod 600 /swap.img
## swap サイズため容量確保
sudo fallocate -l 1G /swap.img
### 容量確認
sudo ls -ald /swap.img
### SWAPを有効に
sudo mkswap   /swap.img
sudo swapon /swap.img
### swap を無効に
sudo swapoff /swap.img

状態確認

swapon
NAME      TYPE  SIZE USED PRIO
/swap.img file 1024M   0B   -2

一通りできたら、fstabへ

sudo vim /etc/fstab 

マウントを書く

/swap.img swap swap default 0 0

https://www.unixtutorial.org/create-swap-from-file-on-btrfs-filesystem/ https://wiki.archlinux.jp/index.php/Btrfs#.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB

パーティションをディスクに仕立てる(壊れたパーティションの先頭を作り直す)

達成したい目的。

LVM から ext4を取り出して、単独でブートするように作り直したい。

言い換えると

パーティションなんて、HDDの先頭にセクタ位置を書いてるだけだろ?とおもって調べたらやっぱりそうだった。

準備。

新規インストールで実験環境を整える。

サクッとインストールして、ext4 on LVM を用意する。 ext4 on LVM でインストールしたLinux仮想マシンで作成。

sudo virt-install \
  --connect=qemu:///system  \
  --name lc01   \
  --ram 8192   \
  --disk path=/var/lib/libvirt/images/lc01.qcow2,size=5  \
  --vcpus 8  \
  --virt-type kvm   \
  --os-variant debian10   \
  --graphics none   \
  --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/   \
  --extra-args="console=ttyS0" \
  --check all=off

ext4 を取り出す。

qcow2 から raw ファイルを取り出す。

sudo qemu-img convert -p -f qcow2 le01.qcow2 -O raw le01.img

ループバックにつなぐ

sudo losetup -P -f le01.img --show

LVMが接続されるのを確認する。

pvs
vgs
lvs 

接続されたLVMから ext4 を抜き出す。

sudo ddrescue /dev/mapper/le01--vg-root vgroot.img

後片付けする。

vgchange -an le01-vg
sudo losetup -d /dev/loopX

取り出したext4

取り出したファイルがEXT4なことを確認

$ file vgroot.img
vgroot.img: Linux rev 1.0 ext4 filesystem data, UUID=33cc43c6-b3f7-4001-9460-d6d28f11d91f (extents) (64bit) (large files) (huge files)

ext4 パーティションをディスクイメージに変換する。

取り出したパーティションをディスクイメージに変換する。

ext4 の先頭に1Mを追加する。

ext4のイメージファイルの先頭に1MBを足せばいいのですが。

ファイルの先頭に1Mを追加するという処理は面倒です。

そこで、1Mのファイルを作って末尾にExt4を追記するという逆のアプローチでやります。

パーティションヘッダを作る

dd または truncate で1MiB のファイルを作る。

dd if=/dev/zero of=new-hdd.img count=1 bs=1MiB

パーティションとは、ファイルシステムの先頭に、1MBがあるだけです。 bs=1MiB と書くのに注意。

先頭に16kがあり、どのセクタにファイルシステムがあるか書いてる。 GPTは16k-1M までの領域にEFIとかUUIDとか色々書いてるらしい。

1MB+ext4 => ディスクイメージ

pv とリダイレクトを用いて追記します。

pv vgroot.img  >> new-hdd.img

ディスクイメージをコピーすると時間がかかるのでcp よりもpv の方が扱いやすい。

これで、パーティションがぶっ壊れたHDDイメージの出来上がり。

パーティションを作り直す。

先頭が空っぽなので、パーティションとして認識されません。

パーティションが消えた状態になっています。

takuya@:images$ fdisk -l new-hdd.img
Disk new-hdd.img: 3.56 GiB, 3826253824 bytes, 7473152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

fdisk を使ってパーティションを作り直します。

takuya@:images$ sudo fdisk  new-hdd.img

Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xb2368926.

Command (m for help): p # ← print
Disk new-hdd.img: 3.56 GiB, 3826253824 bytes, 7473152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb2368926

Command (m for help): n # ← new
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p # ← primary
Partition number (1-4, default 1):
First sector (2048-7473151, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7473151, default 7473151):

Created a new partition 1 of type 'Linux' and of size 3.6 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: no # ←既存を使うのでno

The signature will be removed by a write command.

Command (m for help): p # ← print
Disk new-hdd.img: 3.56 GiB, 3826253824 bytes, 7473152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb2368926

Device       Boot Start     End Sectors  Size Id Type
new-hdd.img1       2048 7473151 7471104  3.6G 83 Linux

Filesystem/RAID signature on partition 1 will be wiped.

Command (m for help): a # ← Make MBR bootable flag on
Selected partition 1
The bootable flag on partition 1 is enabled now.

Command (m for help): w # ← Write and Quit
The partition table has been altered.
Syncing disks.

これでパーティションとして認識されるはずです。

takuya@:images$ fdisk -l new-hdd.img
Disk new-hdd.img: 3.56 GiB, 3826253824 bytes, 7473152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb2368926

Device       Boot Start     End Sectors  Size Id Type
new-hdd.img1 *     2048 7473151 7471104  3.6G 83 Linux

ファイルを確認

ext4 が壊れてないか確認しておきます。

イメージファイルををループバックで接続してみます。

losetup -P -f new-hdd.img --show

接続できたのでパーティションが認識されるはずです。確認しておきます。

takuya@:images$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop11            7:11   0   3.6G  0 loop
└─loop11p1      259:4    0   3.6G  0 part

マウントしてみます。あらら失敗です

sudo mount /dev/loop11p1 test
mount: /var/lib/libvirt/images/test: wrong fs type, bad option, bad superblock on /dev/loop11p1, missing codepage or helper program, or other error.

dmesg を確認してみます。どこか失敗した模様(ddのbsミス でした)

$ sudo dmesg
[694912.138454] EXT4-fs (loop11p1): bad geometry: block count 933888 exceeds size of device (933883 blocks)
[694917.971654] EXT4-fs (loop11p1): bad geometry: block count 933888 exceeds size of device (933883 blocks)
[695308.681524] EXT4-fs (loop11p1): bad geometry: block count 933888 exceeds size of device (933883 blocks)
[695314.313132] EXT4-fs (loop11p1): bad geometry: block count 933888 exceeds size of device (933883 blocks)
[695351.389589] EXT4-fs (loop11p1): mounted filesystem with ordered data mode. Opts: (null)
[695371.450113] EXT4-fs (loop11p1): mounted filesystem with ordered data mode. Opts: (null)

やり直しました。問題なさそうです。

$ sudo fsck /dev/loop11p1
fsck from util-linux 2.36.1
e2fsck 1.46.2 (28-Feb-2021)
/dev/loop11p1: clean, 28743/233856 files, 286271/933888 blocks
$ sudo e2fsck -f /dev/loop11p1
e2fsck 1.46.2 (28-Feb-2021)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop11p1: 28743/233856 files (0.2% non-contiguous), 286271/933888 blocks
$ sudo resize2fs /dev/loop11p1
resize2fs 1.46.2 (28-Feb-2021)
The filesystem is already 933888 (4k) blocks long.  Nothing to do!

GPTに変更する

今どきのディスクはGPTなのでGPTでもできるが、、EFIパーティションとか、MBRハイブリッドとか考えることが多いので今回はパス。

ブートの修正

ブート修正は取り出したイメージをマウントして修正します。

マウント

losetup -f -P --show new.img
mount /dev/loop11p1 /mnt

chrootする

cd /mnt
sudo mount -t proc proc proc/
sudo mount -t sysfs sys sys/
sudo mount -o bind /dev dev/
#
sudo chroot . /bin/bash

ブート修正。

grub-install /dev/loop11
## 作業PCの boot を拾ってマルチブートになるのを避ける
chmod a-x /etc/grub.d/30_os-prober 
update-grub
update-initramfs -u

作業が終わったら後片付けする

sudo umount -lf ./sys
sudo umount -lf ./proc
sudo umount -lf ./dev
cd 
umount /mnt
losetup -d /dev/loopX

update-grub は次が出れば成功

Found linux image: /boot/vmlinuz-xxxx-generic
Found initrd image: /boot/initrd.img-xxx-generic

出てこない場合は、 /boot にファイルがないはずなので、/bootが別パーティションにありddできてない可能性がある。/bootを取り損ねていないか確認。見つけ次第コピー

LVMを停止関連

LVM を停止してデータを取り出したので、以前のLVM関連の設定が残らないようにする。

lvm バックアップを削除

rm /etc/lvm/backup/le01-vg

スワップファイル

LVM のスワップがあるときは、スワップファイルを作り直してlvmスワップを除去

sudo vim  /etc/initramfs-tools/conf.d/resume 

スワップファイル再生成

sudo dd if=/dev/zero of=/swap.img bs=1M count=1000
sudo chmod 600 /swap.img 
mkswap /swap.img 

fstab のスワップ設定を変える

sudo vim /etc/fstab

LVM除去が終わったら

update-grub
update-initramfs -u

その他の問題 btrfs

btrfs の場合 update-initramfs -uが次のエラーになるので。

/sbin/fsck.btrfs doesn't exist, can't install to initramfs

ダミーで対応する。

sudo  cp /bin/true /sbin/fsck.btrfs

その他の問題 GRUB /boot

/boot の中身をコピーし忘れたときは、単純に grub だけが起動する。

grub で、not found になるときはコピーし忘れ

grub > ls 
grub > set root=(hd0,1)
grub > ls /vmlinuz
file not found 

その他の問題 GRUB lvm 除去漏れ

lvm → ext4 に変えたとき、update-initramfs をせずに起動すると、LVMを探しに行ってgrub 付近でエラーになることが有る。

そのときは、手作業で起動してみる

ディスクの確認

grub > ls 

root の設定

grub > set root=(hd0,1)

uuidを確認

grub > ls (hd0,1)
        Partition hd1,3: Filesystem type ext4- Last modification time...
2022-05-23 07:49:05 Sunday, UUID FFEXXX-5X23456

カーネルを起動する

grub > linux /vmlinuz quiet s root=UUID-FFEXXX-5X23456
grub > initrd /boot/initrd.img
grub > boot
grub メモ

MBRパーティションは次のように表示される。dosが入ってるわけでなくDOS/V用のMBRパーティションの意味である。

(hd0,msdos1)

これは、msdosを省略でアクセスできる

set root=(hd0,1)
set root=(hd0,msdos1) # 同じ

gpt ( (hd0,gpt1) ) についても同じだと思う。

まとめ

ディスク内のパーティションの管理は、先頭1MiBで行っている。

単純なext4 イメージに先頭1MiBをつければディスクイメージに変えられるとわかった。

lvm の内部にあるパーティションも強引に取り出して先頭をつければ、単純なディスクイメージに変更できるとわかった。

先頭1MiB について

先頭の1MiBが使われているのは fdisk で確認できます。

sudo sgdisk -p /dev/nvme0n1
Sector size (logical/physical): 512/512 bytes


Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   EF00
   3         3147776      4000794623   1.9 TiB     8300

ssd/HDDの中身は、2048 セクタから書きます。

1セクタは、512 バイトです。

パーティション1は2048セクタから開始してます。先頭-2047にはext4 は存在しません

先頭-2047セクタ分、つまり2048セクタが管理用に予約され使われているわけです。

この2048セクタのバイトサイズを計算すると・・・1セクタ=512バイトだから

2048 セクタ
⇔ 512バイトx 2048 
⇔ 512 x 2x 1024 バイト 
⇔  1024x 1024 バイト
⇔ 1048576 バイト
⇔ 1MiB

だから先頭に1MiBをつけておけば、ext4のシンプルボリュームをディスクイメージとして使えるってことなんだろうな。

大昔のFDDの頃は容量節約のために1セクタ=128/256/512バイトなど、サイズは自分で決められたらしい。むかし先輩にちらっと聞いたけど、当時はよくわからんけどなんか便利な単位なんですねって聞き流してた。が、まさか今更役に立つなんて。

参考資料

btrfs resize で進捗を見たい

btrfs filesystem resize をしてると、ちゃんと動いてるのか不安になる。

大きいデータファイルだと余計に不安になる。

dmesg を見ればいいらしい

dmesg  | grep BTRFS | tail

watch とかやっておけばいい

実際にやってみた例

Every 2.0s: dmesg  | grep BTRFS | tail                                                                                                                                                                                     host: Sat May 21 18:28:18 2022

[575124.384097] BTRFS info (device dm-2): relocating block group 761060179968 flags data
[575224.816851] BTRFS info (device dm-2): found 549 extents
[575226.307604] BTRFS info (device dm-2): found 549 extents
[575227.461641] BTRFS info (device dm-2): relocating block group 759986438144 flags data
[575334.728443] BTRFS info (device dm-2): found 1375 extents
[575336.185406] BTRFS info (device dm-2): found 1375 extents
[575337.135120] BTRFS info (device dm-2): relocating block group 758912696320 flags data
[575438.211646] BTRFS info (device dm-2): found 48 extents
[575439.111490] BTRFS info (device dm-2): found 48 extents
[575439.794408] BTRFS info (device dm-2): relocating block group 757838954496 flags data

終了したら

[575641.955655] BTRFS info (device dm-2): new size for /dev/mapper/vgubuntu-root is 214748364800

などと出てくくる。

まぁ終了したらコマンド見たらわかるんだけど。

参考資料

https://unix.stackexchange.com/questions/398115/btrfs-filesystem-resize-doesnt-do-anything