當前位置:首頁 » 編程軟體 » 內核編譯成功後重啟的常見問題

內核編譯成功後重啟的常見問題

發布時間: 2022-09-25 20:06:57

① 請問大神們Ubuntu虛擬機自己編譯linux3.12.5內核後,配置從剛編譯的內核啟動是出現這問題。什麼情況

初始化進程執行失敗,計算機執行時,首先加電檢查硬體,其實執行grub,為系統載入做准備,而後運行init進程,從上面可以看到「Failed to execute /init"說明初始化失敗,你編譯內核是存在問題的

② 編譯內核模塊常見有關問題怎麼解決

第一次把自己編譯的驅動模塊載入進開發板,就出現問題,還好沒花費多長時間,下面列舉出現的問題及解決方案
1:出現insmod: error inserting 'hello.ko': -1 Invalid mole format

法一(網上的):是因為內核模塊生成的環境與運行的環境不一致,用linux-2.6.27內核源代碼生成的模塊,可能就不能在linux-2.6.32.2內核的linux環境下載入,需要在linux-2.6.27內核的linux環境下載入。

a.執行 uname -r //查看內核版本

b.一般出錯信息被記錄在文件/var/log/messages中,執行下面命令看錯誤信息
# cat /var/log/messages |tail

若出現類似下面:

Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE

' should be '2.6.35.13-92.fc14.i686.PAE'

則把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改為

KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己內核源碼路徑

(這里的build1是一個文件鏈接,鏈接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)

然並卵,我的fedora 14 /usr/src/kernels下並沒有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,雖然不知道兩者有什麼區別,但改成2.6.35.13-92.fc14.i686還是不行,照樣這個問題,還好後來在看教學視頻的到啟發

法二:改的還是那個位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把這里改成你編譯生成kernel的那個路徑
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加這句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint

方法:在模塊程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 錯誤解決
方法:lsmod 可查看模塊信息
即無法刪除對應的模塊。
就是必須在/lib/moles下建立錯誤提示的對應的目錄((2.6.32.2)即可。

必須創建/lib/moles/2.6.32.2這樣一個空目錄,否則不能卸載ko模塊.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是這樣倒是可以卸載nls_cp936,不過會一直有這樣一個提示:
rmmod: mole 'nls_cp936' not found
初步發現,原來這是編譯kernel時使用make moles_install生成的一個目錄,
但是經測試得知,rmmod: mole 'nls_cp936' not found來自於busybox,並不是來自kernel
1).創建/lib/moles/2.6.32.2空目錄
2).使用如下源碼生成rmmod命令,就可以沒有任何提示的卸載ko模塊了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系統調用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令復制到文件系統
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin

代碼如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"

MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}

int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>

[html] view plain
<span style="font-size:18px;">

ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>

make後生成proc.ko,再在開發板上insmod proc.ko即可
執行 dmesg 就可以看到 產生的內核信息啦

③ Linux內核編譯rboot重啟後一直這樣顯示,關掉再打開還是這樣求大神解救

基於x86的處理器有兩種操作模式:實模式和保護模式。在實模式下,用戶僅可以使用1 MB內存,並且沒有任何保護。保護模式要復雜得多,用戶可以使用更多的高級功能(如分頁)。CPU 必須中途將實模式切換為保護模式。但是,這種切換是單向的,即不能從保護模式再切換回實模式。
內核初始化的第一步是執行實模式下的匯編代碼,之後執行保護模式下init/main.c文件(上一章修改的源文件)中的 start_kernel()函數。
start_kernel()函數首先會初始化CPU子系統,之後讓內存和進程管理系統就位,接下來啟動外部匯流排和 I/O設備,最後一步是激活初始化(init)程序,它是所有Linux進程的父進程。初始化進程執行啟動必要的內核服務的用戶空間腳本,並且最終派生控制台終端程序以及顯示登錄(login)提示。

④ 對Ubuntu 8.04內核進行升級,新內核編譯完成後重新啟動,系統提示找不到文件

重啟,從Ubuntu 8.04.2, kernel 2.6.24-16-generic進入系統
終端執行 sudo update-grub 自動升級grub
看能不能從新內核引導,如果不行就是你升級內核時出了問題,查看日誌或重新編譯

⑤ ubuntu重新編譯內核安裝之後,重啟,出現了問題,求助!這該怎麼解決

把原先的內核刪除了嗎?

