문서의 이전 판입니다!
Host에서 LFS 디렉토리로 chroot
6장 완료후 책의 끝까지 유용하게 사용하는 스크립트
사용법:
auto-lfs s : chroot 실행, 필요한 시스템 디렉토리 마운트
auto-lfs c : chroot 종료후 불필요한 시스템 디렉토리 마운트 해제
LFS, LFS_PART와 /boot, /boot/efi, /home, /sources 등은 상황에 맞게 조정이 필요합니다.
#!/bin/bash
# LFS 12.1-systemd에 맞춤
# <7.2 소유자 변경> 이후에 사용
# 커널 가상 파일 마운트/언마운트 지원용 스크립트
# Begin ~/bin/lfs-env-config
VERSION=0.1.7
LFS=/mnt/lfs
LFS_PART=/dev/nvme0n1p8
LFS_BOOT=/dev/nvme0n1p6
LFS_EFI=/dev/nvme0n1p2
LFS_HOME=/dev/nvme0n1p7
# 필요한 별도의 파티션 마운트
if ! mountpoint -q $LFS; then mount $LFS_PART $LFS; fi
if ! mountpoint -q $LFS/boot; then mount $LFS_BOOT $LFS/boot; fi
if ! mountpoint -q $LFS/boot/efi; then mount $LFS_EFI $LFS/boot/efi; fi
if ! mountpoint -q $LFS/home; then mount $LFS_HOME $LFS/home; fi
if ! mountpoint -q $LFS/sources; then mount /mnt/nfs/sources $LFS/sources; fi
# /dev 존재 확인 후 필요한 조치 진행
if [ ! -d $LFS/dev ]; then
echo "Make necessary directories"
mkdir -pv $LFS/{dev,proc,sys,run}
else
echo "All required directories have been verified."
fi
# 입력에 따라 chroot 실행 또는 exit 후 사용한 커널 가상 파일 시스템 언마운트
case $1 in
clean|c|-c)
if mountpoint -q $LFS/dev/shm; then
# Unmount Kernel Virtual File System used in previous LFS sessions.
echo "LFS is now set to '"$LFS"'"
echo "Now proceed with the unmount of <Kernel Virtual File System> for chroot"
for kvfs in dev/shm dev/pts sys proc run dev ; do
if mountpoint $LFS/$kvfs; then umount -q $LFS/$kvfs; fi
done
findmnt -D -R $LFS
echo "Ok unmount unnecessary devices"
echo "Good bye"
exit 0
else
echo "Cleanup of Kernel Virtual File System is Complete."
findmnt -D -R $LFS
exit 0
fi
;;
start|s|-s)
# Mount the Kernel Virtual File System to Enter LFS chroot environment.
echo "Now proceed with the mount of <Kernel Virtual File System> for chroot"
echo "LFS is now set to '"$LFS"'"
if ! mountpoint -q $LFS/dev; then mount --bind /dev $LFS/dev; fi
if ! mountpoint -q $LFS/dev/pts; then mount -t devpts devpts -o gid=5,mode=0620 $LFS/dev/pts; fi
if ! mountpoint -q $LFS/proc; then mount -t proc proc $LFS/proc; fi
if ! mountpoint -q $LFS/sys; then mount -t sysfs sysfs $LFS/sys; fi
if ! mountpoint -q $LFS/run; then mount -t tmpfs tmpfs $LFS/run; fi
if ! mountpoint -q $LFS/dev/shm; then mount -t tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm; fi
if ! mountpoint -q $LFS/sources; then mount --rbind /mnt/nfs/sources $LFS/sources; fi
findmnt -D -R $LFS
# Run 'chroot'
chroot "$LFS" $(type -p env) -i \
HOME=/root \
TERM="$TERM" \
PS1='<LFS> \u@\h [ \w ] \$ '\
PATH=/usr/bin:/usr/sbin \
MAKEFLAGS="-j$(nproc)" \
TESTSUITEFLAGS="-j$(nproc)" \
NINJAJOBS="$(nproc)" \
/bin/bash --login
exit 0
;;
version|v|-v)
echo "LFS chroot script $VERSION"
exit 0
;;
help|h|-h)
echo "LFS chroot script $VERSION"
echo "Usage:"
echo "clean or c- Unmount Kernel Virtual File System"
echo "start or s- Mount and run 'chroot' command with necessary variables"
echo "version or v- Print script version"
echo "help or h - This screen"
exit 0
;;
*)
#Guidance on the factors needed to execute script
echo "sh ./lfs-env-config [ start | clean | help | version ]"
exit 0
;;
esac
## End ~/bin/lfs-env-config
파일 다운로드 링크 처리
다음과 같이 등록하고 사용해야 cd
가 작동을 합니다.
alias <filename>='source <filename>'
다운로드 링크 입력: 다운로드 → 압축 해제 → 디렉토리 이동
추가한 사항
- 입력받은 URL이 Git인 경우 처리 추가
- 확장자가 .zip인 경우 처리 추가
- 이미 다운로드 완료한 파일의 경우 처리 추가
- 작업 디렉토리의 소유권 확인 추가
- 출력 색상 변수 설정
추가할 사항
- alias 등록 확인
- wget, git, gawk 설치 여부 확인
user@host:[ ~ ] $ pre-stage https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-1.17.0.tar.xz
xcb-proto-1.17.0.tar 100% [====================================================>] 148.19K 302.76KB/s
[Files: 1 Bytes: 148.19K [153.40KB/s] Redirects: 0 Todo: 0 Errors: 0 ]
user@host:[ /workbench/xcb-proto-1.17.0 ] $ _
#!/bin/bash
# 파일명이나 다운로드 링크를 입려가면 압축해제 후 해당 디렉토리로 이동하는 스크립트.
# 입력받은 문자열이 파일 다운로드 링크인지 파일명인지 확인.
# 1. 입력받은 문자열이 "git"로 끝나면 별도 처리
# 2. 링크면 다운로드후 진행.
# 2-1. 파일명이면 압축 해제하고 디렉토리 변경 시도.
# 2-2. 파일명과 디렉토리에 일관성이 없으면 가장 최근에 생성된 디렉토리로 이동
#
if [ -z "$1" ]; then echo -e "${Green}An appropriate factor (file name or download link) is required.${Color_Off}"; return; fi
InputStringType=$(echo "$1" | awk 'BEGIN { FS = ":" } ; { print $1 }')
BuildBase="$LFS"/workbench
SourceBase="$LFS"/sources
TargetFile=$(basename "$1")
GitDirCheck=$(basename -s .git "$1")
GitCheck=${TargetFile: -3}
NotFoundMsg1="The directory derived from the filename is ${BIGreen}$TargetDir${Color_Off}.\n\
However, it does not exist, so it will move to the ${Yellow}most recent directory created${Color_Off}.\n\
Please check if it is correct."
TargetDir=$(echo "$TargetFile" | sed -e 's/\.tar.*$//' -e 's/\.tgz*$//' -e 's/\.src*$//' -e 's/\.zip*$//' -e 's@^.*/@@')
function chg_dir() {
if [ -d "$1" ]; then
cd "$1"
else
cd $(ls -tcA -w1 | head -n1)
echo -e "$NotFoundMsg1"
fi
}
# 이상한 것!
if [ "$PWD" != "$BuildBase" ]; then
chg_dir "$BuildBase"
fi
## .git URL 처리
if [ "$GitCheck" == "git" ] ; then
if [ -d "$GitdirCheck" ] ; then
chg_dir "$GitDirCheck"
return
else
git clone "$1"
echo "Git #1"
chg_dir "$GitDirCheck"
return
fi
fi
# 입력이 URL이면 다운로드
case "$InputStringType" in
https|http|ftp)
wget --no-verbose --no-clobber --directory-prefix="$SourceBase" "$1"
;;
*)
;;
esac
# Zip와 다른 타르볼처리
if file "$TargetFile" | grep -q 'Zip archive data'; then
mkdir -p "$TargetDir"
chg_dir "$TargetDir"
unzip -q "SourceBase"/"$TargetFile"
else
if [ ! -d "$TargetDir" ]; then
tar -xf "$SourceBase"/"$TargetFile" 2>/dev/null
fi
chg_dir "$TargetDir"
fi