『壹』 linux啟動內核報錯:init Not tainted
如下圖,啟動的時候提歲擾示內核錯誤,關鍵詞:init Not tainted
錯誤修改了 selinux 的配置文件,改回茄敗來即可
掛載系統鏡像文件,這里我的機器是Vmware虛擬出來的,直接設置開機連接系統鏡像ISO文件即可,然後從鏡像啟動,選擇Rescue模式,啟動機器,啟乎納旦動後,原來的系統文件被掛載到了 /mnt/sysimage 下面
參考下圖,修改文件 /mnt/sysimage/selinux/conf
修改後,重啟系統,問題解決
『貳』 linux啟動的第一個進程init啟動的第一個腳本程序
linux啟動的第一個進程init啟動的第一個腳本程序是sysinit。根據查詢相關公開信息顯示虛擬機系統Linux在進行啟動時啟動的第一個腳本告握的程序名稱是sysinit。Linux,全稱GNULinux,是一種免費使用和自由傳播的類UNIX操作系統,其內核由林納斯·本納第克特·托瓦茲於1991年10月5日首次發布,它主要受到Minix和Unix思野派想的啟發,是一個基於POSIX的多用戶、多任務、襪脊慶支持多線程和多CPU的操作系統。
『叄』 Linux啟動run-init: can't execute '/sbin/init'
Linux啟動run-init: can't execute '/sbin/init'如下
當init啟動後慶衡仿,它通過執行各種啟動事務來繼續引導進程(檢查並監視文件系統,啟動後台程序daemons,等等),直至完成用戶所有操作環境的設置工作。這里主要涉及4個程序:init、getty(agetty)、login和shell程序。
init進程的主要任務是根據/etc/rc文件中設置的信息,執行其中設置的命令,然後根據/etc/inittab文件中的信息,為每一個允許登錄的終端設備使用fork()創建一個子進程,並在每個新創建的子進程中運行agetty (getty)程序。而init進程則調用wait(),進入等待子進程結束狀態。每當它的一個子進程結束退出,它就會根據wait()返回的pid號知道是哪個對應終端的子進程結束了,因此就會為相應終端設備再創建一個新的子進程,並在該子進程中重新執行agetty程序。這樣,每個被允許的終端設備都始終有一個對應的進程為其等待處理。
在正常的操作下,init確定agetty正在工作著以允許用戶登錄,並且攔陪收取孤立進程。孤立進程是指那些其父輩進程已結束的進程;在Linux中所有的進程必須屬於單棵進程樹,所以孤立進程必須被收取。當系統關閉時,init負責殺死所有其它的譽纖進程,卸載所有的文件系統以及停止處理器的工作,以及任何它被配置成要做的工作。
『肆』 linux中/etc/init.d設置開機啟動
筆者最近要把寫的腳本程序設置為開機啟動,而且要把這個腳本做成服務放置在/etc/init.d目錄下,和其他服務一樣,比如mysql,可以允許命令service mysql start/stop/restart或者/etc/init.d mysql start/stop/restart來執行。用戶在啟用相應服務時, 就不用進行太緩碼復雜的設置。 當服務終止時, 操作系統也能根據腳本的定義, 自動回收相關資腔罩源。 用戶還能把重要的服務設置成開機啟動, 省去了手動開啟的麻煩。/etc/init.d 是 /etc/rc.d/init.d 的軟鏈接(soft link)。
想到筆者以前做過樹莓派來建立adsb接收基站,不妨把他的找出來看看,一個服務到底一個怎麼寫,有啥格式?
mp服務,腳本把進程包裝成了一個服務, 定義了它在啟動、 重啟和終止時的具體行為。
case "$1"就是讀取mp命令後的第一個參數的值,分別對應不同的執行函數來操作。本服務腳本有三個函數 start、stop、 reload|restart|force-reload,對應著上面定義的函數。
服務放在這個腳本下,還需要關聯服務,chkconfig --add mp 。在chkconfig工具服務列表中增加此服務,此服務會在/etc/rc.d/rcN.d中賦予K/S入口了。chkconfig --level 2345 mp on,修改start運行級別設置為2345,。chkconfig --level 16 mp off,修改stop運行級別為16。需要要注意的是,mp腳本需要設置X執行許可權哦。 chkconfig -list可以顯示所有運行級系統服務的運行狀態信息(on或伍哪鬧off)。
『伍』 樹莓派Linux啟動過程簡介
昨天在寫關於linux設置腳本開機啟動的文章時,有個疑問就是開機時怎麼確認運行級別,然後遍歷執行/etc/rcN.d/目錄下的所有服務程序。帶著疑問, 在前人的基礎上 學習總結一下linux系統初始化的工作的內容,現在樹莓派4B上展示出來。
1、載入內核
當計算機打開電源後,首先是BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬碟)來啟動。旅山操作系統接管硬體以後,首先讀入 /boot 目錄下的內核文件。樹莓派4B的內核是Raspbian GNU/Linux 10 (buster),基於Debian。
2、初始化進程init
內核文件載入以後,運行第一個程序init,它的作用是初始化系統環境。init位於目錄/sbin,進程號PID為1,即1號進程,其他所有進程都由init衍生,是init的子進程。
同時還有個0號進程,idle進程,在系統初始化時由內核kernel自身從無到有創建,通過調用kernel_thread創建一個內核線程去執行init函數,0號進程創建1號進程。
3、運行級別
具體介紹請參考筆者的文章-Linux運行級別簡介 ,但是開機時是怎麼確定運行級別的呢?
init進程首先讀取文件 /etc/inittab,它是運行級別的設置文件。但是各個發行版不太一樣,init的仔稿配置文件也不一樣,有可能使用/etc/event.d裡面的配置文件,最新版的改用為/etc/init目錄。
4、開機啟動程序
具體詳情請參考文章-linux中/etc/init.d設置開機啟動 ,確定運行級別後,執行rcN.d目錄下的文件,這些鏈接文件是連接到init.d目錄下的程序。init進程逐一載入開機啟動程序,其實就是運行這個目錄里的啟動腳本。
比如運行級別為5(圖形化多用戶)時啟動的程序:
5、用戶登錄
開機啟動程序載入完畢以後用戶登錄。用戶的登錄方式有三種:
命令行登錄:init進程調用getty程序。
ssh登錄:init進程調用sshd程序。
圖形界面登錄:init進程調用顯示管理器,Gnome圖形界面對應的顯示管理器為gdm。
6 、login shell
默認shell時bash,命令行界面,讓念鎮孝用戶可以直接與操作系統對話。讀取環境變數,具體請參考筆者文章-Linux環境變數的設置。
『陸』 lbios設置linux啟動
bios設置開機啟動項方法
首先,將u盤啟動盤插入到電腦usb插口當中,之後讓電腦重新啟動,出現開機畫面時,按下F2鍵進入到bios設置畫面中,如下圖所示為戴爾筆記本開機啟動畫面:
接著,進入到bios設置菜盯雀吵單後,使用鍵盤上的左右方向鍵將菜單欄移動到Boot欄目,我們會看到從上到下6個不同的啟動項設置,排在越上面的則為電腦開機時優先執行的凱侍啟動項,如下圖所示:
然後,我們將游標移動到位居第一的啟動項Hard Drive,按下回車鍵後,尋找並移動到USB Storage Device啟動項,此項對應的正是我們的u盤啟動盤,如下圖所示:
按下回車鍵後,我們歲咐會看到USB Storage Device就位於了首位,而Hard Drive則跑到了3rd Boot Priority的位置,最後我們按下鍵盤上的F10鍵保存所做的修改,在電腦重啟後則會自動引導啟動我們所插入的u盤:
『柒』 linux設置開機自啟動
linux設置開機自啟動執行命令 :
執行命令 : 編輯"/etc/rc.local",添加你想開機運行的命令
運行程序腳本 :然後在文件最後一行添加要執行程序的全路徑。
例如,每次開機時要執行一個hello.sh,這個腳本放在/usr下面,那就可以在"/etc/rc.local"中加一行"/usr/./hello.sh",或者" cd /opt && ./hello.sh "
注意,你的命令應該添加在:exit 0 之前
linux在「/etc/rc.d/init.d」下有很多的文件,每個文件都是可以看到內容的,其實都是一些shell腳本或者可執行二進制文件 Linux開機的時候,會載入運行/etc/init.d目錄下的程序,因此我們可以把想要自動運行的腳本放到這個目錄下即可。系統服務的啟動就是通過這種方式實現的。
簡單的說,運行級就是操作系統當前正在運行的功能級別。
例:在Ubuntu/den里,可以使用update-rc.d命令來把示例腳本:/etc/init.d/proxy安裝到各個runlevel中。
update-rc.d後面有三個參數,分別是/etc/init.d下的腳本名字,默認安裝方式,運行的優先順序。優先順序的數字越大,表示越遲運行,這里我們把自己寫的服務放在最後運行。
如果要卸載隨機啟動的服務,執行
在update-rc.d安裝的時候提示了警告信息,是因為我們寫的/etc/init.d/proxy太簡陋了,只包含了我們想要的命令,連LSB的信息也沒有提供。
只需要對自啟動腳本做一些小改動,就可以避免那個警告了。如下:
到此,一個最簡單的隨機啟動服務寫好了,看起來文章挺長的,但其實也就幾個命令而已。 在下次開機啟動的時候,proxy.py就會以root用戶身份被自動運行。
在/etc/init.d下新建示例腳本文件(startTest.sh),該腳本會啟動/opt/test.sh。內容如下:
寫了腳本文件之後事情還沒有完,繼續完成以下幾個步驟:
『捌』 Linux系統啟動及定製過程
CentOS的啟動流程總體順序如下:
POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 載入rootfs --> switchroot --> /sbin /init --> (配置文件:/etc/inittab, /etc/init/*.conf) --> 根據init配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 開啟或關閉用戶選定的對應運行級別下所對應的服務 --> 啟動終端,列印登錄提示符。
註:前面加粗部分代表內核空間的系統啟動流程,後面未加粗部分代表用戶空間的系統啟動流程。
第一步:硬體啟動過程
POST加電自檢
主要實現的功能是檢測各個外圍硬體設備是否存在而且能夠正常運行起來,實現這一自檢功能的是固化在主板上的ROM(主要代表為CMOS)晶元上的BIOS(Basic Input/Output System)程序;例如BIOS會檢測CPU、Memory以及I/O設備是否能夠正常運行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動去載入ROM晶元上的BIOS程序,是這樣來實現的。而檢測完成之後就進行硬體設備的初始化。
選擇啟動設備以載入MBR
主要實現的功能是選擇要啟動的硬體設備,選擇了之後就可以讀取這個設備上位於MBR里頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啟動順序的設定,BIOS自己會依次掃描各個引導設備,然後第一個被掃描到具有引導程序(bootloader)的設備就被作為要啟動的引導設備。
MBR(Main Boot Record),是硬碟的0柱面,0磁軌、1扇區(第一個扇區),稱為主引導扇區,也稱為主引導記錄。它由三部分組 成:主引導程序(BootLoader)、硬碟分區表DPT(Disk Partition table)和硬碟有效標志(55AA)。
註:硬碟默認一個扇區大小為512位元組。
第一部分,主引導程序(BootLoader)佔446個位元組,負責從活動分區中裝載,並運行系統引導程序。
第二部分,硬碟分區表DPT佔64個位元組,有4個分區表項,每個分區表項佔16個位元組,硬碟中分區有多少以及每一個分區的大小都記 錄在其中。
第三部分,硬碟有效標志,佔2個位元組,固定為55AA。如果這個標志位0xAA55,就認為這個是MB
第二步:GRUB引導階段
不同的系統有不同的主引導程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系統)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。GRUB程序載入執行並引導kernel(內核)程序,其中有三個階段,Grub引導階段的文件都在/boot/grub/目錄下。
stage1: 這一階段執行的就是系統安裝時預先寫入到MBR的Bootloader程序,即是存放在MBR的前446位元組里的程序。它的任務僅是讀取(載入)硬碟的0柱面,0磁軌,2扇區的內容(/boot/grub/stage1)並執行。
stage1.5: 這一階段是Stage1階段和Stage2階段的橋梁,功能是載入stage2所在分區的文件系統驅動,讓stage1中的bootloader能識別stage2所在分區的文件系統,此後grub程序便有能力去訪問/boot/grub/stage2。
stage2: 這一階段讀取並解析grub的配置文件/boot/grub/grub.cnf,根據配置文件載入內核鏡像到內存中,通過initrd程序建立虛擬根文件系統,最後調用(轉交)內核。
第三步:內部引導階段
載入內核,核心開始解壓,啟動一些最核心的程序。為了讓內核足夠的輕小,硬體驅動並沒放在內核文件裡面。系統僅探測可識別到的所有硬體設備,載入硬體驅動程序,即載入真正的根文件系統所在設備的驅動程序(有可能會藉助於ramdisk載入驅動),以只讀方式掛載根文件系統,運行用戶空間的第一個應用程序:/sbin/init。
第四步:init初始化階段(系統初始化階段)
雖然CentOS 5、CentOS 6以及CentOS 7的/etc/init配置文件內容各不相同,但總體的啟動流程相同:/sbin/init --> 根據/etc/inittab配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 關閉或啟動用戶選定的默認運行級別所對應的服務 。
對於CentOS 5來說,初始化程序init是SysV init,其配置文件為:/etc/inittab; 對於CentOS 6來說,初始化程序init是upstart,其配置文件為:/etc/inittab, /etc/init/ .conf,也就是upstart將配置文件拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置文件,而/etc/inittab僅用於設置默認運行級別; 對於CentOS 7來說,初始化程序init是systemd,其配置文件:/usr/lib/system/systemd/, /etc/systemd/system/ ;
具體執行過程:/sbin/init程序會讀取/etc/inittab文件確認運行級別,然後執行/etc/rc.d/rc腳本,根據確認的運行級別啟動對應/etc/rc.d/rc#.d/目錄下的服務(#為0~6),與此同時執行系統初始化腳本/etc/rc.sysinit(軟鏈接,指向/etc/rc.d/rc.sysinit),還會載入/etc/rc.local(軟鏈接,指向/etc/rc.d/rc.local文件)用戶自定義服務(腳本)。
CentOS7中初始化進程變為了systemd,systemd即為system daemon,是Linux下的一種init軟體,開發目標是提供更優秀的框架以表示系統服務間的依賴關系,並依此實現系統初始化時服務的並行啟動,同時達到降低Shell系統開銷的效果,最終代替現在常用的System V與BSD風格的init程序。與多數發行版使用的System V風格的init相比,systemd採用了以下的新技術:A.採用Socket激活式與匯流排激活式服務,以提高相互依賴的各服務的並行運行性能;B.用Cgroup代替PID來追蹤進程,即使是兩次fork之後生成的守護進程也不會脫離systemd的控制。
第五步:啟動終端
根據前面獲取的運行級別來啟動終端,mingetty程序是用於啟動終端的,它會調用登錄程序login,這樣就能顯示出登錄提示符了,類似mingetty這種用於打開終端的程序還有getty等。而如果默認運行級別為5,則會打開圖形界面。
第一步:硬體啟動過程
這一步和CentOS6差不多,詳細請看1.1內容。
第二步:GRUB引導階段
從這一步開始,CentOS6和CentOS7的啟動流程區別開始展現出來了。CentOS7的主引導程序使用的是grub2,執行過程是先載入boot.img、core.img兩個鏡像,再載入MOD模塊文件,把grub2程序載入執行,接著解析配置文件/boot/grub/grub.cfg,根據配置文件載入內核鏡像到內存,之後構建虛擬根文件系統,最後轉到內核。
CentOS7中使用命令進行配置,而不直接去修改配置文件了。grub.cfg配置文件開頭注釋部分說明了由/etc/grub.d/目錄下文件和/etc/default/grub文件組成。改好配置後都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,將配置文件重新生成。
第三步:內部引導階段
這一步與CentOS6也差不多,載入驅動,切換到真正的根文件系統,唯一不同的是執行的初始化程序變成了/usr/lib/systemd/systemd。
第四步:init初始化階段(系統初始化階段)
CentOS7中我們的初始化進程變為了systemd。執行默認target配置文件/etc/systemd/system/default.target(這是一個軟鏈接,與默認運行級別有關)。然後執行sysinit.target來初始化系統和basic.target來准備操作系統。接著啟動multi-user.target下的本機與伺服器服務,並檢查/etc/rc.d/rc.local文件是否有用戶自定義腳本需要啟動。最後執行multi-user下的getty.target及登錄服務,檢查default.target是否有其他的服務需要啟動。
注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目錄下的graphical.target或multiuser.target。而graphical.target依賴multiuser.target,multiuser.target依賴basic.target,basic.target依賴sysinit.target,所以倒過來執行。
unit對象:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其他與init相關的信息。(也就是CentOS6中的伺服器啟動腳本)
第五步:啟動終端
systemd執行sysinit.target
systemd啟動multi-user.target下的本機與伺服器服務
systemd執行multi-user.target下面的/etc/rc.d/rc.local
Systemd執行multi-user.target下的getty.target及登錄服務
getty.target是啟動終端的systemd對象。如果到此步驟,系統沒有指定啟動圖形桌面,到此就可以結束了,如果需要啟動圖形界面,要在此基礎上啟動桌面程序。
從 CentOS 7 版本之後,系統開始用 systemd 實現init進程,系統啟動和伺服器守護進程管理器功能,負責在系統啟動或運行時,激活系統資源,伺服器進程和其它進程。
unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息。
3.2 system unit文件格式
/usr/lib/systemd/system:發行版打包者使用,每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/
/etc/systemd/system:系統管理員和用戶使用,管理員建立的執行腳本,類似於/etc/rcN.d/Sxx的功能,比上面目錄優先運行
/lib/systemd/system::ubutun的對應目錄
/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
unit 格式說明:
service unit file文件通常由三部分組成:
Unit段的常用選項:
Service段的常用選項:
Install段的常用選項:
注意:對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啟。
首先在啟動界面按e編輯啟動參數,
將ro參數更改為rw init=/sysroot/bin/sh,按ctr + x啟動系統
按下圖執行命令更改root密碼
『玖』 Linux如何啟動流程Linux啟動流程詳解
當用戶打開電源後,BIOS開機自檢,確定啟動設備,安裝啟動設備,啟動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,通過跟切換,執行init程序,init程序確定啟動級別,根據啟動級別進行系統初始化和運行的服務,然後返回init啟動終端,用戶通過驗證成功登陸Shell,這就是一個從開機到登陸的啟動過程。
一、硬體引導啟動
當用戶打開電源後POST開始自檢,檢測硬體設備是否確實或者存在故障(是否影響正常開機),如果不影響正常開機,就把任務交給BIOS。BIOS通過搜索,安裝啟動確定啟動設備,啟動項為硬碟,BIOS去讀取硬碟的前512位元組到內存,找到BootLoader,確定GRUB
二、GRUB引導啟動內核
這一部分概況起來就是:GRUB程序載入執行並開始引導kernel程序
Boot Loader就是在操作系統內核運行之前運行的一小段程序。通過GRUB引導可以確定內核程序,因為引導扇區只有446位元組,GRUB只是一個小的程序安裝在裡面,真正使用的在MBR後面的扇區存放,我們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和載入配置選項分為三個階段
Stage1階段:
Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。
Stage1階段的任務僅是將硬碟0柱面0磁軌2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。 在此Stage1階段,還沒有識別文件系統的能力。
Stage1.5階段:
stage1.5階段是stage1階段和stage2階段的中間橋梁。stage1.5階段具有識別啟動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。
Stage2階段
Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啟動菜單。然後載入內核鏡像到內存中,通過initrd程序建立RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。
三、內核引導啟動
這一部分主要是通過在內存中建立虛擬根文件系統實現相關設備的驅動並建立和切換到真正的根文件系統。
解壓內核鏡像載入到內存,以及initrd程序建立RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬體,並調用虛擬根文件系統中的init程序載入驅動模塊初始化系統中各種設備的相關配置工作,其中包括CPU、I/O、存儲設備等。當所需的驅動程序載入完後,會根據grub.conf配置文件中「root=XXX」部分所指定的內容創建一個根設備,然後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的/sbin/init程序,進入系統初始化階段。
四、系統初始化
這一步是通過/sbin/init,init程序准備軟體運行壞境,啟動系統服務
通過/etc/inittab文件確定運行級別,然後去執行系統初始化腳本/etc/rc.sysinit,為用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啟動服務,關閉那些不要的服務(裡面S99local -> ../rc.local)用戶自動服務啟動腳本
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網路功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel ; who -r
五、啟動終端,用戶登錄
這一步是用戶登錄shell過程
如果沒有改變級別,默認情況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,核對密碼。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啟動這個shell。更多Linux介紹請查看《Linux就該這么學》。
『拾』 Linux裡面init 6是什麼意思
就是重啟電腦的意思,具體命令查看《Linux就該這么學》
init命令 – 切換系統運行級別
重啟伺服器:
# init 6
語法格式:init [參數]
常用參數:
0 關機
1 單用戶
2 多用戶
3 完全多用戶模式
5 圖形界面
6 重啟