從Linux小白到大?!c狼共舞的日子10

馬哥教育網絡班21期+第10周課程練習

1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)


POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) 
 --> Kernel+ramdisk(initrd) --> rootfs --> /sbin/init 
 --> (/etc/inittab,/etc/init/*.conf)

(1)加電自檢:POST
    通電后主板CMOS中的BIOS進行硬件自檢;

(2)BIOS,引導加載次序:Boot Squence
    按照BIOS中的設備啟動順序,找到第一個有引導程序的設備作為啟動的設備;

(3)bootloader
    引導加載器,引導并提供菜單,讓用戶選擇要啟動的系統把選定的內核裝載到
    內存中的特定空間中,解壓、展開,并把系統控制權限移交給內核;

(4)kernel初始化操作
    探測可識別的所有硬件設備;加載硬件驅動;以只讀方式掛在根文件系統;
    運行用戶空間的第一個應用程序:/sbin/init

(5)init階段
    根據對應的運行級別運行對應的運行級別定義的腳本

(6)運行初始化腳本
    系統初始化腳本對應文件:/etc/rc.d/rc.sysinit,設置主機名等信息,檢測
    根文件系統,激活swap等;

(7)啟動系統服務
    根據/etc/rc.d/init.d目錄下的腳本啟動相應的系統服務;

2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;

  • (1) 為硬盤新建兩個主分區;并為其安裝grub;

  • (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;

  • (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;

  • (4) 為grub提供配置文件;

  • (5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;


[root@localhost ~]# lsblk /dev/sdb
  NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sdb  8:16   0  60G  0 disk 
  ├─sdb1   8:17   0  10G  0 part 
  └─sdb2   8:18   0  10G  0 part

[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2

[root@localhost ~]# mkdir /mnt/{boot,sysroot}

[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/

[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb

[root@localhost ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
[root@localhost ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz

[root@localhost ~]# vim /mnt/boot/grub/grub.conf
  default=0
  timeout=5
  title CentOS 6
  root (hd0,0)
  kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
  initrd /initramfs.img

[root@localhost ~]# bash cpcommand.sh  #第八題的腳本
                    將ls,bash,cat命令及所依賴的庫文件復制到/mnt/sysroot/中,
                    并將新加的磁盤掛載到新虛擬機中啟動測試

3、制作一個kickstart文件以及一個引導鏡像。描述其過程。


創建kickstart文件的方式:
            (1) 直接手動編輯;
                依據某模板修改;
            (2) 可使用創建工具:system-config-kickstart (CentOS 6)
                依據某模板修改并生成新配置;

[root@localhost ~]# yum install system-config-kickstart -y
[root@localhost ~]# system-config-kickstart  #使用kickstart圖形另存為一個kickstart文件


kickstart文件的格式:
        命令段:指明各種安裝前配置,如鍵盤類型等;
        程序包段:指明要安裝的程序包組或程序包,不安裝的程序包等;
            %packages
            @group_name
            package
            -package
            %end
        腳本段:
            %pre: 安裝前腳本
                運行環境:運行于安裝介質上的微型Linux環境

            %post: 安裝后腳本
                運行環境:安裝完成的系統;

        命令段中的命令:
            必備命令
                authconfig: 認證方式配置
                    authconfig --useshadow  --passalgo=sha512
                bootloader:bootloader的安裝位置及相關配置
                    bootloader --location=mbr --driveorder=sda 
                               --append="crashkernel=auto crashkernel=auto 
                                 rhgb rhgb quiet quiet"
                keyboard: 設定鍵盤類型
                lang: 語言類型
                part: 創建分區
                rootpw: 指明root的密碼
                timezone: 時區

            可選命令
                install OR upgrade
                text: 文本安裝界面
                network
                firewall
                selinux
                halt
                poweroff
                reboot
                repo
                user:安裝完成后為系統創建新用戶
                url: 指明安裝源

創建引導光盤:
            1)復制系統安裝光盤/Packages /repodata外的所有文件到目錄/myiso/
            2)創建引導光盤鏡像
            # mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 
              --boot-info-table -V "CentOS 6.6 x86_64 boot" 
              -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/

4、寫一個腳本

  • (1) 能接受四個參數:start, stop, restart, status

  • start: 輸出“starting 腳本名 finished.”

  • (2) 其它任意參數,均報錯退出;


[root@localhost ~]# cat status.sh 
#!/bin/bash
#
[ -d /var/log/subsys ] || mkdir -p /var/log/subsys
lockfile=/var/log/subsys/$0
Usage(){
    echo "Usage:$0 (start|stop|restart|status)" 
}

Start(){
    [ -e $lockfile ] && echo "$0 already Started." || touch $lockfile && echo "Starting $0 finished."
}

Stop(){
    [ -e $lockfile ] && rm -f $lockfile && echo "Stoping $0 finished." || echo "$0 no Running."
}

Status(){
    [ -e $lockfile ] && echo "$0 is Running." || echo "$0 is Stopped."
}

[ $# -ne 1 ] && Usage && exit 1

case $1 in
    start)
        Start;;
    stop)
        Stop;;
    restart)
        Stop&&Start;;
    status)
        Status;;
    *)
        Usage
        exit 2
        ;;
esac

5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;

  • (1) 如果登錄了,則顯示用戶登錄,腳本終止;

  • (2) 每3秒鐘,查看一次用戶是否登錄;


[root@localhost ~]# cat userlogin.sh 
#!/bin/bash
#
[ $# -ne 1 ] && echo "Usage:$0 username" && exit 1
while true;do
    who | grep "^\<$1\>" &>/dev/null && echo "$1 Login." && exit 0 || sleep 3
done

6、寫一個腳本,顯示用戶選定要查看的信息;

  • cpu) display cpu info

  • mem) display memory info

  • disk) display disk info

  • quit) quit

  • 非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;


[root@localhost ~]# cat display.sh 
#!/bin/bash
#
cat << EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
========================
EOF
Chose(){
read -p "Choose a option:(cpu|mem|disk|quit)" option
}

Chose
until [ $option == "quit" ];do
    case $option in
        cpu)
            lscpu && Chose;;
        mem)
            free -m && Chose;;
        disk)
            lsblk && Chose;;
    *)
            echo "Error,chose again!" && Chose;; 
    esac
done

7、寫一個腳本

  • (1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;

  • (2) 提示用戶輸入一個用戶名或輸入“quit”退出;

  • 當輸入的是用戶名,則調用函數顯示用戶信息;

  • 當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:


[root@localhost ~]# cat uidshell.sh 
#!/bin/bash
Show(){
    uid=`id -u $1`
    usershell=`grep "^\<$1\>" /etc/passwd | cut -d: -f7`
    echo "UID:$uid  Shell:$usershell" && chose
}

chose(){
    read -p "Enter a Username or quit:" username
}

chose
until [ $username == "quit" ];do
    ! id $username &>/dev/null && echo "No such User." && chose || Show $username
done

8、寫一個腳本,完成如下功能(使用函數)

  • (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;

  • (2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;

  • (3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;


[root@localhost ~]# cat cpcommand.sh 
#!/bin/bash
#
dir=/mnt/sysroot
cpbin(){
bincmddir=`echo $cmd | grep -o -E "^/.*/"`
[ -d $dir$bincmddir ] || mkdir -p $dir$bincmddir
[ -z $dir$cmd ] || cp $cmd $dir$bincmddir
}

