linuxfromscratch

for i in $(echo "ldapadd, ldapcompare, ldapdelete, ldapexop, ldapmodify, slapschema, slaptest" | sed 's/,/ /g') ; do find /usr/bin -type f -name $i ; done

특정 문자열을 가진 파일을 아카이브 처리

“python3_11” 문자열이 있는 파일을 검색하고 $HOME에 아카이브 파일 생성

grep -rl python3_11 | tar -T - -acf ~/ibus-hangul.tar.zst

grep

  • r 재귀 탐색
  • l 파일명을 상대경로로 출력

tar

  • T 입력된 파일에서 아카이브 대상 불러옴
  • - 파이프로 전달받은 표준 입력
  • a 확장자로 압축 방법 자동 선택
  • c 아카이브 생성
  • f 아카이브 파일명

사용해본 결과 생각처럼 편한것은 아니었음.

패키지마다 다르지만 사용하지 않는 옵션이 주어지면 Fail이 발생하는 경우가 있었음.

–docdir=/usr/share/doc/<package name> 입력이 귀찮아서 해보려고 했지만

결과적으로는 그냥 타이핑 하는것이 적합했음.

내용 확인


패키지 설치 여부가 생각나지 않을 때 사용

필요 패키지: ANSI Code Generator
git clone https://github.com/fidian/ansi.git

사용 예시

function double-check() {                                                                                                  
    local FindWord=*${1}*                                                                                                  
    local FindDir=$2                                                                                                       
                                                                                                                           
    if [ -z $FindDir ] ; then                                                                                              
        FindDir=/usr                                                                                                       
    fi                                                                                                                     
                                                                                                                           
    find $FindDir -name $FindWord 2> /dev/null | sort | grep $1                                                            
                                                                                                                           
    echo "I searched for $(ansi --green ${1}) you wanted in th $(ansi --yellow ${FindDir}) you specified"                  
}                                                                                                                          
                                                                                                                           
export -f double-check  


wget -q -O- <patch url> | patch <options>

사용법

예시 1

docbook-xsl-nons-1.79.2 patch

wget -q -O- https://www.linuxfromscratch.org/patches/blfs/12.1/docbook-xsl-nons-1.79.2-stack_fix-1.patch \
| patch -Np1

예시 2

libpng patch

wget -O- https://downloads.sourceforge.net/sourceforge/libpng-apng/libpng-1.6.40-apng.patch.gz \
| gzip -cd | patch -p1


최초

많이 지저분하고 번거로움

1차 개선

번거로운건 사라짐 그러나 여전히 지저분함

2차 개선

PS1_ROOT='\[$(tput setaf 203)\][ \[$(tput sgr0)\]\w \[$(tput setaf 203)\]] \[$(tput sgr0)\]\$\n'
PS1_USER='\[$(tput setaf 75)\][ \[$(tput sgr0)\]\w \[$(tput setaf 75)\]] \[$(tput sgr0)\]\$\n'
PS1_HEAD='\[$(tput setaf 229)\]\u\[$(tput setaf 199)\]@\[$(tput setaf 215)\]\h '
if [ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ] ; then
    if [ $(id -u) -eq 0 ] ; then
        PS1="<Chroot>${PS1_HEAD}${PS1_ROOT}"
    else
        PS1="<Chroot>${PS1_HEAD}${PS1_USER}"
    fi
else
    if [ $(id -u) -eq 0 ] ; then
        PS1="${PS1_HEAD}${PS1_ROOT}"
    else
        PS1="${PS1_HEAD}${PS1_USER}"
    fi
fi


LFS 진행에 필요한 패키지 설치

sudo apt install build-essentials bison gawk m4 texinfo texinfo  ## 필수 사항
sudo apt install gettext libisl-dev                              ## 선택 사항
sudo ln -sf bash /usr/bin/sh && file /usr/bin/sh                 ## 필수 사항
/usr/bin/sh: symbolic link to bash 


time { command 1 && ... && command N; } 2>&1 | tee <log-file>


Qemu에서 가상머신 시작시 디바이스 순서가 바뀌는 일이 발생해서 처리한 내용.

파티션 레이블 설정

mkswap -L <label> <partition>
e2label <device> <label>

