Linux

Arch Linuxでext4のrootfsをLUKSで暗号化する

既存のファイルシステムを暗号化もできるらしい。 とりあえず使い捨ての環境でやってみたのでメモしておく。使ってる環境でやるならバックアップ取ってからやった方がいいと思う。 まず、Arch のインストールメディアで起動する。 ここでは /dev/nvme0n1p2 に rootfs があって、それ以上は分割されていないものとする。 複数のパーティションを 1 つの暗号化パーティションに入れることができるかは分からない。 LUKS のヘッダ分のスペースを空けないといけないので、まず ext4 のファイルシステムを縮小する。 僕はデータが入り切る最小サイズまで縮小した。計算が得意な人はギリギリのサイズに縮小してもいいと思うけど、 ext4 だとデータはあんまりバラけてないはず(多分)なので

Arch Linuxを暗号化したディスクにインストールする

Arch Linux を LVM on LUKS の root filesystem にインストールしたのでメモ。 LVM を使うこと自体は完全にオプションで、LUKS の上に ext4 のファイルシステムを作っても別に良い(はず)。 これがどういう構成かというと、物理パーティションの上に LUKS で暗号化したパーティションを作り、 その上の LVM2 の LV の上の ext4 のパーティションに rootfs を作るというもの(オフチョベットしたテフをマブガッドしてリットにしてそうな説明)。 (意外にもとハマらずにできたので情報としての価値は低めです。) インストールガイド に従ってパーティションを切るところまでやる。 パーティションはこんな感じで切った。 ディレクトリ 範囲 説明 /boot 1 MiB–1 GiB ブートローダとか諸々用 / 残り全部 残りのディレクトリ用

LinuxのLVMに入門したのでいろいろメモ

LVMというのは抽象化したレイヤーを通して物理的なストレージにアクセスするというやつ(適当)。 物理的なストレージを直接使うよりもいろいろ変なことができるので嬉しいらしい。 雑に概念を説明 LVM には PV(Physical Volume)、VG(Volume Group)、LV(Logical Volume) という概念がある。 まず、PV というのは物理的なストレージに一対一で対応する概念で、SATA 接続のストレージだと /dev/sda1 で一個、 /dev/sda2 で一個みたいになる。 SSD をパーティションで区切っていない場合は /dev/sda で一個の PV とか。 次に、VG というのは、普通にストレージを使っているときは 1 個のストレージデバイスに対応する概念(のような気

Linuxのreadとrecvは何が違うのか

man 2 recv [Enter]ターン The only difference between recv() and read(2) is the presence of flags. With a zero flags argument, recv() is generally equivalent to read(2) (but see NOTES). (適当な訳) recv() と read(2) の違いは flags の有無のみです。flags が 0 のとき、recv() はほとんどの場合 read(2) と等価になります。 おわり というのもアレなので Linux kernel のソースを読んでどうなっているのか見てみることにしました。 僕は Linux ニワカなので見当違いなことを言っている可能性もあるのでまあそういうつもりで読んでいただけると……。 Linux のソースコードはたまたま手元にあったやつなので超適当ですが、よく見たら 2020 年のやつでした(思ったより古かった) Linux のシステムコールは SYSCALL_DEFINEn みたいなマクロで定義するので、適当に grep します。 すると read は fs/read_write.c recv は net/compat.c にあることが分かりま

Linux on ThinkPadのバッテリー設定をいい感じにする

僕は ThinkPad X1 Carbon の 2019 年モデルを使っていて,少なくとも僕が学生の間は買い換えないつもりでいる。 そこでちょっと気になるのがバッテリーの劣化という面。ThinkPad はバッテリーが取り出せないので 工夫して使わないとバッテリーをいじめる結果になってしまいそうだと思う。 で,ACアダプタにつないだときにバッテリーに充電する閾値を設定する方法。 入れる。 $ sudo pacman -S tlp acpi-call を入れることを薦められたりするが,これはバッテリーの内部ゲージのリセットとかをしようと しない限り必要ないようだ。 tlp-stat というユーティリティも同時にインストールされるので次のような感じで現在の設定値を確認できる。 $ sudo tlp-stat -b まあ確認するだけなら適当なファイル(/s

KASLRを無効化する

Linux カーネルには Kernel address space layout randomization という仕組みがある(別に Linux カーネルじゃなくてもあると思うが)。 これはカーネルのコードが置かれる仮想アドレスを起動するたびにランダムにするというもので, 悪意のあるソフトウェアのカーネルへの攻撃を難しくしている。ってのはまあどうでもいい話。 で,これ,セキュアになるのはいいんだけどあんなことやこんなことをする時(つまり自分が悪意のある側, とまではいかないが何かの手段としてそれに近いことをしようとした場合)に 面倒臭いことがあって,かといって自分で無効化してコンパイルし直すのもなということでメモ。 nokaslr をカーネルパラメータに追加する1だけ。終了。 一応これをデフォルトにするのは良くない

Linuxの一般ユーザではどうしようもない失敗に対処する

面倒臭い失敗をしてしまった(戻せるのでセーフ) pic.twitter.com/GSo48SZ9Vw — kofuk (@man_2_fork) August 17, 2020 覚えていたのでパッと対処できたけど忘れないとも限らないのでメモ。grub じゃない環境での方法は分からない。 再起動する。 GRUB のメニューが表示されたら eを押すと起動のコマンドを編集できる。 linux から始まる行での後ろに init=/bin/bash と書き加える。 Ctrl-x で起動する。 Bash が起動しているので何でもアリの無法地帯。 終わったら exec /sbin/init して起動する。 init を起動せずに Bash から exit すると kernel panic するので注意。

LinuxではメモリはCOWになっている(今更)

んだなぁ,と試してて思った。 以下のようなプログラムだとすぐメモリがあふれて死にそう(というか OOM Killer にやられる) な気がするけど実際そうならない。 #include <stdlib.h> #include <stdio.h> #include <unistd.h> int main(void) { size_t alloc = 0; for (;;) { char *mem = malloc(1024 * 1024 * 1024); ++alloc; printf("%zd GiB allocated\n", alloc); sleep(1); } } で,実行して top で見てみてもメモリ使用量はいっこうに増えない。 これを下のように編集すると状況が変わって,リアルにメモリを食い始める。 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(void) { size_t alloc = 0; for (;;) { char *mem = malloc(1024 * 1024 * 1024); memset(mem, 0, 1024 * 1024 * 1024); ++alloc; printf("%zd GiB allocated\n", alloc); sleep(1); } }