linux中blacklist.conf解讀

  • 2019 年 10 月 29 日
  • 筆記

我們在linux中安裝驅動,有時會遇到受限或衝突,通常解決方式都是要修改blacklist.conf, 那麼如何認識和深入了解它呢?下面就解讀下 一、blacklist黑名單 對內核模塊來說,黑名單是指禁止某個模塊裝入的機制

在 /etc/modprobe.d/ 中創建 .conf 文件,使用 blacklist 關鍵字屏蔽不需要的模塊,例如如果不想裝入 pcspkr 模塊:

/etc/modprobe.d/blacklist.conf blacklist pcspkr 或者通過命令行的模式 modprobe.blacklist=modname1,modname2 從這裡可以看出blacklist是一個模塊參數,其實現在linux/module.c中 其源碼如下: static bool blacklisted(const char module_name) { const char p; size_t len; #可以看到module_blacklist 這個list 為null,則直接返回false if (!module_blacklist) return false; #這裡通過查詢這個list 來比較模塊的name 是否在module_blacklist中,如果在的話,返回true,就不在加載#layout_and_allocate 這個函數中加載這個模塊 for (p = module_blacklist; p; p += len) { len = strcspn(p, ","); if (strlen(module_name) == len && !memcmp(module_name, p, len)) return true; if (p[len] == ',') len++; } return false; } core_param(module_blacklist, module_blacklist, charp, 0400); blacklisted 這個函數是在layout_and_allocate 中加載的 static struct module layout_and_allocate(struct load_info info, int flags) { / Module within temporary copy. / struct module mod; unsigned int ndx; int err;

mod = setup_load_info(info, flags);  if (IS_ERR(mod))      return mod;  #可以看到如果blacklisted 返回true,則layout_and_allocate 就返回-EPERM,表示不加載這個模塊  if (blacklisted(info->name))      return ERR_PTR(-EPERM);

}

二、nvidia 顯卡驅動問題示例 Linux系統一般默認安裝的是開源的nouvea顯卡驅動,它與nvidia顯卡驅動產生衝突,欲裝nvidia必禁nouvea!其次Nvidia驅動默認安裝OpenGL桌面,然而這又與GNOME桌面衝突,為了系統不宕機,也需禁用nvidia的OpenGL,過程中需要搭建gcc、kernel等環境。如此,可順利安裝NVIDIA顯卡驅動。

1、首先關閉secure boot 重啟電腦,進入BIOS 找到seure boot,一般在boot選項中 將 「Enable」 改為 「Disable」

2、查看系統中存在的NVIDIA驅動 lspci | grep -i nvidia 選擇適合本主機linux的nvidia官網驅動,點擊搜索後進行下載

因為驅動和內核的源碼進行編譯,需要安裝如下內核相關的包,以及一些編譯源碼的工具包: yum install kernel-devel kernel-doc kernel-headers gcc* glibc* glibc-*

有時候 glx-utils.x86_64 會和驅動程序衝突,最好先刪除掉: yum remove glx-utils

3、把驅動加入黑名單中: /etc/modprobe.d/blacklist.conf 在後面加入: #blacklist nvidiafb 將nvidiafb注釋掉 然後添加兩行 blacklist nouveau options nouveau modeset=0 修改 /etc/default/grub 文件 在GRUB_CMDLINE_LINUX中添加

rd.driver.blacklist nouveau nouveau.modeset=0

4、重建 initramfs image

mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r) 5、安裝編譯環境 yum install gcc kernel-devel kernerl-hearders -y 或 yum -y install gcc kernel-devel

6、安裝NVIDIA驅動 添加可執行權限 chmod +x NVIDIA-Linux-x86_64-375.39.run

7、退出X-server圖形,進入文本模式或修改下inittab init 3

8、執行下 sh NVIDIA-Linux-x86_64-375.39.run –no-opengl-files

9、後面OK、Accept、yes就裝完了

10、最後使用nvidia-smi命令就可以看到驅動詳情了

備註: depmod -a 對所有的模塊檢查下依賴性

        echo modprobe wl >> /etc/rc.local