cplib(){
liblist=`/usr/bin/ldd $cmd | grep -o "[^[:space:]]*/lib[^[:space:]]*"`
for lib in $liblist;do
    cmddir=`echo $lib | grep -o -E "^/.*/"`
    [ -d $dir/$cmddir ] || mkdir -p $dir$cmddir
    [ -z $dir/$lib ] || cp $lib $dir$cmddir
done
}
   
while true;do
read -p "Enter a Command:(Commamd|quit)" command
[ $command == "quit" ] && echo "quit..." && exit 0
which $command &>/dev/null && cmd=`which --skip-alias $command` || echo "No correct Command."
[[ -x $cmd ]] && cpbin $command && cplib $command || echo "No correct Command."
done

原創文章,作者:N21_孤狼,如若轉載,請注明出處:http://www.www58058.com/60676

(0)
N21_孤狼N21_孤狼
上一篇 2016-12-05 17:05
下一篇 2016-12-05 17:05

相關推薦

  • 第五周博客作業

      感覺進入了年底,明顯的時間不夠,不管怎么說,還是要努力跟上學習的進度,不能給自己松懈找借口!  1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; [root@localhost ~]# grep "^[[:space:]]\+" /boot/grub/grub.co…

    Linux干貨 2017-01-03
  • MAN手冊各章節功能及快捷鍵

    前言: man是manual的簡稱,中文說法可以是手冊。而man手冊分為不同的各個章節,每個章節保存這不通類型的手冊。 各個章節功能:    Section 名稱      說明 1 用戶命令 可由任何人啟動的 2 系統調用 即由內核提供的函數 3 例程   …

    Linux干貨 2016-10-17
  • centos7配置bindDNS解析服務

    首先來概述一下 通俗一點理解呢,DNS就是把域名轉換成IP的一種服務(反向則是IP轉換成域名).以方便人們的記憶,就好比記住一個代表性的英文要比記住電話號碼快得多,通常我們將這種服務稱之為解析.現在一般公網都有萬網 騰訊云這些機構,DNS這一塊我們不需要負責.但是在現在企業的內部網則就需要我們來搭建DNS服務器了.本次采用的bind工具進行域名的解析。 1.…

    Linux干貨 2018-03-26
  • 淺談HTTP協議以及httpd的十八般武藝

      初識HTTP協議                HTTP(hyper text transfer protocal)作為互聯網應用最廣泛的協議,任何一個運維人員都無法回避它,HTTP的目的就是提供一種發布和…

    Linux干貨 2016-02-14
  • 馬哥Linux第三周作業

    正則表達式 用戶和組管理

    Linux干貨 2017-12-31
  • 文件的查找命令 find 和 locate

    文件的查找命令 find 和 locate find 功能:實時查找工具,通過遍歷指定路徑完成文件查找 工作特點: ?  查找速度略慢?  精確查找?  實時查找?  可能只搜索用戶具備讀取和執行權限的目錄 語法:   find [OPTION]… [查找路徑] [查找條件] [處理動作] 查找路徑:指定具…

    Linux干貨 2016-08-16
欧美性久久久久