天天看點

Linux shell腳本程式設計及系統啟動實踐

Linux shell腳本程式設計及系統啟動實踐

1) 計算機加電自檢,當給計算機通電後,其主機闆上的coms晶片會執行bios上的程式,程式會對其硬體資訊去檢查是否存在以及是否能夠正常工作,最後初始化硬體;

  2)bios啟動引導,此階段分兩個步驟,第一步是查找引導裝置,查找到第一個有引導程式的裝置即為啟動引導裝置;第二步是找到了引導裝置,讀取引導裝置上的mbr(第一扇區的前446位元組數bootloader 中間64位元組數分區表 最後兩個位元組是55aa共512位元組);

  3)grub啟動引導,grub提供給我們選擇菜單,我們可以選擇其不同核心版本的核心進行啟動(如果是多核心的情況),然後把我們選擇的核心裝載到記憶體中解壓展開,最後讀取grub配置檔案找到initrd.img(此檔案存放各種硬體驅動以便後續切換根)

1、編寫腳本,接受二個位置參數,magedu和/www,判斷系統是否有magedu,如果沒有則自動建立magedu使用者,并自動設定家目錄為/www

[root@test qiuhom]#cat checkuser.sh 
#!/bin/bash
user=$1
[ $UID -ne 0 ] && echo "this script must root run it" && exit 3 
[ $# -ne 2 ] && echo "usage bash $0 user homedir" && exit 4
if [[ $2 =~ ^(\/.*) ]];then
         homedir=$2
else
        echo "input homedir must directory"  
        exit 6
fi  
if getent passwd $user &> /dev/null  ;then 
        echo "$user is  exist"
        exit 7
else
    useradd $user -m -d $homedir
    [ $? -eq 0 ] && echo $user is create successful
fi

[root@test qiuhom]#sh checkuser.sh tom
usage bash checkuser.sh user homedir
[root@test qiuhom]#sh checkuser.sh qiuhom /home/qiuhom
qiuhom is  exist
[root@test qiuhom]#sh checkuser.sh tom tom
input homedir must directory
[root@test qiuhom]#sh checkuser.sh magedu /www
magedu is create successful
[root@test qiuhom]#getent passwd magedu
magedu:x:1004:1004::/www:/bin/bash
[root@test qiuhom]#ll /www/ -d
drwx------ 3 magedu magedu 78 11月 26 22:13 /www/
[root@test qiuhom]#ll /www/ -a 
總用量 16
drwx------   3 magedu magedu   78 11月 26 22:13 .
dr-xr-xr-x. 22 root   root   4096 11月 26 22:13 ..
-rw-r--r--   1 magedu magedu   18 10月 31 2018 .bash_logout
-rw-r--r--   1 magedu magedu  193 10月 31 2018 .bash_profile
-rw-r--r--   1 magedu magedu  231 10月 31 2018 .bashrc
drwxr-xr-x   4 magedu magedu   39 11月  3 14:33 .mozilla
[root@test qiuhom]#      

2、使用expect實作自動登入系統。

[root@ansible_centos6 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:41:ff:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.128/24 brd 192.168.0.255 scope global eth1
    inet6 fe80::20c:29ff:fe41:ffc0/64 scope link 
       valid_lft forever preferred_lft forever
[root@ansible_centos6 ~]# cat autologin.exp 
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set port [lindex $argv 2]
set passwd [lindex $argv 3]
set timeout 10
spawn ssh $user@$ip -p $port

expect {
        "yes/no" {send "yes\n";exp_continue}
        "password" {send "$passwd\n"}
}

interact
[root@ansible_centos6 ~]# expect autologin.exp 192.168.0.99 qiuhom 41319 admin
spawn ssh [email protected] -p 41319
[email protected]'s password: 
[qiuhom@test ~]$ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 brd 172.16.255.255 scope global noprefixroute enp2s0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
3: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:30:18:51:af:3d brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:bd:55:ad:ff brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
[qiuhom@test ~]$      

3、簡述linux作業系統啟動流程 

Linux shell腳本程式設計及系統啟動實踐

此圖檔來自網絡

  1) 計算機加電自檢,當給計算機通電後,其主機闆上的coms晶片會執行bios上的程式,程式會對其硬體資訊去檢查是否存在以及是否能夠正常工作,最後初始化硬體;

  4)核心初始化,此階段主要是探測可識别的硬體,加載硬體驅動,切換根分區(挂載rootfs),運作系統第一個程序init程序初始化系統;

  5)系統初始化,此階段主要是初始化軟體運作環境,它會讀取配檔案/init/inittab(centos5和6)或者systemd(centos7)讀取預設運作級别,然後運作該預設級别下的腳本,啟停預設級别下定義的服務(centos7采用systemd來啟停服務,centos6是采用init程序來啟停服務),最後登入終端;

4、破解centos7 密碼。

方式一:

  1)啟動時按任意鍵停止啟動,按e鍵進入編輯模式;

Linux shell腳本程式設計及系統啟動實踐

  2)将光标移動到linux16開始的行,添加核心參數rd.break

Linux shell腳本程式設計及系統啟動實踐

  3)按ctrl + x 啟動

Linux shell腳本程式設計及系統啟動實踐

  4)以讀寫方式重新挂載根;mount -o remount,rw /sysroot

Linux shell腳本程式設計及系統啟動實踐

   說明:可以看到我們Ctrl + x 重新進入系統正在的根在/sysroot上,并且是隻讀挂載

Linux shell腳本程式設計及系統啟動實踐

  5)切換根chroot /sysroot

Linux shell腳本程式設計及系統啟動實踐

  6)更改密碼 passwd root

Linux shell腳本程式設計及系統啟動實踐

  7) touch /.autorelabel ,并退出目前切換後的根分區

Linux shell腳本程式設計及系統啟動實踐

   說明:可以看到我們不退出目前切換後的根分區是不能重新開機的

  8) 重新啟動系統;reboot

方式二:

  1)啟動時按任意鍵暫停啟動,并按e鍵進入編輯模式

  2)将光标移動至linux16開始的行,并在末尾追加 rw init=/sysroot/bin/sh

Linux shell腳本程式設計及系統啟動實踐

   3)Ctrl+x啟動 

Linux shell腳本程式設計及系統啟動實踐

   說明:用以上啟動方式,我們可以省略重新以讀寫方式挂載/sysroot,後續直接切換根,更改密碼

  4)切換根chroot /sysroot

  5)更改root密碼 passwd root 

  6)更新/.autorelabel檔案的時間戳touch /.autorelabel  (此檔案的作用是下次重新啟動它會重新标記selinux的檔案系統)

  7)exit   并重新開機

作者:Linux-1874

出處:https://www.cnblogs.com/qiuhom-1874/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