A. 嵌入式linux的bootloader的啟動流程是怎樣的
嵌入式 Linux 系統從軟體角度看可以分為四個部分:引導載入程序(Bootloader), Linux 內核,文件系統,應用程序。
當系統首次引導時,或系統被重置時,處理器會執行一個位於Flash/ROM中的已知位置處的代碼,Bootloader就是這第一段代碼。它主要用來初始化處理器及外設,然後調用 Linux 內核。Linux 內核在完成系統的初始化之後需要掛載某個文件系統作為根文件系統(Root Filesystem),然後載入必要的內核模塊,啟動應用程序。這就是嵌入式Linux系統啟動過程 Linux 引導的整個過程。
Bootloader 的啟動方式:
網路啟動方式。這種方式的開發板不需要較大的存儲介質,跟無盤工作站有點類似,但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過乙太網介面遠程下載Linux內核映像或者文件系統。Bootloader下載文件一般都使用TFTP網路協議,還可以通過DHCP的方式動態配置IP地址。
硬碟啟動方式
傳統的Linux系統運行在台式機或者伺服器上,這些計算機一般都使用BIOS引導,並使用磁碟作為存儲介質。Linux傳統上是LILO (Linux Loader) 引導,後來又出現了GUN的軟體 (Grand Unified Bootloader) 。 這兩種Bootloader廣泛應用在X86的Linux系統上。
Flash啟動方式。大多數嵌入式系統上都使用Flash存儲介質。Flash有很多類型,包括NOR Flash、NAND Flash和其它半導體盤。它們之間的不同在於: NOR Flash 支持晶元內執行(XIP, eXecute In Place),這樣代碼可以在Flash上直接執行而不必拷貝到RAM中去執行。而NAND Flash並不支持XIP,所以要想執行 NAND Flash 上的代碼,必須先將其拷貝到 RAM中去,然後跳到 RAM 中去執行。NOR Flash 使用最為普遍。Bootloader一般放在Flash的底端或者頂端,這需要根據處理器的復位向量來進行設置。可以配置成MTD設備來訪問Flash分區。
B. 下面關於RED HAT LINUX 9操作系統的啟動過程。正確的順序為
2-5-3-1-4-6
C. 如何修復Linux引導
多種方式安裝Linux系統
1. 製作安裝啟動盤
方法一、在DOS/Windows下製做
G:\dosutils> rawrite
Enter dis image source file name:bootdisk.img
Enter target diskette drive:a
Please insert a formatted diskette into drive A:and press –ENTER--:[Enter]
注:光碟\images\有以下幾個IMG文件
l bootdisk.img 安裝引導盤映像文件
l drvnet.img 網卡驅動盤
l drvblock.img 塊設備驅動盤
l pcmciadd.img PCMCIA設備驅動盤
方法二、在Linux下製做啟動盤
#dd if=boot.img of=/dev/fd0 bs=1440
2. 光碟安裝Linux系統
(1)使用1#光碟啟動計算機
(2)直接按回車鍵/linux text選擇安裝界面
(3)開始安裝向導
3. 硬碟安裝Linux系統
(1)將安裝光碟的ISO文件復制到硬碟的某個分區中
(2)利用1#光碟/安裝啟動盤啟動計算機
(3)輸入linux askmethod選擇安裝介質
(4)開始安裝向導
4. FTP/HTTP安裝Linux系統
(1)准備安裝文件,製作HTTP/FTP伺服器
(2)利用1#光碟/安裝啟動盤啟動計算機
(3)輸入linux askmethod選擇安裝介質
(4)開始安裝向導
二.啟動linux系統
1.Linux啟動過程分析
(1)BIOS自檢
l 硬體檢測及初始化
l 引導啟動設備
(2)引導啟動設備
l 軟盤(0磁軌第一個扇區)
l 光碟(最外圍存儲軌道)
l 硬碟(MBR)
l USB存儲設備
(3)調用Linux引導程序至內存中
l Linux的引導程序可以使用GRUB/LILO等引導軟體
l GRUB/LILO可以安裝在MBR/引導分區的引導扇區中
(4)運行Linux內核
l 內核放在/boot目錄中,Linux系統可以同時支持多版本內核
l 解壓縮內核
l 檢測硬體
l 載入root文件系統
(5)執行init進程
l 啟動新進程或關閉進程
l 選擇啟動模式
l 建立虛擬終端
(6)用戶登錄
l 輸入用戶名及口令
l 載入用戶配置文件
l 載入shell程序
2.引導盤的創建
方法一:安裝過程中創建
方法二:mkbootdisk
#mkbootdisk --device /dev/fd0 2.4.20-8
方法三:使用dd命令
# dd if=/boot/vmlinuz of=/dev/fd0
3.GRUB
(1)安裝GRUB
l 安裝軟體包
#rpm –ivh grub-0.934.i386.rpm
l 使用安裝命令安裝GRUB到MBR
#grub
grub>root (hdx,y)
grub>setup (hdx[,y])
(2)GRUB的配置
#vi /boot/grub/grub.conf
grub.conf中常用的配置命令有:
default=菜單項序號/saved
設置啟動菜單的默認啟動項
hiddenmenu
隱藏菜單界面
splashimage =圖像文件全路徑名
指定某文件作為啟動菜單的背景圖像
timeout=延遲秒數
設置啟動菜單的啟延時
title 菜單項名稱
開始一個菜單項的配置,設置菜單項的名稱
root (hdx,y)
設置GRUB的根設備為linux內核所在的分區
kernel 內核文件名稱
指定內核文件的名稱及載入內核所需的參數
initrd initrd文件名
指定鏡像文件的位置
map (hdx[,y]) (hdx[,y])
建立虛擬磁碟
rootnoverify (hdx,y)
指定windows啟動引導器的位置
makeactive
標識指定分區為活動分區
chainloader +n/文件名稱
調用指定windows啟動文件
password 口令/--md5 口令密文
設置GRUB啟動菜單和菜單項口令
lock
利用password設置的全局口令鎖定菜單項
savedefault
保存當前啟動菜單項為默認啟動
文件實例:
# grub-md5-crypt(產生口令的MD5密文)
# vi /etc/grub.conf
default=0
timeout=50
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 #!dfdasdf34123!#@$!#@
title RedHat Linux 9.0
root (hd0,2)
kernel /Vmlinuz-2.4.20-8 ro root=/LABEL=/
initrd /initrd-2.4.20-8.img
password linux
tile windows 2000
rootnoverify (hd0,0)
chainloader +1
lock
(3)GRUB的FAQ
l 編輯模式的使用
用於臨時修改菜單的選項,在菜單界面中按E鍵進入
l 命令行模式的使用
利用命令行命令設置GRUB,在菜單界面中按C鍵進入
grub命令行中常用的命令有:
grub>root (hdx,y) //設置根設備所對應的分區
grub>kernel 內核文件 //設置內核文件的名稱
grub>initrd 鏡像文件名 //設置鏡像文件名
grub>boot //啟動指定操作系統
grub>rootnoveify (hdx,y) //設置根設備所對應的分區,但不檢查載入點
grub>chainloader 文件名 //載入指定的文件
grub>help //獲取幫助
grub>reboot //重啟系統
grub>md5-crypt //生成口令的MD5密文
grub>setup (hdx[,y]) //安裝GURB到MBR/指定分區的引導扇區中
grub>hide 分區 //隱藏分區
grub>cat 文件名 //顯示文件內容
grub>find 文件名 //查找文件
l 如果MBR中的GRUB引導程序被其它程序覆蓋,應該如該恢復
放入第一張安裝啟動盤,開始啟動計算機:boot:linux rescue(啟動linux的修復模式,載入硬碟上的LINUX系統到/mnt/sysimage)
#grub
grub>root (hdx,y)
grub>root (hdx)
l 恢復GRUB的配置文件
由於grub.conf設置的問題,可以採用以下方法進行恢復:
放入第一張安裝啟動盤,開始啟動計算機:boot:linux rescue(啟動linux的修復模式)
#vi /mnt/sysimage/boot/grub/grub.conf
l 如何利用GRUB進入單用戶模式,找回丟失的root用戶口令
在GRUB菜單界面中按e編輯linux菜單項,給內核添加參數single
l 如何卸載GRUB
#rpm -e grub
C:\>fisk/mbr
l 如何製作GRUB啟動盤
#grub-install /dev/fd0
3.init 進程
(1)init進程的作用
init進程是系統啟動第一個進程,它負責載入其它進程、管理系統的其它進程。
(2)init的配置-----inittab文件
/etc/inittab文件用於設置init進程在執行時載入哪些程序,inittab文件由若干個記錄構成,每條記錄格式如下:
ID:RUNLEVEL:ACTION:COMMAND
以下為默認inittab文件內容:
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 「power failure;power shutting down」
pr:12345:powerokwait:/sbin/shutdown –c 「power restored;shutdown cancelled」
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
說明:
(3) 修改/etc/inittab文件,可以設置默認啟動模式、各運行級別所載入的程序、CTRLALTDEL的動作、開設虛擬用戶終端
(4)/etc/rc.d 的目錄內容
1)/etc/rc.d/init.d目錄
l 保存所有運行等級需要的所有腳本
l 啟動、停止、重啟某些服務
2)/etc/rc.d/rc
l 系統改變運行等級,通過此腳本檢查/etc/rc.d/rcX.d目錄和文件可存在,以及是否正在運行等,以及運行/etc/rc.d/rcX.d中所有S開頭的腳本
3)/etc/rc.d/rcX.d目錄
l 存放每一運行等級默認啟動項,該目錄中的文件鏈接到:/etc/rc.d/init.d
l 文件名格式為K{Two-digit number} {script name}/S{Two-digit number} {script name},K:以stop參數運行,S:以start參數運行;Two:數字代表執行順序
4)/etc/rc.d/rc.local
l 該腳本在2,3,5運行等級結束時執行
5)/etc/rc.d/rc.sysinit
l 系統初始腳本,用於設置系統的時鍾、載入鍵盤、載入系統字體、載入其他文件系統、激活交換分區、生成日誌文件
三.linux系統修復模式
1. 系統修復模式的簡介
使用安裝光碟啟動修復模式,用於檢測和載入硬碟上已安裝的linux系統到/mnt/sysimage目錄中。該模式主要用於修復損壞的系統,當系統出現故障時可使用修復模式.
2.啟動修復模式
使用1#安裝啟動系統
在boot:提示符下輸入linux rescue啟動修復模式,按照啟動向導啟動系統
linux修復模式的應用
修復系統
找加丟失的用戶口令
修復系統配置
D. linux系統如何引導步驟
Linux系統的啟動過程並不是大家想像中的那麼復雜,其過程可以分為5個階段:
內核的引導。
運行 init。
系統初始化。
建立終端 。
用戶登錄系統。
E. linux最原始進程是什麼
linux的啟動過程:
開機加電自檢→MBR引導→GRUB菜單→內核(kernel)→init進程→配置/etc/inittab
/etc/inittab的配置包括2部分
→ 一個是執行腳本/etc/rc.d/rc.sysinit
→ 另一個是腳本/etc/rc.d/rc
配置完成後啟動mingetty進程
你問的最原始進程應該是init進程。
F. linux內核模塊如何開始和結束
GRLB 載入了內核之後,內核首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬體信息。這時內核終於開始替代 BIOS 接管Linux的啟動過程了。
內核完成再次系統自檢之後,開始採用動態的方式載入每個硬體的模塊,這個動態模塊大家可以想像成硬體的驅動(默認 Linux 硬體的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到內核當中;如果是非重要的功能,比如硬體驅動會編譯為模塊,則在需要時由內核調用。不過,如果沒有被內核硬體,要想驅動,就需要手工安裝個硬體的硬塊了。具體的安裝方法會在後續章節中介紹)。
那麼,Linux 的內核到底放在了哪裡呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。
[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
#內核的配置文件,內核編譯時選擇的功能與模塊
efi
#可擴展固件介面,為英特爾為全新PC固件的體系結構、介面和服務提出的建議標准
grub
#啟動引導程GTUB的數據目錄
initramfe-2.6.32-279.el6.i686.img
#虛擬文件系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分區的備份目錄
symvers-2_6.32-279.el6.i686.gz
#模塊符號信息
System.map-2.6.32-279.el6.i686
#內核功能和內存地址的對應列表
vmlinuz-2.6.32-279.el6.i686
#用於啟動的Linux內核。這個文件是一個壓縮的內核鏡像
我們已經知道,Linux 會把不重要的功能編譯成內核模塊,在需要時再調用,從而保證了內核不會過大。在多數 Linux 中,都會把硬體的驅動程序編譯為模塊, 這些模塊保存在 /lib/moles/ 目錄中。常見的 USB、SATA 和 SCSI 等硬碟設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。
如果 Linux 安裝在 IDE 硬碟之上,並且採用的是默認的 ext3/4 文件系統,那麼內核啟動後載入根分區和模塊的載入都沒有什麼問題,系統會順利啟動。但是如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 文件系統,那麼內核(內核載入入內存是啟動引導程序 GRUB 調用的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 文件系統的驅動的。
SCSI 硬碟和 LVM 文件系統的驅動都放在硬碟的 /lib/moles/ 目錄中,既然內核沒有辦法識別 SCSI 硬碟或 LVM 文件系統,那怎麼可能讀取 /lib/moles/ 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬文件系統來處理這個問題。
initramfe虛擬文件系統
CentOS 6.x 中使用 initramfs 虛擬文件系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動引導程序載入到內存中,然後會解壓縮並在內存中模擬成一個根目錄,並且這個模擬的文件系統能夠提供一個可執行程序,通過該程序來載入啟動過程中所需的內核模塊,比如 USB、SATA. SCSI 硬碟的驅動和 LVM、RAID 文件系統的驅動。
也就是說,通過 initramfs 虛擬文件系統在內存中模擬出一個根目錄,然後在這個模擬根目錄中載入 SCSI 等硬體的驅動,就可以載入真正的根目錄了,之後才能調用 Linux 的第一個進程 /sbin/init。
Initramfs 虛擬文件系統主要有以下優點:
initramfs 隨著其中數據的増減自動増減容量。
在 initramfs 和頁面緩存之間沒有重復數據。
initramfs 重復利用了 Linux caching 的代碼,因此幾乎沒有増加內核尺寸,而 caching 的代碼已經經過良好測試,所以 initramfs 的代碼質量也有保證。
不需要額外的文件系統驅動。
其實大家只需要知道 initramfs 是為了在內核中建立一個模擬根目錄,這個模擬根目錄是為了可以調用 USB、SATA、SCSI、LVM、RAID 等硬碟介面或文件系統的驅動模塊,載入了驅動模塊後才可以載入真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。
[root@localhost~]#mkdir/tmp/initramfs
#建立測試目錄
[root@localhost~]#cp/boot/
initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
#復制initramfs文件
[root@localhost~]#cd/tmp/initramfs/
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:gzipcompressed
data,fromUnix,lastmodified:
WedApr1021:49:342013,maxcompression
#查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包
[root@localhostinitramfs]#mvinitramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
#修改文件的擴展名為.gz
[root@localhostinitramfs]#gunzip
initramfs-2.6.32-279.el6.i686.img.gz
#解壓縮
[root@localhostinitramfs]#ls
initramfs-2.6.32-279.el6.i686.img
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:ASCIIcpioarchive(SVR4withnoCRC)
#查看文件類型,使用cpio命令的壓縮文件
[root@localhostinitramfs]#cpio-ivc<initramfs-2.6.32-279.el6.i686.img
#解壓縮
[root@localhostinitramfs]#ll
總用量34512
drwxr-xr-x.2rootroot40964月2412:10bin
drwxr-xr-x.2rootroot40964月2412:10cmdline
drwxr-xr-x.3rootroot40964月2412:10dev
-rw-r--r--.1rootroot194月2412:10dracut-004-283.el6
drwxr-xr-x.2rootroot40964月2412:10emergency
drwxr-xr-x.7rootroot40964月2412:10etc
-rwxr-xr-x.1rootroot89624月2412:10init
drwxr-xr-x.2rootroot40964月2412:10initqueue
drwxr-xr-x.2rootroot40964月2412:10initqueue-finished
drwxr-xr-x.2rootroot40964月2412:10initqueue-settled
drwxr-xr-x.2rootroot40964月2412:10
initqueue-timeout
-rw-r--r--.1rootroot352353284月2412:09initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x.9rootroot40964月2412:10lib
…省略部分輸出…
#這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像
關機或者某些進程停止,對應的內核模塊就會結束。更多知識請網路《Linux就該這么學》
G. Linux之三Linux的啟動過程/關機
man ls
man pages手冊頁
顯示說明
數字說明
Ctrl+Alt+F1/F2......F6
Ctrl+Alt+F7,回到圖形化界面
who,看看那幾個tty連接著
Linux系統有7個運行級別(runlevel):常用的是3和5
運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動
運行級別1:單用戶工作狀態,root許可權,用於系統維護,禁止遠程登陸
運行級別2:多用戶狀態(沒有NFS),沒有網路服務
運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制台命令行模式
運行級別4:系統未使用,保留
運行級別5:X11表示控制台,進入圖形界面
運行級別6:系統正常關閉並重啟,默認運行級別不能設為6,否則不能正常啟動
運行級別
接通電源BIOS自檢,按照BIOS中設置的啟動設備(通常是硬碟)來啟動,操作系統接管硬體以後,
首先讀入 /boot 目錄下的內核文件。
init 進程是系統所有進程的起點,你可以把它比擬成系統所有進程的老祖宗,沒有這個進程,系統中任何進程都不會啟動。
init 程序首先是需要讀取配置文件 /etc/inittab
許多程序需要開機啟動。它們在Windows叫做"服務"(service),在Linux就叫做"守護進程"(daemon)。
init進程的一大任務,就是去運行這些開機啟動的程序。
但是,不同的場合需要啟動不同的程序,比如用作伺服器時,需要啟動Apache,用作桌面就不需要。
Linux允許為不同的場合,分配不同的開機啟動程序,這就叫做"運行級別"(runlevel)。
也就是說,啟動時根據"運行級別",確定要運行哪些程序。
============================================================
Linux系統有7個運行級別(runlevel):
運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動
運行級別1:單用戶工作狀態,root許可權,用於系統維護,禁止遠程登陸
運行級別2:多用戶狀態(沒有NFS)
運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制台命令行模式
運行級別4:系統未使用,保留
運行級別5:X11控制台,登陸後進入圖形GUI模式
運行級別6:系統正常關閉並重啟,默認運行級別不能設為6,否則不能正常啟動
在init的配置文件中有這么一行: si::sysinit:/etc/rc.d/rc.sysinit它調用執行了/etc/rc.d/rc.sysinit,
而rc.sysinit是一個bash shell的腳本,它主要是完成一些系統初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本
它主要完成的工作有:激活交換分區,檢查磁碟,載入硬體模塊以及其它一些需要優先執行任務
rc執行完畢後,返回init。這時基本系統環境已經設置好了,各種守護進程也已經啟動了。
init接下來會打開6個終端,以便用戶登錄系統。在inittab中的以下6行就是定義了6個終端:
一般來說,用戶的登錄方式有三種:
(1)命令行登錄
(2)ssh登錄
(3)圖形界面登錄
在linux領域內大多用在伺服器上,很少遇到關機的操作。畢竟伺服器上跑一個服務是永無止境的,除非特殊情況下,不得已才會關機 。
正確的關機流程為:sync > shutdown > reboot > halt
sync 將數據由內存同步到硬碟中
shutdown –h 10 『This server will shutdown after 10 mins』 這個命令告訴大家,計算機將在10分鍾後關機,並且會顯示在登陸用戶的當前屏幕中
Shutdown –h now 立馬關機
Shutdown –r now 系統立馬重啟
reboot 就是重啟,等同於 shutdown –r now
halt 關閉系統,等同於shutdown –h now 和 poweroff
最後總結一下,不管是重啟系統還是關閉系統,首先要運行sync命令,把內存中的數據寫到磁碟中。
重新安裝系統嗎?當然不用!進入單用戶模式更改一下root密碼即可。
1 重啟Linux,見到下圖,在3秒鍾之內按下回車
2 三秒之內要按一下回車,出現如下界面
3 按下e鍵就可以進入下圖
4 移動到下一行,再次按e鍵
5 移動到下一行,進行修改
修改完成後回車鍵,然後按b鍵進行重新啟動進入系統
6 移動到下一行,進行修改
最終修改完密碼,reboot一下即可。
H. linux開機自啟動,如何跳過開機動畫
某個程序方便後續的管理;那麼我們如何在開機時候,運行此賬戶安裝的程序呢?例如:以linux下指定mycount用戶在linux開機時執行/home/sun/startXX.sh為例:
以root登錄linux
執行vi /etc/rc.d/rc.local
在文檔末尾添加一行語句:su – mycount -c 「/home/sun/startXX.sh」
保存rc.local即可。
這個地方一定要注意 su – 這個是環境的變數也會做相應的轉換;如果環境變數沒有改變的話,我們用su 就可以了。
二、
在Linux中以普通用戶開機自動運行腳本程序
測試環境:CentOS6.5
管理員:root
普通用戶:test1
實現目標:在Linux啟動時,以普通用戶test1自動運行位於根目錄下的腳本程序test.py,該程序會在每次執行時自動向本地日誌文件追加一條記錄,源碼如下:
from datetime import datetime
now=datetime.now()
f=open(『test.log』,』a』)
f.write(『%s 『%now)
f.close()
Linux在啟動時,會自動執行/etc/rc.d目錄下的初始化程序,因此我們可以把啟動任務放到該目錄下,有兩種辦法:
方案一:
1、因為其中的rc.local是在完成所有初始化之後執行,因此我們可以把啟動腳本寫到裡面
2、用root賬號登陸Linux,vi /etc/rc.d/rc.local編輯文件,在最後加入兩行需要執行的腳本程序:
cd /home/test1 –該步不可少,否則會提示沒有許可權打開』test.log』文件
su test1 -c 「python /home/test1/test.py」 –把要執行的命令作為一個參數傳遞級su
方案二:
1、init.d目錄下都為可執行程序,他們其實是服務腳本,按照一定格式編寫,Linux 在啟動時會自動執行,類似Windows下的服務
2、用root帳號登錄,vi /etc/rc.d/init.d/mystart,追加如下內容:
復制代碼
#!/bin/bash
#chkconfig:2345 80 05 –指定在哪幾個級別執行,0一般指關機,
6指的是重啟,其他為正常啟動。80為啟動的優先順序,05為關閉的優先機
#description:mystart service
RETVAL=0
start(){ –啟動服務的入口函數
echo -n 「mystart serive …」
cd /home/test1
su test1 -c 「python /home/test1/test.py」
}
stop(){ –關閉服務的入口函數
echo 「mystart service is stoped…」
}
case $1 in –使用case,可以進行互動式操作
start)
start
;;
stop)
stop
;;
esac
exit $RETVAL
復制代碼
3、運行chmod +r /etc/rc.d/init.d/mystart,使之可直接執行
4、運行chkconfig –add mystart,把該服務添加到配置當中
5、運行chkconfig –list mystart,可以查看該服務進程的狀態
總結:
兩種方案的的核心都是切換用戶到test1,然後執行命令啟動Python程序,做成服務的好處是可以定義多個交互命令,比如:start,stop,restart,reset…,在服務運行的過程中還可以做相應操作。最開始的時候,我按照一般的思路寫了如下腳本,卻怎麼也執行不了:
su test1 –切換到test1用戶
cd /home/test1 –切換到根目錄
python test.py –執行python程序
exit –退出test1帳號
看起來好象一切都沒錯,但是發現只運行了第一行的命令,後面的都沒有運行,直到退出test1用戶後才發現好象執行完畢。分析原因,是因為Linux啟動的時候是在root帳號下,執行su test1等於打開了一個新的shell腳本,因此下面的代碼都在等著新的Shell腳本結束才能運行,就象在主程序里調用了一個子程序,而子程序是個死循環,一下出來來結果下面的要等死了。知道了發生的原因,那麼解決的辦法就相對簡單了,就是在執行上述腳本程序時,不要離開本身的Shell。我們可以把執行命令做為su的一個參數傳遞進去,因為沒有涉及到打開新的Shell,因此可以正常執行你期望的腳本程序,順利實現開機自動啟動指定的腳本程序。
執行方案中重要的一個命令是:
[root@localhost ~]# whoami
root
[root@localhost ~]# su – keysystem -c 「whoami」
keysystem
[root@localhost ~]#
以keysystem用戶執行whoami的命令:
[root@localhost ~]# su – keysystem -c 「whoami」
文章知識點與官方知識檔案匹配
CS入門技能樹Linux入門初識Linux
23840 人正在系統學習中
打開CSDN,閱讀體驗更佳
Linux中沒有rc.local文件的完美解決方法
主要介紹了Linux中沒有rc.local文件的解決方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
最新發布 linux 開機自啟用非root啟動
就會用djq用戶執行mkdir -p /home/djq/222命令。linux 開機自啟用非root啟動。
繼續訪問
linux開機自動執行命令或自動啟動程序(rc.local)
linux開機的最後會執行/etc/rc.local,因此可以在此腳本裡面添加shell命令自動執行或者自動啟動某個進程。 比如 自動輸出信息: #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In
繼續訪問
跳過網路啟動 linux,Linux啟動時如何跳過fsck
在Linux里,如果一個文件系統被mount過一定次數後,或者距離上次fsck超過一定天數,當系統重起時就會自動fsck。根據文件系統的大小,fsck可能需要幾分鍾甚至幾個小時。隔一段時間作一次fsck是很有必要的,但是如果你不想花費時間fsck,你也可以用如下幾種方法跳過fsck:1. 修改/etc/fstab在/etc/fstab里, 最後一列是系統啟動時fsck的順序。 文件系統 / 應該設...
繼續訪問
linux 查看root 進程,Linux查看非root運行的進程
Linux查看非root運行的進程youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps -U root -u root -NPID TTY TIME CMD663 ? 00:00:00 dbus-daemon713 ? 00:00:00 rsyslogd730 ? 00:00:00 avahi-da...
繼續訪問
linux上使用非root賬戶啟動運行java程序
事情是這樣的、、、、、、、 公司的app後台程序是java的,在linux上運行時要求必須使用非root賬戶,例如使用app用戶啟動java程序。這次運維有事請假了,所以這個小任務就交給我了,多大的事情啊,這還不是分分鍾搞定的啊。 好了一步步的開始。 第一步:創建mobile賬戶和組 groupadd app useradd -d /usr/app -g app app 第二步:搭建...
繼續訪問
linux用其他賬號停進程,Linux系統上對其他用戶隱藏進程的簡單方法
我使用的是多用戶系統,大部分的用戶通過ssh客戶端訪問他們的資源。我如何(怎麼樣)避免泄露進程信息給他們?如何(怎麼樣)在Debian/Ubuntu/RHEL/CentOS linux伺服器器上阻止/避免他們看到不屬於他們的進程?對linux上的其他用戶隱藏進程的方法解決方法/方案:如果你使用的linux kernel(內核)是3.2以上的版本(或者使用的RHEL/CentOS是6.5以上的版本)...
繼續訪問
轉:linux開機自動運行
實現目標:在Linux啟動時,自動運行位於普通用戶test1根目錄下的腳本程序test.py,該程序會在每次執行時自動向本地日誌文件追加一條記錄,源碼如下: from datetime import datetime now=datetime.now() f=open('test.log','a') f.write('%s '%now...
繼續訪問
跳過開機向導
跳過開機向導
繼續訪問
linux系統rc.local錯誤,Linux開機啟動文件rc.local無法執行的解決方法
眾所周知,rc.local是Linux系統中的一個重要的開機啟動文件,每次開機都要執行這個文件。但最近很多用戶表示系統無法執行這個問題件,從而導致了一系列的問題出現,這是怎麼回事呢?如何解決這個問題呢?下面,跟隨小編一起來看看Linux開機啟動文件rc.local無法執行的解決方法。Linux系統在Linux系統中,有一個重要的開機自動啟動腳本文件:/etc/rc.local---》/etc/rc...
繼續訪問
rc.local出錯影響ubuntu正常啟動,跳過執行rc.local
通過進入單用戶模式,跳過rc.local
繼續訪問
Linux開機啟動,設置rc.local失效解決方案
在/etc/rc.local文件夾下,添加要執行的命令,如/sbin/ifconfig docker0 mtu 1454 注意這里要使用絕對路徑/sbin/ifconfig 如果開機發現執行失敗,則需要在上一行添加sleep 10 由於ifconfig服務不一定在rc.local之前啟動,所以讓系統等待十秒hours在執行sleep 10 /sbin/ifconfig docker0 mtu 14
繼續訪問
Linux系統跳過密碼登錄
一、引導系統 RHEL7的標准引導系統是GRUB2,RHEL6默認使用GRUB1,這里主要講GRUB2。 在Linux系統開機選擇內核時,按下e進入內核引導參數的編輯菜單,找到以linux16開頭的一行,在行末添加更多的命令。例如,在行末尾添加system.unit=emergency.target,然後按Ctrl+X,則系統將會以緊急目標模式啟動。 如果在系統引導到GUI環境中出現問題,可以在內核命令行末尾加入system.unit=multi-user.target,若引導成功,則會登錄到命令行模
繼續訪問
rc.local使用非root用戶
su -aaa-c "/data/tomcat/bin/startup.sh"
繼續訪問
Linux設置非root用戶啟動程序
Linux設置非root用戶啟動程序
繼續訪問
開機自啟動非root用戶的服務
設置非root用戶的服務開機自啟動 比如:chkconfig mysql on 是無效的 可以這樣設置: 在root用戶下 vi /etc/rc.local 或者 vi /etc/rc.d/rc.local 在最後一行加上 su - mysqladmin -c "/usr/local/mysql/startMysql.sh" 其中mysqladmin是管理mysql的用戶, "/usr/loc...
繼續訪問
linux非root用戶打開80,Linux非root用戶如何使用80埠啟動程序
默認情況下Linux的1024以下埠是只有root用戶才有許可權佔用,我們的tomcat,apache,nginx等等程序如果想要用普通用戶來佔用80埠的話就會拋出java.net.BindException: Permission denied:80的異常。bind時perror提示錯誤信息:permission denied解決辦法有兩種:1.使用非80埠啟動程序,然後再用iptables...
繼續訪問
Linux在任意目錄下執行指定的腳本
前言 我有個腳本,我只能在腳本所在的文件夾下面運行,這樣的話很不方便,如果我去了別的目錄下面的話,我就無法運行這個腳本了… 解決 在profile中設置PATH, 假如我想給 xcall 腳本設置能讓在任意的目錄下去運行, 此時xcall在/root/soft/script 目錄下. 編輯環境變數 [root@zjj101 etc]# cd /etc [root@zjj101 etc]# vim profile # 上面省略........ export HIVE_HOME=/root/soft/hive
繼續訪問
Linux系統啟動過程分析
經過對Linux系統有了一定了解和熟悉後,想對其更深層次的東西做進一步探究。這當中就包括系統的啟動流程、文件系統的組成結構、基於動態庫和靜態庫的程序在執行時的異同、協議棧的架構和原理、驅動程序的機制等等。 本人在綜合了現有網上大家智慧的基礎上,結合對2.6.32的內核代碼的研讀,基於CentOS 6.0系統對Linux的啟動流程做了些分析。由於才疏學淺,知...
繼續訪問
linux跳過開機啟動項
I. LINUX、UNIX系統啟動不成功,要如何解決
A 內核引導
當計算機打開電源後,首先是BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬碟)來啟動。緊接著由啟動設備上的grub程序開始引導linux,當引導程序成功完成引導任務後,Linux從它們手中接管了CPU的控制權,然後CPU就開始執行Linux的核心映象代碼,開始了Linux啟動過程。也就是所謂的內核引導開始了,在內核引導過程中其實是很復雜的,我們就當它是一個黑匣子,反正是linux內核做了一些列工作,最後內核調用載入了init程序,至此內核引導的工作就完成了。交給了下一個主角init。
B 運行init
init
進程是系統所有進程的起點,你可以把它比擬成系統所有進程的老祖宗,沒有這個進程,系統中任何進程都不會啟動。init 程序首先是需要讀取配置文件
/etc/inittab。inittab是一個不可執行的文本文件,它有若干行指令所組成。具體內容如下:(你可以在你的linux上執行命令 cat
/etc/inittab 這樣獲得)
復制代碼
代碼如下:
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
###表示當前預設運行級別為5(initdefault);
id:5:initdefault:
###啟動時自動執行/etc/rc.d/rc.sysinit腳本(sysinit)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
###當運行級別為5時,以5為參數運行/etc/rc.d/rc腳本,init將等待其返回(wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
###在啟動過程中允許按CTRL-ALT-DELETE重啟系統
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schele a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
###在2、3、4、5級別上以ttyX為參數執行/sbin/mingetty程序,打開ttyX終端用於用戶登錄,
###如果進程退出則再次運行mingetty程序(respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
###在5級別上運行xdm程序,提供xdm圖形方式登錄界面,並在退出時重新執行(respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的inittab文件為例,來說明一下inittab的格式。其中以#開始的行是注釋行,除了注釋行之外,每一行都有以下格式:
代碼如下:
id:runlevel:action:process
對上面各項的詳細解釋如下:
1. id
id是指入口標識符,它是一個字元串,對於getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。
2. Runlevel
runlevel是init所處於的運行級別的標識,一般使用0-6以及S或s。0、1、6運行級別被系統保留:其中0作為shutdown動作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現,實際上,進入單用戶模式時,init直接在控制台(/dev/console)上運行/sbin/sulogin。在一般的系統實現中,都使用了2、3、4、5幾個級別,在CentOS系統中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級別也是可以使用的,傳統的Unix系統沒有定義這幾個級別。runlevel可以是並列的多個值,以匹配多個運行級別,對大多數action來說,僅當runlevel與當前運行級別匹配成功才會執行。
3. action
action是描述其後的process的運行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:initdefault是一個特殊的action值,用於標識預設的啟動級別;當init由核心激活以後,它將讀取inittab中的initdefault項,取得其中的runlevel,並作為當前的運行級別。如果沒有inittab文件,或者其中沒有initdefault項,init將在控制台上請求輸入runlevel。sysinit、boot、bootwait等action將在系統啟動時無條件運行,而忽略其中的runlevel。其餘的action(不含initdefault)都與某個runlevel相關。各個action的定義在inittab的man手冊中有詳細的描述。
J. Linux( bootloader)啟動操作系統過程
Linux Booting Process:
(1) BIOS
功能:執行計算機系統完整性檢測;通電自檢;搜索/載入/執行 boot loader程序。
一旦 boot loader 程序被探測到,並且載入到內存,BIOS會把控制權交給它。
(2) MBR
MBR位於引導盤(Bootable Disk)的第一個扇區(512B)。
通常是在 /dev/sda 或者 /dev/hda 。
注意:引導盤(bootable disk)和引導分區(bootable partition)的區別。
(3) GRUB
GRUB = Grand Unified Bootloader
如果在系統中安裝有多個內核鏡像,你可以選擇某一個被執行。
GRUB展示了一個啟動畫面,等待幾秒,如果你不輸入任何字元,它將會按照grub配置文件的規定載入默認的內核鏡像。
Grub配置文件在: /boot/grub/grub.conf
它包含了內核和initrd.img
(4) Kernal
(注意Kernal和kernel不一樣)
Kernal按照grub.conf文件的規定,掛載根文件系統。
一旦kernal啟動,它第一件事情就是執行:sbin/init 進程。
initrd是被kernel用做臨時根文件系統,直到Kernal掛載了根文件系統。
(5) INIT(Initilization)
根據 /etc/inittab 文件決定Linux運行層級,運行級別決定了哪個初始化程序(Initial Programs)被載入到啟動項。
(6) Run Level
根據你的運行級別的設定,操作系統會執行下來對應的文件夾下的程序:
Linux的7個運行級別(Run levels):
標準的Linux運行級別為3或者5,如果是3的話,系統就在多用戶狀態;如果是5的話,則是運行著XWindow系統。不同的運行級別有著不同的用處,也應該根據自己的不同清晰來設置。例如,如果丟失了root口令,那麼可以讓機器啟動進入單用戶模式來設置。
如果是使用S(Start)開頭的程序,那麼是用在啟動的時候,
如果是使用K(Kill)開頭的程序,那麼是用在關機的時候。