⑥ linux內核啟動出錯,我編譯內核,製作完ramdisk,修改完grub.conf,啟動時出現以下錯誤,怎麼回事

ramdisk 出錯。
既然自己編譯 linux 內核,不推薦使用randisk,只使用內核就行,
在編譯內核時一定要將自己使用的文件系統編譯進內核,引導時,內核後跟主分區的設備名就行,
ramdisk的作用就是載入內核驅動的,把文件系統驅動直接編譯進內核,就不需要 ramdisk 了。

⑦ 虛擬機上編譯linux內核,重啟後,不能正常進入系統,顯示出現這樣的問題:

希望你用的boot loader舊的菜單項還在,這樣的話你可以選那條boot起來然後重新編譯;
你的問題感覺上file system沒有編譯進內核,所以沒有辦法mount分區;
或者你的boot loader的菜單項沒配置好;

⑧ 重新編譯內核後無法啟動,該怎麼處理

以前的內核還在嗎,可能不是內核的問題,你能進入到grub選擇系統的菜單嗎,如果不能進入,那是引導的問題,如果能進去,嘗試進入命令行模式引導你以前的舊內核
一般,我遇到這種情況都是顯卡驅動的問題,安裝了linux image後,還要安裝相應的linux headers,系統啟動後,按Crtl+Alt+Fn(n=2,3,4,5,6)如果能進入tty,那就是顯示驅動沒裝上,故不能進入圖形界面。但系統已經啟動了。

⑨ linux內核編譯完成後重啟,出現mdio-gpio is already registered,怎麼辦

圖片好小...
不過依稀看到了是載入一個內核模塊(dm-region-hash)錯誤,這個模塊應該是和文件系統相關的,然後後面mount 文件系統的時候就找不到磁碟...
你更新了的內核出了問題...載入模塊的時候顯示這個模塊已經存在,所以就沒法insmod這個模塊,操作不成功了。大概是重復載入了...

然後給你搜索了下,這個問題好像比較常見,這裡面有人給出了解決方案:

地址:
把有用的給你貼出來吧...

insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists
這一句是說你把dm-region-hash編譯進內核,卻沒有生成dm-region-hash.ko文件,可能是有些需要的項沒選上,我也是遇到這種問題,一直沒解決 [/quote]

是因為重復載入了/lib/dm-region-hash.ko

可以解決的,步驟如下
1,解壓initrd文件
[root@bogon ~]# cp /boot/initrd-2.6.30.4.img /tmp
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ls
initrd-2.6.30.4.img
[root@bogon tmp]# mkdir newinitrd
[root@bogon tmp]# cd newinitrd/
[root@bogon newinitrd]# zcat ../initrd-2.6.30.4.img |cpio -i
11537 blocks
釋放之後看到如下內容
[root@bogon newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot

2,ok,下邊就是編輯init,刪掉其中重復的四行中的兩行
echo "Loading dm-region-hash.ko mole"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko mole"
insmod /lib/dm-region-hash.ko

3,重新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd > initrd.img
[root@bogon tmp]# ls
initrd-2.6.30.4.img initrd initrd.img newinitrd

好了,initrd.img就是重新打包的initrd了,然後把initrd.img拷貝到/boot,更改grub.conf里邊的initrd-2.6.30.4.img為initrd.img就可以了,
這樣「insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists」 就不會有了

其實將init文件的第二行「setquiet」 去掉,你就知道initrd文件到底在做什麼了

⑩ 新編譯了linux內核後,啟動報錯,該怎麼解決

你編譯什麼了,
貌似是不識別文件系統了

熱點內容
手機緩存的視頻怎麼看 發布:2024-04-27 00:11:05 瀏覽:57
shell腳本平方計算公式 發布:2024-04-26 23:29:26 瀏覽:187
比較實惠的雲伺服器 發布:2024-04-26 23:24:57 瀏覽:974
怎麼增加電腦緩存 發布:2024-04-26 23:23:46 瀏覽:451
android調試gdb 發布:2024-04-26 23:22:27 瀏覽:99
androidsocket服務 發布:2024-04-26 22:49:53 瀏覽:980
python編譯時加密 發布:2024-04-26 22:49:20 瀏覽:246
買車看哪些配置參數 發布:2024-04-26 22:45:50 瀏覽:835
linux顯示圖像 發布:2024-04-26 22:45:41 瀏覽:493
flash腳本格式 發布:2024-04-26 22:43:41 瀏覽:452