2019.7.3 出差归来,开始部署GPU服务器,一顿操作下来,安装成功... ... ,一直运行到2019.8.23号,期间遇到过一些问题,也做过一些记录,但事情繁杂,需要时发现以找不到,于是,决定简书上开始记录之旅!
问题缘由:2019.8.23 下午,准备运行jupyter notebook上的文件,发现连接已断,putty也是连接不上。
发现问题:去机房查看,发现是同时安装另一台服务器系统时,不小心碰到了GPU服务器的电源。
解决问题:重启电脑后查看显卡:
命令:lspci | grep NVIDIA 【Tip: NVIDIA 需要大写】
命令:nvidia-smi
自己之前命名安装好了Nvidia驱动,怎么现在就报错了呢?没有办法,关掉电脑,下班回家,平复下心情,周六再来弄!
上网查询资料后,发现可能是由非正常关机导致的,解决方法是只能重装(恰好可以在熟练一遍)。
开始重装吧,记录一下:
目前 显卡驱动 安装方式有三种
1、CUDA(.run) 下载以后安装带上显卡驱动
2、显卡驱动 .run文件安装 (我采用的是这种方式)
3、集成软件包安装(yum等)
接下来介绍第二种安装方式的卸载方法:
找到 .run 文件,执行以下命令:
命令:sh NVIDIA-Linux-x86_64-418.67.run --uninstall
开始安装:
命令:sh NVIDIA-Linux-x86_64-418.67.run -no-opengl-files
报错了:
前去机房,把在机房登录的桌面账户(注销),仍然出现如上的错误。
以下转自:https://www.jianshu.com/p/36dcf5185f01
图形界面 X Server的关闭与启动
Linux图形界面多数使用的是X Server,我们优势需要关闭/重启它。比如:安装NVIDIA的驱动程序时,就需要先关闭X server;希望让系统以server方式运行,关闭桌面环境以降低不必要的性能损耗。
Ubuntu 16.04 管理 x server
1. 用gdm管理
如果 /etc/init.d 下面没有gdm的话,可以尝试另一种方法
2. 用lightdm管理
3. 用service管理
centos7 管理 x server
所以首先查看下 X server的状态
命令:sudo systemctl status gdm.service
命令:sudo systemctl stop gdm.service
再执行:
sh NVIDIA-Linux-x86_64-418.67.run -no-opengl-files
此时,报如下错误:
找到 /usr/lib/modprobe.d/nvidia-installer-disable-nouveau.conf
打开后查看内容:
找到 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
两个文件同样的内容:
执行命令:lsmod | grep nouveau
linux中blacklist.conf解读
我们在linux中安装驱动,有时会遇到受限或冲突,通常解决方式都是要修改blacklist.conf,那么如何认识和深入了解它呢?下面就解读下
一、blacklist黑名单
对内核模块来说,黑名单是指禁止某个模块装入的机制
在 /etc/modprobe.d/中创建.conf文件,使用blacklist关键字屏蔽不需要的模块。
重新建立 initramfs image文件
## mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut /boot/initramfs-$(uname -r).img $(uname -r)
执行命令:$(uname -r)
命令:reboot
默认进入第一个,报错
第二个,第三个内核可以执行成功:
但是,运行:lsmod | grep nouveau
什么是Nouveau?
Nouveau是由第三方为NVIDIA显卡开发的一个开源3D驱动,也没能得到NVIDIA的认可与支持。虽然Nouveau Gallium3D在游戏速度上还远远和NVIDIA官方私有驱动相提并论,不过确让Linux更容易的应对各种复杂的NVIDIA显卡环境,让用户安装完系统即可进入桌面并且有不错的显示效果,所以,很多Linux发行版默认集成了Nouveau驱动,在遇到NVIDIA显卡时默认安装。企业版的Linux更是如此,几乎所有支持图形界面的企业Linux发行版都将Nouveau收入其中。
不过对于个人桌面用户来说,处于成长阶段的Nouveau并不完美,与企业版不一样,个人用户除了想让正常显示图形界面外很多时候还需要一些3D特效,Nouveau多数时候并不能完成,而用户在安装NVIDIA官方私有驱动的时候Nouveau又成为了障碍,不干掉Nouveau安装时总是报错。
nouveau 【百度百科】
这是一个旨在为nvidia的GPU建立高质量的,免费自由的开源驱动项目,nouveau"[nuvo]"与new谐音,是Linux KMS驱动的一部分,最新的版本在Linux内核中支持nvidia的帕斯卡构架。
nouveau是一个自由开放源代码CPU驱动程序,是为AMD的cpu所编写,也可用于系统芯片的高通系列,此驱动程序是由一群独立的软件工程师所编写,Nvidia的员工也提供了些微的帮助,微软也提供了很大的帮助,谷歌也不甘示弱地提供了尽可能多的帮助。
GRUB
GNU GRUB(GRand Unified Booloader简称“GRUB”)是一个来自GNU项目的操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内荣氏拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可以用于向这些内核传递启动参数。
GNU GRUB和GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。
Initramfs原理和实践
Linux系统启动时使用 initramfs(initram file system), initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作。当然 initramfs 是可选的,Linux中的内核编译选项默认开启initrd。
initramfs包含引导所需的所有硬件的内核模块,以及进入下一个引导阶段所需的初始脚本。在Centos/RHEL系统上,initramfs包含一个完整的操作系统(可用于故障排除)。
偶尔,initramfs镜像也可能会被损坏。如果发生这种情况,则无法将服务器启动到正常操作模式。要在引导到救援环境后修复initramfs镜像,可以使用dracut命令。如果不带参数使用,则此命令当前加载的内核创建新的initramfs。
或者,您可以使用带有多个选项的dracut命令为特定内核环境创建initramfs。还有一个名为 /etc/dracut.conf的配置文件,您可以在重新创建 initramfs时使用该文件包含特定选项。
initrd(rd-ramdisk)和initramfs(ramfs-ram file systme)之间的区别
几年前,Linux Torvalds有一个很好的想法:如果Linux的缓存可以像文件系统一样挂载会怎么样?只是将文件保存在缓存中,永远不要删除它们,直到它们被删除或系统重新启动,Linux在缓存周围写了一个名为“ramfs”的小包装器,其他内核开发人员创建了一个名为“tmpfs”的改进版本(它可以将数据写入交换空间,并限制给定安装点的大小,以便在消耗之前填满所有可能的内存)。Initramfs是tmpfs的一个实例。
本文链接:https://blog.csdn.net/fickyou/article/details/51331911
当Linux内核启动时,必须找到并执行第一个用户程序,通常是init。用户程序存放在文件系统,故Linux必须找到并挂载第一个文件系统。
通常,可用的文件系统都列在/etc/fstab,所以mount可以找到它们。但是/etc/fstab本身存在于文件系统中。因此,这类似鸡生蛋蛋生鸡的问题。
为解决该问题,内核开发者建立了内核命令列表选项 root=,用来指定root文件系统存在于那个设备上。
之前root通常位于软盘和硬盘上的分区。如今root文件系统可存在于各种不同类型的硬盘中,如flash等等。同时root文件系统也可能被进行各种形式的压缩,加密等等。
如果在内核中假如所有这些特殊案例,可以做到,但是就像用汇编语言写web软件。
解决方法
Linux2.6将一个小的ram-based initial root filesystem ( initramfs ) 包进内核,如果这个文件系统包含一个init程序,内核将执行它。
Ramdisk
是一个基于ram的block device,是一个大小固定的内存快,可像disk一样格式化和挂载。Ramdisk像所有的block device一样,它需要一个文件系统驱动。此外还有一些弊端,比如如果ramdisk没有满,那么它占有的额外内存不能被使用;如果满了,那么不能进行扩展。
由于caching,ramdisk浪费了更多的内存。Linux设计为缓存所有从block device中读取或写入的文件和目录,ramdisk(实际上也是在内存里)和caching一起,浪费很多内存。
Initrd
Boot loader Init Ram disk缩写,是一种机制,装载一个临时根文件系统到内存中,作为Linux startup process的一部分,为实际根文件系统的加载做准备。
对于2.4或更早的kernel来说,使用的是该方法。
Ramfs
后续Linux Torvalds有一个巧妙的想法:Linux的缓存是否可以被挂载为一个文件系统,只要保持文件在缓存中,且不将它们清除,直到它们被删除或系统重启。Linux写了一个小段程序将缓存包起来,称为ramfs,其他kernel的开发者建立一个加强版称为tmpfs(它可以写数据到swap,及限制挂载点的大小),initramfs就是tmpfs的一个实例。
Initramfs
Init ramfs缩写,是一种机制,装载一个临时根文件系统到内存中,作为Linux startup process的一部分,为实际根文件系统的加载做准备。
比较:
(1)initrd通常是一个单独的文件,initramfs通常和linux kernel映像在一起。
(2)Initrd进行了gzip压缩,有文件系统格式,比如ext2,需要kernel包含对于的驱动。然而initramfs是一个gzip cpio压缩,类似tar不过更简单。内核的cpio提取代码非常小。
(3) Initrd中的init会做一些设置,然后返回到kernel。Initramfs中init不会返回到kernel,它可能通过exec转到其他根文件系统
(4)当转到其他根设备时,initrd将pivot_root然后umount ramdisk。但是initramfs是rootfs,即不需要pivot_root,又不需要umount,只需要释放所有空间,然后转到其他rootfs即可。
(1) Linux内核只人cpio格式的initramfs文件包(因为unpack_to_rootfs只能解析cpio格式文件),非cpio格式的initramfs文件包将被系统抛弃,而initrd可以是cpio包也可以是传统的镜像(image)文件,实际使用中initrd都是传统镜像文件。
(2) initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址_initramfs_start处,与内核同时被bootloader加载到ram中,而initrd另外单独编译生成的,是一个独立的文件,它由bootloader单独加载到ram中内核空间外的地址,比如加载的地址为addr(是物理地址而非虚拟地址),大小为8MB,那么只要在命令行加入“initrd=addr" 8M” 命令,系统就可以找到initrd(当然通过适当修改Linux的目录结构,makefile文件和相关代码,以上两种情况都是可以相通的)。
总之,initrd使用了ramdisk,initramfs使用了ramfs。Initramfs机制比initrd机制要优越,是一种新的实现方式。
cpio基本介绍
cpio是一个非常古老的归档工具。已逐渐被tar替代,但是有些功能是tar不存在的,所以还是分享下它的用法。
cpio - copy files to and from archives
cpio用于创建、解压归档文件,也可以对归档文件进行拷入拷出的动作,即向归档文件中追加文件,或从归档文件中提取文件。它也支持tar格式的归档文件,但是对压缩后的tar(如.tar.gz格式)就没法支持了,cpio毕竟不会调用对应的(解)压缩工具。
cpio一般从标准输入获取数据,写入到标准输出,所以一般会结合管道、输入重定向、输出重定向使用。
重新建立 initramfs image文件
## mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut /boot/initramfs-$(uname -r).img $(uname -r)
上面是之前的命令,运行后,reboot发现开机错误,原因是# dracut /boot/initramfs-$(uname -r).img $(uname -r) 这个命令没有执行成功!!!或者是 disk-blacklist-nouveau.conf的问题(之前是blacklist.conf)。
现改为如下流程:
命令:lsmod | grep nouveau
这回终于可以安装显卡驱动了!重复上面的安装方法!!!
命令:nvidia-smi
nvidia-docker run -it -p 8888:8888 --ipc=host -v /home/share:/share ufoym/deepo:all-py36-jupyter jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --notebook-dir='/share'
运行jupyter book文件,terminal上安装 seaborn:
pip install seaborn
发现没有动......
执行:
systemctl stop firewalld.service
systemctl start smb.service
pip install seaborn 成功
书钟声敲,百炼成钢