hack のためのネタ帳, etc,,,

Desktop 版の LiveCD を text mode で使う。

Desktop 版は GUI が立ち上がってしまう。
Console から CUI による操作を行いたい場合、GUI が起動後に Shift+Ctrl+1 等を叩いても良いが、面倒なら、
起動画面で「F6 その他のオプション」を選択して表示された boot パラメータに「text」を追加して起動すると良い。

日本語キーボードの設定

UEFI boot だと「日本語」で「Try Ubuntu」しても keymap が US 配列になっているため、JP 配列で使うには gnome-control-center region で Input Sources を設定する必要があるようだ。
これは手間なので、以下のコマンドで Input Sources を「Japanese (OADG 109A)」と「日本語 (Mozc)」に変更すると良い。
Input Sources の切り替えは SUPER + SPACE ([⊞ (Windows Logo Key)] + [SPACE])
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'jp+OADG109A'), ('ibus', 'mozc-jp')]"
関連;

su

以下の作業は
sudo -i
して root login した状態で行う。

PROXY の設定

PROXY が必要な場合とりあえず以下のようにしておく
export PROXY=http://proxy.example.com:8080/
export {ftp,http}{,s}_proxy=$PROXY

apt.conf.d に設定する場合は以下のように
for i in {ftp,http}{,s}; do printf "%-21s \"%s\";\n" "Acquire::$i::proxy" "$PROXY"; done >/etc/apt/apt.conf.d/80proxy
以下に帯域付きの mirror list があるので太い回線にぶら下がってるのを選ぶと良い。
/etc/apt/sources.txt に mirror: method で mirrors.txt 指定しておくと、列挙されているミラーからランダムにミラーが選択されるので、以下のようにしておいても良いだろう。
ただし、上記、ミラー一覧の distro mirror status の列を見ると、割と update のタイミングがばらついているので、複数のミラーを混ぜると何らかの不具合が生じる可能性はあるかもしれない。
DIST=focal
UPDATES=( "" security updates proposed backports )
cp -av /etc/apt/sources.list{,.$(date -r /etc/apt/sources.list +%Y%m%d_%H%M%S)}
for update in "${UPDATES[@]}"; do
  printf "deb mirror://mirrors.ubuntu.com/mirrors.txt %s%-10s main restricted universe multiverse\n" "${DIST}" "${update:+-}${update}"
done >/etc/apt/sources.list

http://mirrors.ubuntu.com/ には http://mirrors.ubuntu.com/JP.txt をはじめとして、各地域用のミラーリストがそろっている。
少なくとも自分の環境では JP.txt と mirror.txt は同一の内容になっているが、http://mirrors.ubuntu.com/ で index されるファイルサイズは JP.txt が 324 B、mirrors.txt が 34 B になってて wget で response header 見てもリダイレクトされて形跡もない。IP 見てサーバー側で自動選択してくれてるんだと思うが、仕組みが良く分からない。

JP.txt の中には遅いサーバーも混じっているので、
以下のようにして、実測値で上位 N 個の高速なミラーを得た上で、これを参照させると良いだろう。
DIST=focal
UPDATES=( "" security updates proposed backports )
N=3

wget http://mirrors.ubuntu.com/mirrors.txt -qO- \
| while read i; do
  { echo $i; time wget "$i"ls-lR.gz -qO /dev/null; } \
  |& awk 'NR==1{url=$0}/^real/&&match($0,/[0-9]+m/){print (substr($0,RSTART,RLENGTH-1)*60+substr($0,RSTART+RLENGTH))"\t"url;}'
done \
| sort -n >/etc/apt/mirrors_response.txt
head -n $N /etc/apt/mirrors_response.txt | awk '$0=$2' >/etc/apt/mirrors.txt

cp -av /etc/apt/sources.list{,.$(date -r /etc/apt/sources.list +%Y%m%d_%H%M%S)}
for update in "${UPDATES[@]}"; do
  printf "deb mirror+file:///etc/apt/mirrors.txt %s%-10s main restricted universe multiverse\n" "${DIST}" "${update:+-}${update}"
done >/etc/apt/sources.list

以前、
2014-11-03 時点の 14.04.1(trusty) だと apt-file コマンド等が mirror: method に未対応だったので問題があったが、
2021-01-04 現在の 20.04.1 LTS(focal) だと、少なくとも apt, apt-get, apt-file については問題なさそうだった。

JP.txt に載ってない、野良ミラーの http://ftp.iij.ad.jp/pub/linux/ubuntu/archive は速度的には地味に優秀なんだけど update の遅延が大きいようだ。

apt line をコマンドラインから設定

