1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux From Scratch

Last updated at Posted at 2024-03-21

Linux From Scratch

Linux From Scratch をやってみる

参考

必要なもの

  • 作成する Linux とは別の開発環境用の Linux。「ホスト」と呼ばれる。

    • CPU 4コア、メモリ 8GB程度。

    • インストール時に「開発(development)」オプションを選択し、開発ツールをインストールしておく。

      • Bash
      • Binutils
      • Bison
      • Coreutils
      • Diffutils
      • Findutils
      • Gawk
      • GCC
      • Grep
      • Gzip
      • Linux Kernel
      • M4
      • Make
      • Patch
      • Perl
      • Python
      • Sed
      • Tar
      • Texinfo
      • Xz
    • バージョンチェック

      cat > version-check.sh << "EOF"
      #!/bin/bash
      # Simple script to list version numbers of critical development tools
      export LC_ALL=C
      bash --version | head -n1 | cut -d" " -f2-4
      MYSH=$(readlink -f /bin/sh)
      echo "/bin/sh -> $MYSH"
      echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
      unset MYSH
      
      echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
      bison --version | head -n1
      
      if [ -h /usr/bin/yacc ]; then
        echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
      elif [ -x /usr/bin/yacc ]; then
        echo yacc is `/usr/bin/yacc --version | head -n1`
      else
        echo "yacc not found"
      fi
      
      echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
      diff --version | head -n1
      find --version | head -n1
      gawk --version | head -n1
      
      if [ -h /usr/bin/awk ]; then
        echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
      elif [ -x /usr/bin/awk ]; then
        echo awk is `/usr/bin/awk --version | head -n1`
      else
        echo "awk not found"
      fi
      
      gcc --version | head -n1
      g++ --version | head -n1
      grep --version | head -n1
      gzip --version | head -n1
      cat /proc/version
      m4 --version | head -n1
      make --version | head -n1
      patch --version | head -n1
      echo Perl `perl -V:version`
      python3 --version
      sed --version | head -n1
      tar --version | head -n1
      makeinfo --version | head -n1  # texinfo version
      xz --version | head -n1
      
      echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
      if [ -x dummy ]
        then echo "g++ compilation OK";
        else echo "g++ compilation failed"; fi
      rm -f dummy.c dummy
      EOF
      
  • 構築するLinux用のディスク:30GB 程度

    • / : 20GB
    • /boot: 200MB
    • /swap: 2GB

環境

  • VirtualBox(Windows)

    • [一般] > [高度]
      • クリップボードの共有: 双方向
      • ドラッグ&ドロップ: 双方向
    • [システム]
      • [マザーボード]
        • メインメモリ: 8GB
        • 起動順序: フロッピーのチェック外す
        • チップセット: ICH9
      • [プロセッサー]
        • プロセッサ: 4
    • [ディスプレイ]
      • [スクリーン]
        • ビデオメモリ: 128M
        • ディスプレイ数: 1
        • 3Dアクセラレーション有効化: チェック
    • [ストレージ]
      • コントローラSATA
        • SATA0: 50GB(ホストOS用)
        • SATA1: 30G(開発用)
  • Parallels(mac)

  • Ubuntu 22.04

Tips

# ディスク確認(開発用の追加ディスクの確認)
lsblk

# パーティション作成の自動化
sudo umount -l /deb/sdb1
sudo swapoff /dev/sdb2

sudo parted -a opt /dev/sdb -s mklabel gpt \
  -s mkpart primary ext4 0% 28G \
  -s mkpart primary linux-swap 28G 100%

mkswap /dev/sdb2
swapon /dev/sdb2

# 解凍
tar xvf xxx.tar.xz # .tar.xz
tar xvfz xxx.tar.gz # .tar.gz | .tgz
tar xvfy xxx.tar.bz2 # .bz2 

構築

ubuntu インストール

# 最新に更新
sudo apt update
sudo apt upgrade

# 必要なものインストール
sudo apt install gcc make vim git apt-file