/etc/fstab 수정

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
#
# <file system>         <mount point>   <type>          <options>               <dump>  <pass>
# / was on /dev/sda1 during installation
LABEL=ROOT_DISK          /              ext4            errors=remount-ro       0       1
# swap was on /dev/sda5 during installation
LABEL=SWAP_1G           none            swap            sw                      0       0
LABEL=SWAP_5G           none            swap            sw                      0       0
# /dev/sr0              /media/cdrom0   udf,iso9660     user,noauto             0       0
LABEL=LFS_DISK          /mnt/lfs        ext4            defaults                1       1

UUID로 설정하는 경우 장치명을 주석으로 표기하면 추후 수정시 용이.


~/.profie or ~/.bashrc

TERM=putty-256color
export TERM


컴파일중 알 수 없는 에러가 발생하고 매번 발생 위치가 다르다면 -j1 인자로 병렬처리 없이 make 실행

make -j1

root로 다음과 같이 실행

chmod 4755 /usr/bin/su
su 파일에 setuid를 설정해서 묹제를 해결.

OpenSSH

Wget

소스 패키지 다운로드에 필요

Wget-1.24.5

설치 순서 : Libunistring - Libidn2 - Libpsl - Libtasn1 - P11-kit - SQLite - NSPR - NSS -Make-ca - Wget

의존성

NFS-UTILS

NFS-Utils-2.6.4

필요한 패키지를 아래의 순서대로 설치 후 설치

의존성

SSHFS (NFS 사용 안하는 경우)

N40L에 있는 소스 디렉토리 마운트에 필요

sshfs-3.7.3

설치 순서 : ICU - Libxml2 - Sgml-common - UnZip - Docbook-xsl-nons - Docbook-xml - Libxslt - Docutil - Packing - PCRE2 - Glib - OpenSSH - Fuse - SSHFS

의존성


pushd /usr/share/info
  rm -v dir
  for f in *
    do install-info $f dir 2>/dev/null
  done
popd


export LFS=/mnt/lfs
export LFS_SWAP=$LFS/Swapfile_For_LFS_1G
sudo fallocate --length 1G $LFS_SWAP
sudo chmod 0600 $LFS_SWAP
sudo mkswap $LFS_SWAP
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=890ba9a5-da48-4374-84ce-b71b91863e00
sudo swapon $LFS_SWAP
sudo echo "$LFS_SWAP  swap  swap  defaults  0  0" >> /etc/fstab


GMP를 먼저 설치

./configure --prefix=/usr    \
            --enable-cxx     \
            --disable-static \
            --docdir=/usr/share/doc/gmp-6.2.0
make
make check 2>&1 | tee gmp-check.log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

ISL Homepage에서 받아서 준비

./configure --prefix=/usr --disable-static --with-gmp=system
make
make install


alias dirfind="find -mindepth 1 -maxdepth 1 -type d | sed 's@^./@@'"
dirfind | wc -l    ## 디렉토리 갯수 확인
rm -rf $(dirfind)  ## 설치 완료된 소스 디렉토리 삭제
## 설치 완료된 패키지 디렉토리만 삭제할거면 다음과 같이
alias SearchAndDestroy='find -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} \;'


## 현재 디렉토리+생성시간을 추가해서 로그파일 작성
alias lfslog='tee ~/lfs-log/$(case $(basename $(pwd)) in build) echo $(basename $(dirname $(pwd))); ;; *) echo $(basename $(pwd)); ;; esac).$(date "+%Y%m%d_%H%M%S").log' 
time { ./configure .... && make && make install; } | lfslog 

<a href=""></a>                                           ## 현재 창 또는 탭에서 링크 열기
<a target="_blank" rel="noopener noreferrer" href=""></a> ## 새로운 창 또는 탭에서 링크 열기

./configure --prefix=/usr        \
            --bindir=/usr/bin    \
            --localstatedir=/var \
            --disable-logger     \
            --disable-whois      \
            --disable-rcp        \
            --disable-rexec      \
            --disable-rlogin     \
            --disable-rsh        \
            --disable-servers

## Same Command 

./configure --prefix=/usr --bindir=/usr/bin --localstatedir=/var \
            --disable-{logger,whois,r{cp,exec,login,sh},servers}

tar -cf - . | tar -xvf - -C /target_directory

## 크기가 50M 이상이면서 .deb, .vmdk 확장자가 아닌 파일 
## Operator AND = -and,-a, OR= -or = -o, NOT = !
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

## 일반적인 grep 으로 다음과 같은 결과가 나왔다.
$ grep 'printf' fileio.c   
                printf("FILE open Error\n");
                printf("chi = %c\n", chi);
                printf("cho = %c\n", cho);
                printf("FILE open Error\n");
                printf("chi = %c\n", chi);
                printf("cho = %c\n", cho);

