近期准备重新装机来着,实验室新人渐多,先对以前的手稿进行一个粗略的整理,方便动手时快些。
进行配置文件修改的操作请注意先备份原配置文件
说明:命令行前的
#
符号表示需以管理员(root)角色运行命令,$
表示无需管理员权限即可执行命令。
CentOS7安装
step1. 启动盘制作(尽量使用Rufus启动盘制作工具)
磁盘分区格式MBR限制了单块磁盘大小为2TB,这种分区格式在Centos下无法挂载超过2T大小的磁盘,如果想挂载超过2TB的磁盘,就要换成其他格式如GPT格式。 如下所示,在使用Rufus工具制作启动盘的过程中,在选项“分区方案和目标系统类型”中选择“用于UEFI计算机的GPT分区方案”,文件系统选择“FAT32”是为了兼容不同操作系统。
Figure 1. 启动盘制作
step2. 安装(我这里是华硕主板)
安装系统过程中,按F2/Del进入启动菜单选择,按F8
或者用鼠标选择右下角的启动菜单,在弹出的启动菜单里选中U盘"UEFI:KingstonDataTraveler"点击进入安装流程。或者直接修改启动顺序面板里U盘的位置,拖动到第一个位置,然后点击下方“保存并退出(F10)”便可通过U盘启动。
Figure 2. 华硕主板的BIOS界面,启动顺序如图中鼠标指针所示(我这里U盘启动器用的是金士顿的U盘)
安装过程中,按界面指引逐项进行操作。安装完成后确认重启即可,注意,重启后先立刻按F2进入启动项选择,将系统安装位置(盘)拖动到启动顺序的第一个位置,然后保存退出,便可进入安装后的系统界面。
Centos 磁盘挂载:
Linux有硬件即文件的哲学,依此我们可以采取不分区直接挂载整个磁盘的方式来扩容目录
对新磁盘进行分区,由于fdisk仅支持2T以内磁盘分区,但该磁盘大于2T,所以使用parted进行GPT格式分区:
挂载过程描述如下: 执行命令$ lsblk
查看挂载信息,
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
└─sda1 8:1 0 2T 0 part
sdb 8:16 0 238.5G 0 disk
├─sdb1 8:17 0 200M 0 part /boot/efi
├─sdb2 8:18 0 1G 0 part /boot
└─sdb3 8:19 0 237.3G 0 part
├─cl_localhost-root 253:0 0 50G 0 lvm /
├─cl_localhost-swap 253:1 0 4G 0 lvm [SWAP]
└─cl_localhost-home 253:5 0 183.3G 0 lvm /home
sdc 8:32 0 3.7T 0 disk
sdd 8:48 1 28.9G 0 disk
└─sdd1 8:49 1 28.9G 0 part /run/media/tsmc/CENTOS 7 X8
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 200M 0 part
├─nvme0n1p2 259:2 0 1G 0 part
└─nvme0n1p3 259:3 0 237.3G 0 part
├─cl00-swap 253:2 0 4G 0 lvm
├─cl00-home 253:3 0 183.3G 0 lvm
└─cl00-root 253:4 0 50G 0 lvm
- 查看硬盘
# fdisk -l
发现硬盘为/dev/sdb 大小4T
2.如果此硬盘以前有过分区,则先对磁盘格式化:
# mkfs -t ext4 /dev/sda
此命令会对整个磁盘格式化
- 对新磁盘进行分区,由于fdisk仅支持2T以内磁盘分区,但该磁盘大于2T,所以使用parted进行GPT格式分区:
[root@localhost /]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help # 查看帮助信息
align-check TYPE N check partition N for TYPE(min|opt) alignment
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
mkpart PART-TYPE [FS-TYPE] START END make a partition
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] display the partition table, available devices, free space, all found
partitions, or a particular partition
quit exit program
rescue START END rescue a lost partition near START and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
unit UNIT set the default unit to UNIT
version display the version number and copyright information of GNU Parted
(parted) mklabel gpt # 执行命令mklabel gpt,把sdb改成gpt大分区格式
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you
want to continue?
Yes/No? yes
(parted) mkpart primary 0 4000.8GB # 创建分区
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? cancel # 注意,此处提示为磁盘为对齐,会影响性能,所以在此处要进行对齐
(parted) quit
Information: You may need to update /etc/fstab.
- 查看磁盘参数
[root@localhost /]# cat /sys/block/sda/queue/optimal_io_size
0
[root@localhost /]# cat /sys/block/sda/queue/minimum_io_size
512
[root@localhost /]# cat /sys/block/sda/alignment_offset
0
[root@localhost /]# cat /sys/block/sda/queue/physical_block_size
512
如果optimal_io_size不为0,暂定是1048576,则可以用optimal_io_size的值加上alignment_offset的值,
然后除以physical_block_size的值,就是起始扇区的位置了,如上面的例子中,可以用这个公式算出来起始扇区的设定值:
(1048576 + 0) / 512 = 2048
如果optimal_io_size为0,那么我们最好直接使用起始扇区的默认值2048。
- 最后在分区的时候使用以下的命令进行分区就可以了,不会报warning:
[root@localhost /]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mkpart primary 2048s 100%
(parted) print
Model: ATA ST4000NM0035-1V4 (scsi)
Disk /dev/sda: 4001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 4001GB 4001GB primary
(parted) align-check optimal 1 # 此命令会检查对齐与否
1 aligned
(parted) quit
Information: You may need to update /etc/fstab.
6.查看磁盘情况:
[root@localhost /]# fdisk -l
......
Disk /dev/sda: 4000.8 GB, 4000787030016 bytes, 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: 9847A4AC-B5A7-405E-8A30-0B517ED64625
# Start End Size Type Name
1 2048 7814035455 3.7T Microsoft basic primary
....
7.再次格式化磁盘:
[root@localhost /]# mkfs.ext4 -F /dev/sda
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
244195328 inodes, 976754646 blocks
48837732 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3124756480
29809 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
8.挂载新磁盘到/mnt/sda
[root@localhost /]# cd /mnt
[root@localhost mnt]# mkdir sda
[root@localhost mnt]# mount /dev/sda /mnt/sda
[root@localhost mnt]# umount /dev/sda
9.设置自动挂载/mnt/sda
# vim /etc/fstab
在最后一行加/dev/sda /mnt/sda ext4 defaults 1 2
:, 对于另一块硬盘也按上面的步骤操作,然后将其挂载另一个挂载点上,如下:
[root@localhost mnt]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Nov 16 14:12:24 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl_localhost-root / xfs defaults 0 0
UUID=3619ba5d-5d44-4f7c-8b07-90372b1214b1 /boot xfs defaults 0 0
UUID=3488-BCA0 /boot/efi vfat umask=0077,shortname=winnt 0 0
/dev/mapper/cl_localhost-home /home xfs defaults 0 0
/dev/mapper/cl_localhost-swap swap swap defaults 0 0
/dev/sda /mnt/sda ext4 defaults 1 2
/dev/sdc /home/tsmc ext4 defaults 1 2
# 保存退出
- 查看是否挂载/home/tsmc
[root@localhost mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 63G 0 63G 0% /dev
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 63G 11M 63G 1% /run
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/mapper/cl_localhost-root 50G 16G 35G 32% /
/dev/sdb2 1014M 223M 792M 22% /boot
/dev/sdb1 200M 12M 189M 6% /boot/efi
/dev/mapper/cl_localhost-home 184G 33M 184G 1% /home
未挂载上!
- 使用
mount -a
命令挂载fstab中未挂载的磁盘
[root@localhost mnt]# mount -a
[root@localhost mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 63G 0 63G 0% /dev
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 63G 11M 63G 1% /run
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/mapper/cl_localhost-root 50G 22G 29G 44% /
/dev/sdb2 1014M 224M 791M 23% /boot
/dev/sdb1 200M 12M 189M 6% /boot/efi
/dev/mapper/cl_localhost-home 184G 33M 184G 1% /home
/dev/sda 3.6T 7.3G 3.4T 1% /mnt/sda
/dev/sdc 3.6T 190M 3.4T 1% /home/tsmc
挂载成功。
CentOS第三方源服务
CentOS追求稳定性,所以官方源中自带的软件不多,因而需要一些第三方源,比如EPEL、ATrpms、ELRepo、Nux Dextop、RepoForge等。
1. 系统镜像源:
EPEL
EPEL即Extra Packages for Enterprise Linux,为CentOS提供了额外的10000多个软件包,而且在不替换系统组件方面下了很多功夫,因而可以放心使用。
sudo yum install epel-release
Nux Dextop
Nux Dextop中包含了一些与多媒体相关的软件包,作者尽量保证不覆盖base源。官方说明中说该源与EPEL兼容,实际上个别软件包存在冲突,但基本不会造成影响:
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
ELRepo
ELRepo包含了一些硬件相关的驱动程序,比如显卡、声卡驱动:
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
2. 其它包管理工具镜像源
- pip镜像源的临时使用方式
加参数-i
指定临时国内镜像源即可,例如安装tf1.8:
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.8
以升级tensorflow 1.6版本到1.8(要求cuda9.0支持)为例:
sudo pip install --upgrade tensorflow-gpu==1.8 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
- pip镜像源永久修改,一劳永逸:
修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至https://pypi.tuna.tsinghua.edu.cn/simple
,内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn/simple
驱动安装
1. nouveau驱动去除
执行以下bash脚本文件来关闭Nouveau(建立一个名为 _NvidiaDriver.sh 的文件,将以下脚本内容保存并执行):
#! /bin/bash
# centos remove nouveau module
# by chendeqing
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut -v /boot/initramfs-$(uname -r).img $(uname -r)
wait ;
echo "nouveau module removal success....."
rm -rf /opt/sumihui
查看是否成功去除nouveau驱动 ,若没有任何输出则说明已经成功去除
[root@localhost ~]# lsmod | grep nouveau
接下来就可以执行驱动安装了.
2. 安装NVIDIA 驱动(若失败请看下一节)
cuda下载: https://developer.nvidia.com/cuda-90-download-archive (内含相应的NVIDIA驱动)
cudnn下载:https://developer.nvidia.com/rdp/cudnn-archive
[root@localhost Downloads]# ll
total 2024364
-rwxrwxrwx. 1 sumihui users 1643293725 Nov 17 11:14 cuda_9.0.176_384.81_linux.run
-rw-r--r--. 1 sumihui users 348817823 Nov 17 11:16 cudnn-9.0-linux-x64-v7.tgz
-rwxrwxrwx. 1 root root 80833580 Nov 16 19:40 NVIDIA-Linux-x86_64-384.90.run
[root@localhost Downloads]# bash cuda_9.0.176_384.81_linux.run -extract=~/NVIDIA
Logging to /tmp/cuda_install_20730.log
Extracting individual Driver, Toolkit and Samples installers to /root/NVIDIA ...
[root@localhost Downloads]# cd ~/NVIDIA/
[root@localhost NVIDIA]# ll
total 1609832
-rwxr-xr-x. 1 root root 1464606961 Nov 17 11:20 cuda-linux.9.0.176-22781540.run
-rwxr-xr-x. 1 root root 102054400 Nov 17 11:20 cuda-samples.9.0.176-22781540-linux.run
-rwxr-xr-x. 1 root root 81798900 Nov 17 11:20 NVIDIA-Linux-x86_64-384.81.run
安装NVIDIA驱动之前,先输入如下命令关闭图形界面:
[root@localhost NVIDIA]# init 3
然后在执行NVIDIA驱动脚本:
Figure 3. 执行NVIDIA驱动脚本
接受协议
DKMS选择No
中间可能会要求生成新的公钥,类似下面:
An X.509 certificate containing the public signing key will be installed to /usr/share/nvidia/nvidia-modsign-crt-1C479B6B.der.
我们需要64-bit,因此这里选No
自动配置 x configuration
下一步便是完成安装:
输入#reboot
重启,按F2进入华硕主板,禁用UEFI安全启动(disable secure Boot for ASUS motherboard), 禁用原因在图后:
( After you cleared the Secure Boot Keys, Secure Boot will be automatically disabled. You can set the OS Type to Other OS now. ) 参考
如果Secure Boot state显示为不可用状态,先选择"OS Type"为“other OS”,然后再进入下方的“Key Management”选项,选择 "Clear Secure Boot keys" ,保存退出,再次重启进入主板设置后,便可看见安全启动被禁用了,这是改回“OS Type”为“Windows UEFI mode”保存退出即可。
重启进入系统过后,使用nvidia-smi命令即可查看显卡信息。
2.1 NVIDIA驱动安装失败方案
如果出现安装失败,可能是存在多个内核版本,且正在使用的内核版本过高,先查看内核版本并卸载多余的高版本并卸载高版本内核附加文件 :
[root@localhost NVIDIA]# uname -r
3.10.0-1062.4.3.el7.x86_64
[root@localhost NVIDIA]# uname -a
Linux localhost.tsmclab 3.10.0-1062.4.3.el7.x86_64 #1 SMP Wed Nov 13 23:58:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost NVIDIA]# rpm -qa |grep kernel
kernel-devel-3.10.0-1062.4.3.el7.x86_64
kernel-3.10.0-514.el7.x86_64
kernel-headers-3.10.0-1062.4.3.el7.x86_64
kernel-devel-3.10.0-514.el7.x86_64
kernel-tools-libs-3.10.0-1062.4.3.el7.x86_64
kernel-3.10.0-1062.4.3.el7.x86_64
kernel-tools-3.10.0-1062.4.3.el7.x86_64
abrt-addon-kerneloops-2.1.11-55.el7.centos.x86_64
[root@localhost NVIDIA]# rpm -e kernel-3.10.0-1062.4.3.el7.x86_64
warning: file /lib/modules/3.10.0-1062.4.3.el7.x86_64/updates: remove failed: No such file or directory
[root@localhost NVIDIA]# rpm -qa |grep kernel
kernel-devel-3.10.0-1062.4.3.el7.x86_64
kernel-3.10.0-514.el7.x86_64
kernel-headers-3.10.0-1062.4.3.el7.x86_64
kernel-devel-3.10.0-514.el7.x86_64
kernel-tools-libs-3.10.0-1062.4.3.el7.x86_64
kernel-tools-3.10.0-1062.4.3.el7.x86_64
abrt-addon-kerneloops-2.1.11-55.el7.centos.x86_64
[root@localhost NVIDIA]# rpm -e kernel-devel-3.10.0-1062.4.3.el7.x86_64
[root@localhost NVIDIA]# rpm -e kernel-tools-3.10.0-1062.4.3.el7.x86_64
重启后再按前述安装方式安装驱动即可。
3. 安装cuda
浏览用户协议:
按空格间翻页到最后,接受协议:
使用默认安装路径
特别留意一下内容,将在后续环境变量中用到这些路径:
========================================
Please make sure that
- PATH includes /usr/local/cuda-9.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root
Please read the release notes in /usr/local/cuda-9.0/doc/
To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin
Installation Complete
将CUDA路径添加至环境变量 在终端输入: # vim /etc/profile
在profile文件中添加:
export CUDA_HOME=/usr/local/cuda-9.0
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
之后source /etc/profile即可
[root@localhost NVIDIA]# source /etc/profile
1 cd NVIDIA/
2 ll
3 bash cuda-linux.9.0.176-22781540.run
4 vim /etc/profile
5 source /etc/profile
6 nvcc -V
7 vim /etc/profile
8 source /etc/profile
在终端输入: #nvcc -V
会得到相应的nvcc编译器相应的信息,那么CUDA配置成功了。
[root@localhost NVIDIA]# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
4. cuda样例测试【验证驱动安装】:
再在NVIDIA
目录执行命令输出样例程序:
[root@localhost NVIDIA]# bash cuda-samples.9.0.176-22781540-linux.run
在目录 /usr/local/cuda-9.0/samples下 输入命令 $ make 编译samples. 下面的-j16表示以16线程编译
[root@localhost NVIDIA]# cd /usr/local/cuda-9.0/samples
[root@localhost NVIDIA]# make -j16
如果要进行cuda性能测试,可以进samples/bin/…/…/…的底层目录,运行各类实例。
以进入到目录 /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery为例 执行命令 $ ./deviceQuery:
[root@localhost ~]# cd /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery
[root@localhost deviceQuery]# ./deviceQuery
./deviceQuery Starting...
......
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
> Peer access from GeForce GTX TITAN X (GPU0) -> GeForce GTX TITAN X (GPU1) : Yes
> Peer access from GeForce GTX TITAN X (GPU0) -> GeForce GTX TITAN X (GPU2) : Yes
> Peer access from GeForce GTX TITAN X (GPU1) -> GeForce GTX TITAN X (GPU0) : Yes
> Peer access from GeForce GTX TITAN X (GPU1) -> GeForce GTX TITAN X (GPU2) : Yes
> Peer access from GeForce GTX TITAN X (GPU2) -> GeForce GTX TITAN X (GPU0) : Yes
> Peer access from GeForce GTX TITAN X (GPU2) -> GeForce GTX TITAN X (GPU1) : Yes
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 9.0, NumDevs = 3
Result = PASS
5. 安装cudnn
创建解压目录,cd到加压后的·cuda·目录下,执行复制命令:
[root@localhost Downloads]# ll
total 2024364
-rwxrwxrwx. 1 sumihui users 1643293725 Nov 17 11:14 cuda_9.0.176_384.81_linux.run
-rw-r--r--. 1 sumihui users 348817823 Nov 17 11:16 cudnn-9.0-linux-x64-v7.tgz
-rwxrwxrwx. 1 root root 80833580 Nov 16 19:40 NVIDIA-Linux-x86_64-384.90.run
[root@localhost Downloads]# chmod 777 cudnn-9.0-linux-x64-v7.tgz
[root@localhost Downloads]# ll
total 2024364
-rwxrwxrwx. 1 sumihui users 1643293725 Nov 17 11:14 cuda_9.0.176_384.81_linux.run
-rwxrwxrwx. 1 sumihui users 348817823 Nov 17 11:16 cudnn-9.0-linux-x64-v7.tgz
-rwxrwxrwx. 1 root root 80833580 Nov 16 19:40 NVIDIA-Linux-x86_64-384.90.run
[root@localhost Downloads]# mkdir cudnn_release
[root@localhost Downloads]# mv cudnn-9.0-linux-x64-v7.tgz cudnn_release/
[root@localhost Downloads]# cd cudnn_release/
[root@localhost cudnn_release]# ll
total 340644
-rwxrwxrwx. 1 sumihui users 348817823 Nov 17 11:16 cudnn-9.0-linux-x64-v7.tgz
[root@localhost cudnn_release]# tar -zxf cudnn-9.0-linux-x64-v7.tgz
[root@localhost cudnn_release]# tree -L 3 -C
.
├── cuda
│ ├── include
│ │ └── cudnn.h
│ ├── lib64
│ │ ├── libcudnn.so -> libcudnn.so.7
│ │ ├── libcudnn.so.7 -> libcudnn.so.7.0.5
│ │ ├── libcudnn.so.7.0.5
│ │ └── libcudnn_static.a
│ └── NVIDIA_SLA_cuDNN_Support.txt
└── cudnn-9.0-linux-x64-v7.tgz
3 directories, 7 files
[root@localhost cudnn_release]# ll
total 340644
drwxr-xr-x. 4 root root 70 Nov 17 11:54 cuda
-rwxrwxrwx. 1 sumihui users 348817823 Nov 17 11:16 cudnn-9.0-linux-x64-v7.tgz
[root@localhost cudnn_release]# cd cuda/
[root@localhost cuda]# ll
total 40
drwxr-xr-x. 2 root root 21 Nov 17 11:54 include
drwxr-xr-x. 2 root root 96 Nov 17 11:54 lib64
-r--r--r--. 1 1000 1000 38963 Nov 8 2017 NVIDIA_SLA_cuDNN_Support.txt
[root@localhost cuda]# cp include/* /usr/local/cuda-9.0/include/
[root@localhost cuda]# cp lib64/lib* /usr/local/cuda-9.0/lib64/
Linux用户管理
用户管理的目的:保持用户自身数据与自身程序操作一致性
1. 新增用户并分配用户组及权限
添加新用户到指定的各自主目录下的命令实例如下(示例用户名sumihui
),命令参数说明随后介绍。 使用passwd
为新建用户设置初始密码,然后设置用户目录所有者及目录权限:
[root@tsmclab ~]# useradd -u 556 -d /home/sumihui -g users -m sumihui
[root@tsmclab ~]# passwd sumihui
Changing password for user sumihui.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@tsmclab ~]# chown -R :users /home/sumihui
[root@tsmclab ~]# chmod 760 /home/sumihui
[root@tsmclab ~]# ll
total 24
drwx------. 2 root root 16384 Sep 15 16:32 lost+found
drwxrw----. 5 sumihui users 4096 Sep 16 15:55 sumihui
上述命令使用的解释与演示说明如下:
useradd的命令参数说明如下: -u 指定用户ID号,该值在系统中必须是唯一的。0~499默认保留给系统用户账户使用,所以该值必须大于499. -d 指定用户登入时的主目录,可替换系统默认值 /home/$USERNAME -m 自动建立用户的登入主目录 -g 指定用户所属的群组。值可以是组名也可是GID。用户组必须已经存在,其默认值为100,即users。
使用useradd
命令所建立的账号,都保存在 /etc/passwd 文本文件中。
$ cat /etc/passwd # 可以查看所有用户列表
$ w # 可以查看当前活跃的用户列表
$ cat /etc/group # 查看用户组
chmod 改变文件或目录权限,例如:赋予sumihui目录权限rwxrw—
[root@tsmclab ~]# chmod 760 /home/sumihui
chown设定目录所有者,例如:设定users用户组的所有用户为/home/sumihui目录所有者。
[root@tsmclab ~]# chown -R :users /home/sumihui
设定users用户组的sumihui这一个用户为/home/sumihui目录所有者。
[root@tsmclab ~]# chown -R sumihui:users /home/sumihui
上述两个chown命令的区别在于,当设置/home/sumihui
目录权限为760时,对于chown -R :users /data/sumihui
(其实默认所有者就是users),其它users用户组用户可访问该目录,否则不可以.
2. 删除用户
万一添加用户出现错误或需要删除不再使用的用户及其数据,可使用userdel
命令删除用户或数据,例如:
# userdel -r sumihui
删除用户并连带用户自家主目录一起删除
# userdel sumihui
只删除用户
[root@tsmclab ~]# userdel -r sumihui
userdel: /home not owned by sumihui, not removing
3. XRDP远程桌面
CentOS7安装xrdp步骤
1.默认库不包含xrdp,需要安装epel库。
[root@tsmclab ~]# yum install epel-release
然后安装xrdp
[root@tsmclab ~]# yum install xrdp
2.安装tigervnc-server
[root@tsmclab ~]# yum install tigervnc-server
如果Linux服务器需要远程桌面客户端,可同时安装tigervnc
[root@tsmclab ~]# yum install tigervnc
3.为当前用户设置vnc密码,如果是其他用户,先su到这个用户,然后再vncpasswd。
[root@tsmclab ~]# vncpasswd
这个命令实际上只要是CentOS上已有的账户,通过putty等SSH远程工具登录这个账户后直接运行即可修改当前登录用户的远程桌面密码(vnc密码)
4.配置xrdp.ini文件
[root@tsmclab ~]# vim /etc/xrdp/xrdp.ini
把
max_bpp=32
,改为max_bpp=24
5.配置selinux
[root@tsmclab ~]# chcon -t bin_t /usr/sbin/xrdp
[root@tsmclab ~]# chcon -t bin_t /usr/sbin/xrdp-sesman
6.启动xrdp服务,并设置为开机启动
[root@tsmclab ~]# systemctl start xrdp
[root@tsmclab ~]# systemctl enable xrdp
7.打开防火墙3389端口
[root@tsmclab ~]# firewall-cmd --permanent --zone=public --add-port=3389/tcp
[root@tsmclab ~]# firewall-cmd --reload
8.查看xrdp服务是否正常启动
[root@tsmclab ~]# systemctl status xrdp.service
[root@tsmclab ~]# ss -antup|grep xrdp
也可通过如下命令确定xrdp监听端口3389的状态:
[root@tsmclab ~]# netstat -antup | grep xrdp
成功后可以使用windows的远程桌面连接linux.
Docker的使用
1. 安装docker
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r
$ uname -r
2、使用 root
权限登录 Centos。确保 yum 包更新到最新。
$ sudo yum update
3、卸载旧版本(如果安装过旧版本的话)
$ sudo yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
7、安装docker
$ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这个命令安装的将是最新稳定版
$ sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.09.1.ce
为了兼顾后面有适配的nvidia-docker版本,我们这里选择安装17.09.1版本:
[root@localhost ~]# yum install docker-ce-17.09.1.ce
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* elrepo: mirrors.neusoft.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
* nux-dextop: li.nux.ro
Resolving Dependencies
--> Running transaction check
---> Package docker-ce.x86_64 0:17.09.1.ce-1.el7.centos will be installed
--> Processing Dependency: container-selinux >= 2.9 for package: docker-ce-17.09.1.ce-1.el7.centos.x86_64
......
......(省略)
Total download size: 21 M
Installed size: 21 M
Is this ok [y/d/N]: y
8、启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
$ docker version
2. 使用软链接修改docker默认镜像存储位置
默认情况下Docker的存放位置为:/var/lib/docker
可以通过下面命令查看具体位置:
sudo docker info | grep "Docker Root Dir"
解决这个问题,最直接的方法当然是挂载分区到这个目录,但是我的数据盘还有其他东西,这肯定不好管理,所以采用修改镜像和容器的存放路径的方式达到目的。
这个方法里将通过软连接来实现。
首先停掉Docker服务:
# systemctl stop docker
或者
# service docker stop
然后移动整个/var/lib/docker目录到目的路径:
[root@localhost sda]# pwd
/mnt/sda/
[root@localhost sda]# mkdir docker
[root@localhost lib]# mv /var/lib/docker /mnt/sda/docker
[root@localhost lib]# ln -s /mnt/sda/docker /var/lib/docker
3. 删除docker的命令
# yum remove docker-ce
4. nvidia-docker 安装:
https://blog.exxactcorp.com/installing-using-docker-nv-docker-centos-7/
先查找可安装的nvidia-docker版本:
[root@localhost ~]# yum search --showduplicates nvidia-docker
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* elrepo: ftp.ne.jp
* epel: mirrors.njupt.edu.cn
* nux-dextop: li.nux.ro
========== N/S matched: nvidia-docker ==========
nvidia-docker2-2.0.0-1.docker1.12.6.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.0-1.docker17.03.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.0-1.docker17.06.1.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.0-1.docker17.06.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.0-1.docker17.09.0.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker1.12.6.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker1.13.1.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker17.03.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker17.06.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker17.09.0.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.1-1.docker17.09.1.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.2-1.docker17.09.1.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.2-1.docker17.12.0.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker1.12.6.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker1.13.1.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.03.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.06.2.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.09.0.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.09.1.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.12.0.ce.noarch : nvidia-docker CLI wrapper
nvidia-docker2-2.0.3-1.docker17.12.1.ce.noarch : nvidia-docker CLI wrapper
......
Name and summary matches only, use "search all" for everything.
由于我们安装的docker
是17.09.1版本的。因此我选择安装nvidia-docker2-2.0.3-1.docker17.09.1.ce.noarch。
[root@localhost ~]# yum install nvidia-docker2-2.0.3-1.docker17.09.1.ce.noarch
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* elrepo: mirrors.neusoft.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
* nux-dextop: mirror.li.nux.ro
Resolving Dependencies
--> Running transaction check
---> Package nvidia-docker2.noarch 0:2.0.3-1.docker17.09.1.ce will be installed
--> Processing Dependency: nvidia-container-runtime = 2.0.0-1.docker17.09.1 for package: nvidia-docker2-2.0.3-1.docker17.09.1.ce.noarch
--> Running transaction check
---> Package nvidia-container-runtime.x86_64 0:2.0.0-1.docker17.09.1 will be installed
--> Processing Dependency: nvidia-container-runtime-hook < 2.0.0 for package: nvidia-container-runtime-2.0.0-1.docker17.09.1.x86_64
--> Running transaction check
---> Package nvidia-container-toolkit.x86_64 0:1.0.5-2 will be installed
--> Finished Dependency Resolution
5. 无须每次加带sudo
执行docker
命令的设置(为了消除非管理员用户执行docker
命令的sudo
请求)
在root权限下,将当前用户名加入到·docker·组即可,
[root@tsmclab ~]# gpasswd -a $USER docker
执行该操作后,用户在下次重新登录时方可生效。如果是刚刚安装的docker
,要是还没有 docker
组那就先添加一个docker
组:
[root@tsmclab ~]# groupadd docker
6.镜像拉取
tensorflow相应的镜像从“ https://hub.docker.com/r/tensorflow/tensorflow/tags ”选择拉取,例如拉取tf1.8 gpu版本,python3解释器,
[root@localhost ~]# docker pull tensorflow/tensorflow:1.8.0-gpu-py3
pytorch相应的镜像从“ https://hub.docker.com/r/pytorch/pytorch/tags ”中选择拉取。
7. 容器的创建与运行
通过如下命令将以交互模式从test/ubuntu:v1.0
镜像中创建并启动一个新容器,在容器内执行/bin/bash
命令,并将容器命名为tsmc
, 指定容器的hostname
为tsmclab
:
$ docker run --name tsmc -h tsmclab -it test/ubuntu:v1.0 /bin/bash
如果需要映射主机目录到容器目录,可以如下执行(例如主机的目录/home/sumihui/dataset
映射到容器的/media
):
$ docker run -v /data:/data --name tsmc -h tsmclab -it test/ubuntu:v1.0 /bin/bash
注意:/bin/bash 后面不再接任何命令,即/bin/bash已经结尾了,否则接的内容会被当成bash脚本执行
对于使用了NVIDIA cuda镜像的容器,必须使用nvidia-docker
命令建立容器(否则会报找不到libcuda.so.1,从而无法使用GPU算力):
抱歉安装nvidia-docker后一直报告:
[root@localhost ~]# nvidia-docker -h
/usr/bin/nvidia-docker: line 34: /usr/bin/docker: Permission denied
/usr/bin/nvidia-docker: line 34: /usr/bin/docker: Success
所以下面这种命令方式目前不可用,
$ nvidia-docker run -v /home/tsmc/sumihui/dataset:/media --name tsmc_docker -h tsmclab -it tensorflow/tensorflow:1.8.0-gpu /bin/bash
请改用如下命令,使用runtime命令行参数以指定使用GPU:
$ docker run --runtime=nvidia -v /home/tsmc/sumihui/dataset:/media --name tsmc_docker -h tsmclab -it tensorflow/tensorflow:1.8.0-gpu /bin/bash
【容器自动创建脚本】为了防止新手在不熟悉命令的情况下产生误操作,用户可在自己的主目录下创建一个bash脚本,命名为build_docker_container.sh
, 写入以下内容:
#!/bin/bash
DATE=$(date +%Y%m%d%H%M)
container_name="${USER}_${DATE}"
bind_dir="dataset"
image="tensorflow/tensorflow:1.8.0-gpu-py3"
cd ~
if [ -d ${bind_dir} ]; then
# echo "Detects folder exists"
break
else
mkdir -v -p ${bind_dir}
fi
docker run --runtime=nvidia
-v /home/tsmc/$USER/${bind_dir}:/media
--name ${container_name}
-h tsmclab
-it ${image} /bin/bash
用户可修改脚本5行的内容,例如修改容器的名字,例如container_name="tsmc_docker", 修改镜像名:image=“pytorch/pytorch:latest”,修改容器要关联的宿主机目录为自己的下载目录:bind_dir="Downloads"。
保存并执行便可自动从已有的镜像中创建一个新的容器。
8. 容器源更新:
更换/etc/apt/sources.list为阿里镜像源,然后执行update命令,如果遇到下面这种卡住的情况:
root@tsmclab:/home# apt update
Get:1 http://mirrors.aliyun.com/ubuntu xenial InRelease [247 kB]
.......
Get:39 http://mirrors.aliyun.com/ubuntu xenial-security/universe amd64 Packages [590 kB]
Get:40 http://mirrors.aliyun.com/ubuntu xenial-security/multiverse amd64 Packages [6283 B]
0% [Working]
可以退出先执行如下操作,然后再更新源:
root@tsmclab:/home# apt clean
root@tsmclab:/home# cd /etc/apt/
root@tsmclab:/etc/apt# rm -r /etc/apt/sources.list.d
root@tsmclab:/etc/apt# apt update
完成后即可正常安装软件了,以安装vim为例:
root@tsmclab:/etc/apt# apt install vim
限制容器CPU资源占用
控制已经创建的单一容器内所有运行进程最大CPU资源占用比为300%(比例自行协商分配):
$ docker container update --cpu-period 100000 --cpu-quota 300000 <容器名>
系统用户监控日志
在/media/secureLog
目录下建立监控日志(监控内容涵盖所有人登录IP、操作历史), 向/etc/profile
末尾增加写入如下shell脚本程序即可:
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
PRE_ID=`whoami`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /media/secureLog ]
then
mkdir /media/secureLog
chmod -R 777 /media/secureLog
fi
if [ ! -d /media/secureLog/${LOGNAME} ]
then
mkdir /media/secureLog/${LOGNAME}
chmod 770 /media/secureLog/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "+%Y%m%d%H%M"`
export HISTFILE="/media/secureLog/${LOGNAME}/${PRE_ID}-${DT}.log.${USER_IP}"
当然,Linux可以通过/var/log/wtmp
文件来查看可疑IP登陆
$ last -f /var/log/wtmp
该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大。查看/var/log/secure
文件寻找可疑IP登陆次数。
多用户系统的资源平衡分配(宿主机):
1. 使用cgroups限制cpu资源实例,以避免某个进程占据所有cpu资源
场景: 在一个机器上运行多个可能消耗大量资源的程序时,我们不希望出现某个程序占据了所有的资源,导致其他程序无法正常运行,或者造成系统假死无法维护。特别是考虑到设备将用于多人使用,这更需要对所有用户进行适当的控制,以便在繁忙的时候,所有在运行用户都可以获得均衡的计算资源。这时候用 cgroups 就可以很好地控制进程的资源占用。
cgroups 里,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 来限制该组中的所有进程在单位时间里可以使用的 cpu 时间。这里的 cfs 是完全公平调度器的缩写。cpu.cfs_period_us 就是时间周期,默认为 100000,即百毫秒。cpu.cfs_quota_us 就是在这期间内可使用的 cpu 时间,默认 -1,即无限制。
我们主要对用户运行的实例进行资源控制,先进入到系统cgroup文件目录区域:
[root@localhost ~]# cd /sys/fs/cgroup/cpu
[root@localhost cpu]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 17 15:56 cgroup.clone_children
--w--w--w-. 1 root root 0 Nov 17 15:56 cgroup.event_control
-rw-r--r--. 1 root root 0 Nov 17 15:56 cgroup.procs
-r--r--r--. 1 root root 0 Nov 17 15:56 cpuacct.stat
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpuacct.usage
-r--r--r--. 1 root root 0 Nov 17 15:56 cpuacct.usage_percpu
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Nov 17 15:56 cpu.shares
-r--r--r--. 1 root root 0 Nov 17 15:56 cpu.stat
-rw-r--r--. 1 root root 0 Nov 17 15:56 notify_on_release
-rw-r--r--. 1 root root 0 Nov 17 15:56 tasks
先备份原始的文件,然后我们修改cpu.cfs_quota_us文件中的数值为cpu.cfs_period_us中数值的3倍(因为我们有12核心,总算力是1200%),表示每个用户所有进程的总cpu 占用被限制为cpu总算力的四分之一即300% :
[root@localhost cpu]# cat cpu.cfs_period_us
100000
[root@localhost cpu]# cat cpu.cfs_quota_us
-1
[root@localhost cpu]# vim cpu.cfs_quota_us
300000
严格来说,因为我们规划使用docker,而在docker中运行的程序都是root进程,因此这个设置没有意义。仅对宿主机程序运行有用,容器的限制请参考前一节《限制容器CPU资源使用》。
客户端:
推荐VS Code, 配置“Remote - SSH”插件等,参考 腾讯技术工程的专栏文章“https://zhuanlan.zhihu.com/p/96819625”
或者使用SecureCRT、MobaXterm
在CentOS中安装FTP服务(参考链接 )
切换到root登录以执行以下命令:
step1:安装vsftpd
服务
[root@tsmclab ~]# yum install vsftpd
step2: 启用vsftpd
服务
[root@tsmclab ~]# systemctl start vsftpd
[root@tsmclab ~]# systemctl enable vsftpd
step3:检查FTP服务状态
[root@tsmclab ~]# systemctl status vsftpd
step4:在/etc/vsftpd/vsftpd.conf
中配置vsftpd
VSFTPD配置文件"vsftpd.conf"位于"/etc/vsftpd"目录下,修改之前先对原始文件进行备份。
[root@tsmclab ~]# cd /etc/vsftpd/
[root@tsmclab vsftpd]# cp vsftpd.conf vsftpd.conf.origbackup
使用vim编辑配置文件"vsftpd.conf"中的以下项,使得仅Linux系统本地用户可以访问FTP服务:
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES
按如下方式配置"write_enabel"项,以允许写文件,配置chroot_local_user
项以阻止FTP用户访问他们主目录之外的其它文件:
write_enable=YES
chroot_local_user=YES
为每个用户配置自己的FTP上传目录(注意,请先设置好chroot_local_user
项),在"vsftpd.conf"文件末尾追加以下行:
# Here we configure FTP directories to allow upload when chroot enabled. This is the recommended method.
user_sub_token=$USER
local_root=/home/$USER/ftp
默认vsftpd能够使用任意端口访问FTP连接,这里提供一个限制vsftpd最大最小端口范围的配置:
pasv_min_port=40000
pasv_max_port=41000
为了限制用户及其登录行为,在 “userlist_enable=YES”这一行的后面添加以下行:
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
保存以上编辑并退出,重启VSFTPD服务:
[root@tsmclab vsftpd]# systemctl restart vsftpd
step5:配置防火墙
允许FPT端口通过防火墙,并重启防火墙
[root@tsmclab vsftpd]# firewall-cmd --permanent --add-port=20-21/tcp
[root@tsmclab vsftpd]# firewall-cmd --permanent --add-port=40000-41000/tcp
[root@tsmclab vsftpd]# firewall-cmd --reload
执行第一行命令时,如果碰到提示“ModuleNotFoundError:No module named ‘gi’”, 则是由于python版本非系统自带的2.7导致该文件执行有误 ,解决方法是修改"/usr/bin/firewall-cmd"文件中的第一行
python
为python2.7
:
[root@tsmclab ~]# vim /usr/bin/firewall-cmd
#!/usr/bin/python2.7 -Es
# -*- coding: utf-8 -*-
保存并退出再次执行firewall-cmd
即可 ,若产生新提示"FirewallD is not running", 则再查找firewall
的绝对路径:
[root@tsmclab ~]# which firewalld
/sbin/firewalld
修改firewall-cmd文件中的第一行python为python2.7,完成后继续执行上述命令行操作即可:
[root@tsmclab ~]# which firewalld
/sbin/firewalld
[root@tsmclab ~]# vim /usr/sbin/firewalld
#!/usr/bin/python2.7 -Es
step6:配置FTP用户
若用户不在Linux用户表中,请先新建Linux用户,然后将Linux用户添加到FTP用户列表中,在目录/etc/vsftpd
下编辑user_list
文件追加用户名即可:
vim /etc/vsftpd/user_list
step7:使用FTP客户端访问FTP服务
可使用开源软件工具“ FileZilla ”访问服务