# ubuntu softwareから
code

# ファイルからパッケージを探す
sudo apt-file update
sudo apt-file search texinfo

# シェルを変更(dash => bash)
sudo dpkg-reconfigure dash

# 開発に対して足りないもの
sudo apt install bison yacc gawk g++ m4 texinfo
  • 自動ログイン
    • [設定] - [ユーザー] で設定できる

ホストでの準備

  • パーティション
    • sda: ホスト(ubuntu)
    • sdb: 開発領域(30GB)
      • sdb1: 28G(/)
      • sdb2: 2G(swap)
# パーティション作成とファイルシステム作成
sudo parted -a opt /dev/sdb -s mklabel gpt \
  -s mkpart primary ext4 0% 28G \
  -s mkpart primary linux-swap 28G 100%

mkswap /dev/sdb2

# ファイルシステム作成(partedで一気にやるので不要?)
# mkfs -v -t ext4 /dev/sdb1
# mkswap /dev/sdb2

# 環境変数の設定
export LFS=/mnt/lfs

# 毎回実行するのは面倒なので、起動時に設定する。
if [ -z $LFS ]; then
    echo "export LFS=/mnt/lfs" >> ~/.bash_profile
    sudo echo "export LFS=/mnt/lfs" >> /root/.bash_profile
fi

# パーティションのマウント
sudo mkdir -pv $LFS
sudo mount -v -t ext4 /dev/sdb1 $LFS
sudo swapon /dev/sdb2
# 毎回実行するのは面倒なので、起動時にマウントするには "/etc/fstab" に以下を追記
# /dev/sdb1    /mnt/lfs    ext4    defaults    1    1

# パッケージのダウンロード
sudo mkdir -v $LFS/sources
sudo chmod -v a+wt $LFS/sources

## ダウンロードリスト作成
wget https://lfsbookja.osdn.jp/11.3-sysdja/wget-list-systemd
cat > wl.sed << "EOF"
s|ftp\.gnu\.org/gnu/|ftp.riken.jp/GNU/|g
s|www\.kernel\.org/pub/linux/|ftp.riken.jp/Linux/kernel.org/linux/|g
s|www\.cpan\.org|ftp.riken.jp/lang/CPAN|g
s|ftp\.vim\.org|ftp.jp.vim.org|g
EOF
sed -f wl.sed -i.orig wget-list-systemd
rm wl.sed

wget --input-file=wget-list-systemd --continue --directory-prefix=$LFS/sources
pushd $LFS/sources
  sudo wget https://lfsbookja.osdn.jp/11.3-sysdja/md5sums
  sudo md5sum -c md5sums
popd
# 所有者をrootに統一しておく。ホスト上のユーザは開発環境には存在しないため。
chown root:root $LFS/sources/*
  • 残作業
# 限定的なディレクトリレイアウトの作成
sudo mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}

for i in bin lib sbin; do
  sudo ln -sv usr/$i $LFS/$i
done

case $(uname -m) in
  x86_64) sudo mkdir -pv $LFS/lib64 ;;
esac

sudo mkdir -pv $LFS/tools

# 開発ユーザの作成
sudo groupadd lfs
sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs
sudo passwd lfs

sudo chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
  x86_64) sudo chown -v lfs $LFS/lib64 ;;
esac
  • lfsユーザの設定
# lfs ユーザにスイッチ
su - lfs

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF

一時的なツールの構築

クロスコンパイラと関連ライブラリのビルド

  • "開発するOS上で動作するプログラム" をホスト上でコンパイルするためのツールをビルド
  • $LFS/tools ディレクトリにインストールされる
  • ライブラリについては、実際使用する場所にインストールされる
  • "lfs" ユーザで実行する

クロスコンパイルによる一時的ツールのビルド

  • 上記でビルドしたツールを使って、"開発するOS上で動作するプログラム" をクロスコンパイルする
  • "lfs" ユーザで実行する

chroot への移行と一時的ツールの追加ビルド

  • rootユーザで実行する
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?