## -n 옵션을 통해 line 을 볼수 있다.
$ grep -n 'printf' fileio.c 
11:             printf("FILE open Error\n");
18:             printf("chi = %c\n", chi);
19:             printf("cho = %c\n", cho);
25:             printf("FILE open Error\n");
31:             printf("chi = %c\n", chi);
32:             printf("cho = %c\n", cho);

## -v 옵션을 통해 'chi' 문자열이 들어간걸 제외하고 print 했다.
$ grep -n 'printf' fileio.c | grep -v 'chi'
11:             printf("FILE open Error\n");
19:             printf("cho = %c\n", cho);
25:             printf("FILE open Error\n");
32:             printf("cho = %c\n", cho);

## grep 을 두번 사용해서 보고싶은것만 print 했다.
$ grep -n 'printf' fileio.c | grep -v 'chi' | grep -v 'cho'
11:             printf("FILE open Error\n");
25:             printf("FILE open Error\n");

## -Ev 옵션을 통해 여러번 grep 하는것을 파이프(|)로 작성할 수 있다.
$ grep -n 'printf' fileio.c | grep -Ev 'chi|cho'           
11:             printf("FILE open Error\n");
25:             printf("FILE open Error\n");

grep -rl '#!.*python' | xargs sed -i '1s/python$/python3/'

// 하위 디렉토리의 모든 파일에서 1행이 #!로 시작해서 python을 끝나는 파일을 찾아서 python을 python3로 변경
#!/usr/bin/env python     # 원본
#!/usr/bin/env python3    # 변경 

df -ht ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        40G   11G   27G  29% /
/dev/sde1       173M   95M   65M  60% /boot
/dev/sde2        19G  1.5G   16G   9% /mnt/debian
/dev/sda1       1.8T  9.7G  1.7T   1% /mnt/1st-bay
/dev/sdb1       1.8T  1.1G  1.7T   1% /mnt/2nd-bay
/dev/sdc1       1.8T   28K  1.7T   1% /mnt/3rd-bay
/dev/sdd1       1.8T   32K  1.7T   1% /mnt/4th-bay

# 읽어들인 NR 레코드(여기서는 Filesystem과 Size) 갯수가 2 이하일때는 awk에서 바로 출력하고 
# 이후에는 출력결과를 sort를 거쳐서 출력
df -ht ext4 | awk 'NR<2{print $0;next}{print $0| "sort"}'
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        40G   11G   27G  29% /
/dev/sda1       1.8T  9.7G  1.7T   1% /mnt/1st-bay
/dev/sdb1       1.8T  1.1G  1.7T   1% /mnt/2nd-bay
/dev/sdc1       1.8T   28K  1.7T   1% /mnt/3rd-bay
/dev/sdd1       1.8T   32K  1.7T   1% /mnt/4th-bay
/dev/sde1       173M   95M   65M  60% /boot
/dev/sde2        19G  1.5G   16G   9% /mnt/debian

참고

# 1q로 한줄만 sed에서 처리하고 종료 나머지는 sort가 처리
df -ht ext4 | { sed -u 1q; sort; }

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        40G   11G   27G  29% /
/dev/sda1       1.8T  9.7G  1.7T   1% /mnt/1st-bay
/dev/sdb1       1.8T  1.1G  1.7T   1% /mnt/2nd-bay
/dev/sdc1       1.8T   28K  1.7T   1% /mnt/3rd-bay
/dev/sdd1       1.8T   32K  1.7T   1% /mnt/4th-bay
/dev/sde1       173M   95M   65M  60% /boot
/dev/sde2        19G  1.5G   16G   9% /mnt/debian

# -r / --recursive : 디렉토리 대상
# -np / --no-parent : 상위 제외
# -R / --reject : 해당 파일 제외
# -P / --directory-prefix=PREFIX : PREFIX/.. 에 파일 저장
wget -r -np -R "index.html*" -P <DIR> lfs/ https://ftp.osuosl.org/pub/lfs/lfs-packages/12.1/

echo CONFIG_EXTRA_FIRMWARE='" '$({ cd /lib/firmware; echo amd-ucode/*; echo amdgpu/re*; echo rtl_nic/*; echo regulatory*; })'"' >> .config
make oldconfig

find /usr/share/man/ -type f -name '*.[0-9]' | wc -l

  • linuxfromscratch.txt
  • 마지막으로 수정됨: 2024/06/16 23:14
  • 저자 baecy