universe, multiverse を追加して cdrom を落とす場合以下のようにすれば良い。
add-apt-repository universe
add-apt-repository multiverse
sed -ie 's/^\(deb cdrom:\)/# \1/' /etc/apt/sources.list
install cd の apt source を www.ftp.ne.jp に変更するなら以下のようにすれば良さそう。
sed -ri 's:[a-z.]+.ubuntu.com/ubuntu:www.ftp.ne.jp/Linux/packages/ubuntu/archive:'g /etc/apt/sources.list
野良(?)ミラーかもしれないけどうちの環境だと IIJ が優秀だったので、その場合は以下のようにする。
sed -ri 's:[a-z.]+.ubuntu.com/ubuntu:ftp.iij.ad.jp/pub/linux/ubuntu/archive:'g /etc/apt/sources.list
proxy
_() { local i; for i in "Acquire::"{ftp,http,https}"::proxy \"$1\";\n"; do echo -ne "$i"; done; > /etc/apt/apt.conf.d/80proxy; }; _ http://proxy.example.com:8080/

参考:

debootstrap の準備

apt update
apt install debootstrap
20 GiB (= 41,943,040 s = 21,474,836,480 B = 2^32*5 B) の場合
#export NIC=eth0
export NIC=enp0s3 # for VirtualBox
export DEV=/dev/sda
export DEVSEP=
#export DEVSEP=p # for loop device
export TIMEZONE=Asia/Tokyo
パーティショニング
# parted ${DEV}
mklabel gpt
u s
mkpart "BIOS boot partition" 40s 2047s
set 1 bios_grub on
mkpart esp fat32 2048s 1050623s
set 2 esp on
mkpart "Linux filesystem" btrfs 1050624s 41940991s
quit
結果の確認
# parted ${DEV} u s p free
Model: VBOX HARDDISK (scsi)
Disk /dev/sda: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start      End        Size       File system  Name                 Flags
 1      34s        2047s      2014s                   BIOS boot partition  bios_grub
 2      2048s      1050623s   1048576s                esp                  boot, esp
 3      1050624s   41940991s  40890368s               Linux filesystem
        41940992s  41943006s  2015s      Free Space
script の準備
cat >/tmp/ezchroot.sh <<'EOD2'
#!/usr/bin/env bash

BINDS="dev proc run sys tmp"
for i in $BINDS; do
  mount --bind /$i $1/$i
done

chroot $1 /bin/bash --login

for i in $BINDS; do
  umount $1/$i
done
EOD2
chmod +x /tmp/ezchroot.sh

cat >/tmp/mkfstab.sh <<'EOD2'
#!/usr/bin/env bash

function uuid () # <dev>
{
  printf "UUID=%-36s" "$(lsblk -no uuid "$1")"
}

cat <<EOD
# <file system> <mount point> <type> <options> <dump> <pass>
$(uuid ${1}3) /         btrfs defaults,discard,ssd,subvol=@     0 1
$(uuid ${1}3) /home     btrfs defaults,discard,ssd,subvol=@home 0 2
$(uuid ${1}2) /boot/esp vfat  defaults                          0 3
EOD
EOD2
chmod +x /tmp/mkfstab.sh

cat >/tmp/mknetplan.sh <<'EOD2'
#!/usr/bin/env bash

cat <<EOD
network:
  version: 2
  renderer: networkd
  ethernets:
    $1:
      dhcp4: true
      dhcp6: true
EOD
EOD2
chmod +x /tmp/mknetplan.sh

mkfs して debootstrap と kernel install
mkfs -t vfat -F 32 -n esp ${DEV}${DEVSEP}2
mkfs -t btrfs ${DEV}${DEVSEP}3
mount ${DEV}${DEVSEP}3 /mnt -odiscard
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
mkdir -p /mnt/@/boot/esp
umount /mnt
mount ${DEV}${DEVSEP}3 /mnt      -odiscard,subvol=@
mount ${DEV}${DEVSEP}3 /mnt/home -odiscard,subvol=@home
mount ${DEV}${DEVSEP}2 /mnt/boot/esp
debootstrap $DIST /mnt $(head -n1 /etc/apt/mirrors.txt)

for i in /etc/apt/{sources.list,mirrors*.txt} /etc/apt/apt.conf.d/80proxy; do cp -av {,/mnt}"$i"; done

/tmp/ezchroot.sh /mnt
##########################
# start chroot
export DEBIAN_FRONTEND=noninteractive
apt update
apt install -y linux-image-generic

# for BIOS
apt install -y grub-pc
grub-install --target=i386-pc    ${DEV}                    # --boot-directory=/boot 

# for UEFI
apt install -y grub-efi
grub-install --target=x86_64-efi --efi-directory=/boot/esp # --boot-directory=/boot 

update-grub

echo $TIMEZONE >/etc/timezone
ln -svf /usr/share/zoneinfo/$(</etc/timezone) /etc/localtime

/tmp/mknetplan.sh $NIC >/etc/netplan/config.yaml
/tmp/mkfstab.sh $DEV >/etc/fstab

exit
# end chroot
##########################

umount /mnt/boot/esp /mnt/home /mnt

ezchroot.sh は以下

ユーザーの追加

useradd と adduser があるけど、useradd のが簡易かな?
adduser だと full name とかいろいろ聞いてくるけど useradd だとそれがない
adduser ユーザー名
で group や home directory が自動的に設定され、パスワードやフルネーム等は対話的に設定される

追加したユーザーは vigr して sudo グループに追加しておく
複数名の場合はコンマで並べる
sudo:x:27:[ユーザー名[,...]]
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます