本次所有的安装包已经放到了百度网盘:链接:pan.baidu.com/s/1btlHio5p…
提取码:1234
背景
公司有一台闲置的电脑主机,所以想要将其windows系统重装为纯linux系统试一试。
本来想使用老毛桃之类的U盘安装系统工具,使用PE桌面安装,这需要我们将U盘格式化。经过测试,只有格式化FAT格式的时候,PE桌面模拟安装选项才能成功;而FAT格式又要求文件传送不能超过4G,所以我找了个不到4G的CentOS mini镜像。
终于一切准备就绪,模拟安装显示也能够成功,开启了正式安装,但是mini镜像又显示识别不了。
这通折腾基本全部宣告失败,网上的文档也查了不少,但是也都没能解决我的问题,最后使用将U盘做启动盘,即不存在PE桌面工具的情况,达到直接使用U盘系统就能进入linux安装界面的目的。
步骤
1、制作U盘系统安装盘
随便在网上找个U盘系统制作工具,本次找了一个镜像文件写入U盘工具,这个过程没有什么难度;附上一张我的工具的截图:这个工具已经放到文章开头的百度网盘分享链接里。
当我们写入成功的时候我们将U盘插在电脑上,进入电脑的BIOS模式,选择U盘系统启动,然后我们就会进入熟悉的linux安装界面,就像测试时VMware起虚拟机一样的安装界面。选择第一个安装选项,回车,但是安装过程到后面会卡住失败。
我猜测的原因是我们选择了BIOS模式启动U盘系统,这个时候可能还是windows系统在做主导角色,随着linux系统开始慢慢安装成功,linux系统将变为主导角色。但是linux系统明显是无法直接识别U盘的,就会导致安装中断。这个想法大概不准确,但是姑且这么理解这个逻辑吧。
2、确定U盘标签
上面的步骤虽然会失败,但是我们不要手动中断耐心等待,直到提示说安装失败,并且会引导我们进入linux的抢救模式(emergency),这个时候我们就可以查看一下 /dev 下面的文件,查看我们的U盘1的标签是什么。
查看方法:/dev 下面会有我们主机的所有磁盘,命名规则就是 sd+一个字母+数字 ,即sd后面是从a到z的一个字母,再往后是一个数字。我们的U盘肯定就是sd+最靠后的字母+1。
例如 /dev 下面有 sda sda1 sda2 sda3 sdb sdb1 sdc sdc1,那我们的U盘标签就是sdc1。
3、指定U盘启动盘
当我们知道U盘标签是哪个之后,我们就可以执行reboot重启命令了,再次来到安装界面:
- 按键盘 e键
- 在第二行这最长行的末尾将 =: 之后,最后一个单词(quiet还是什么的)之前的内容全部替换为 /dev/sdn1 (sdn1就是U盘的标签)。也就是说将 “=: label: ... ... quiet” 中黑色加粗的内容替换掉。
- 按 ctrl+x
4、执行安装
执行完3之后,我们再次来到安装界面,并且可以顺利的安装下去,但是到下面这个界面,可以注意到下面所指的网卡设备是空的(截图上有ens33,是我后面截的图用来在次说明),但是我们仍然执行安装完毕。
5、确认无网卡驱动
这时候我们安装完成之后,顺利进入了命令行,看着一切正常,但是电脑主机插着网线也上不了网,使用 ip address show、nmtui、ifconfig、nmcli connection之类的命令,包括复制网络配置文件都没用,看不到ens33或者eth0,只能看到lo回环网卡,这就需要我们安装我们的网卡对应的linux驱动了。
但是安装网卡驱动之前需要知道我们的网卡的型号,如果知道,可以直接开始执行第8步百度下载对应的驱动,如果不知道,就需要使用pciutils工具来查询。而安装 pciutils 需要用到 gcc 和 make 工具,make 一般系统自带,gcc 需要安装,下面开始安装 gcc。
6、安装gcc及依赖
安装网卡之前首先我们要安装gcc,gcc在有网络的情况下安装十分简单,但是像现在这样没有网络的时候就需要我们使用U盘将安装包拷贝到该服务器上,然后进行安装。 gcc安装包已经放到文章开头的百度网盘分享链接里。
将这些安装包用U盘拷贝到服务器上,拷贝方法:
首先我们使用windows服务器将七个包拷贝到一个U盘里面,这个时候如果将这个U盘插到linux服务器上,我们也是不能用的;我们要像第三步一样,先打开 /dev 目录,然后插上U盘确认新增的sdnX,得知U盘是哪个之后,使用mount命令将其挂载到某个目录,这时候我们就可以把这些文件拷贝出来使用了。
当我们需要拔下来的时候最好先umount,然后再拔,并且拔掉之后删除U盘的/dev/sdxn方便我们下次使用,否则下次可能会出现挂载失败的情况。这里注意我们最好把U盘格式化FAT格式,这样linux更加支持。
将这些安装包复制放到一个目录下,然后在该目录执行下面的命令:
rpm -ivh *.rpm --nodeps --force # 使用该命令可以直接安装gcc
gcc -v # 输出gcc版本就说明安装正确
或者可以按照下面的顺序逐个进行安装,安装完成之后使用 gcc -v 验证:
- rpm -ivh mpfr-3.1.1-4.el7.x86_64.rpm
- rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm
- rpm -ivh kernel-headers-3.10.0-862.el7.x86_64.rpm
- rpm -ivh glibc-headers-2.17-222.el7.x86_64.rpm
- rpm -ivh glibc-devel-2.17-222.el7.x86_64.rpm
- rpm -ivh cpp-4.8.5-28.el7.x86_64.rpm
- rpm -ivh gcc-4.8.5-28.el7.x86_64.rpm
7、安装pciutils确认网卡类型
pciutils是一个查看系统中所有PCI总线以及连接到该总线上的设备的工具,这是该工具的github的地址:github.com/pciutils/pc…
该tar包也已经放到文章开头的百度网盘分享链接里。 下载tar包,将其解压,就可以使用 lscpi 命令。
[root@localhost ~]# tar -xf pciutils-3.7.0.tar.gz
[root@localhost ~]# lspci | grep -i ethernet
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 04)
可以看到这里我的服务器的网卡是 RTL8125 2.5Gigabit Ethernet。
8、根据自己的网卡类型下载对应的linux网卡驱动
我们获取到自己的网卡的型号之后我们就可以在网上搜索对应的linux网卡驱动了,本次我的驱动的地址:www.realtek.com/en/componen…,下载其中的:
本次已经将我的网卡驱动放到开头的百度网盘链接里面,r8125-9.006.04.tar.bz2
9、下载网卡驱动并将其拷贝到linux机器
然后我们就可以使用U盘拷贝的方法将其拷贝到linux机器上,接下来就要安装该驱动。但是这里这个网卡驱动是bzip2格式,需要我们安装同名安装包,安装bzip2安装包之后再安装网卡驱动。bzip2的安装包也已经放到文章开头的百度网盘分享链接里。
10、解压网卡驱动文件并进行安装(第一次报错)
在我们用U盘将网卡驱动文件拷贝到linux机器上之后,我们先解压,解压之后进入目录,可以看到有一个脚本autorun.sh,执行这个脚本就可以执行安装。
但是我们现在执行一般是成功不了的,这次我出现了报错,说:
/lib/modules/3.10.xxxxxxxxxx/build 找不到,其实我们这个文件是有的,报这个错是因为这个文件是个软连接,但是连接源不存在,我们查看他的源地址,/usr/src/kernels/3.10.0-1160.el7.x86_64,这个时候我们如果打开这个源发现不存在,这就是问题所在。
11、寻找自己内核版本安装包,并安装内核包的依赖包perl
在安装kernel之前,我们是需要先安装依赖的,kernel的依赖是要安装perl的,我们要先下载安装包,然后源码编译安装。perl安装包已经放到文章开头的百度网盘分享链接里。
tar zxvf perl-5.12.2.tar.gz
mkdir /usr/local/perl #创建安装目录
./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uversiononly
make
make install
cd /usr/bin
mv perl perl.old #把旧的版本的perl更名为perl.old
ln -s /usr/local/perl/bin/perl /usr/bin/perl #做一个软连接
perl -version #查看版本,确认安装成功
12、安装自己版本的内核包
下载地址:centos.pkgs.org/7/centos-x8…
本次我查看自己的内核之后下载的 kernel-devel-3.10.0-1160.el7.x86_64.rpm ,该包也在文章开头的百度网盘分享链接里,但是未必和你适用,所以要确认自己对应的版本,将其下载下来,同样用U盘将其拷贝到根目录下,然后执行:
rpm2cpio kernel-devel-3.10.0-1160.el7.x86_64.rpm | cpio -div
# 这时候就会产生/usr/src/kernels/3.10.0-1160.el7.x86_64这个目录,上面找不到的软连接也就找到了
ln -sv /usr/src/kernels/3.10.0-1160.el7.x86_64/ /lib/modules/3.10.0-1160.el7.x86_64/build
# 新建软连接,其实这步不新建也可以,做个拓展
13、再次执行安装网卡驱动脚本(脚本文件需要修改,第二次报错)
我们再次执行网卡驱动安装 ./autorun.sh,这个时候还会报错:
对于三个error,首先我们可以看到前面有指出文件和对应的行数:
第一个error,错误提示:/src/r8125.h:69:20 error: redefinition of 'ether_addr_copy' static inline void ether_addr_copy。我们就需要在网卡解压后的目录下的src/r8125.h的69行,将:
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
//改为
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
第二个error,错误提示:r8125_n.c:11777:9 error :unknown field 'ndo_change_mtu' specified in initializer。
vi /usr/src/kernels/3.10.0-1160.el7.x86_64/include/linux/netdevice.h
# 在全篇查询ndo_change_mtu,我这里查到的是ndo_change_mtu_rh74,然后我们编辑/src/r8125_n.c:
vi r8125_n.c
# 在11777行,将键值对的键后面补充上rh74,这是官方承认的bug
第三个errorr,错误提示8125_n.c:14588:28 error 'struct net_device' has no member named 'last_rx'
同样的我们打开src/8125_n.c,在14588行,这个是内核的版本问题,我们用"//"直接注释掉就可以了。
14、再次执行安装网卡驱动脚本
这次我们执行成功了,ifconfig就可以看到有了网卡,怎么添加ip这里就不再赘述。
最后
本次重装踩的坑不少,但是总的来说做成了,但是也要谨慎。
因为其中像找linux版本的网卡驱动这样的事,最好提前找找看看,防止到时候找不到半途而废。
而且系统出问题重装也比较麻烦,不像windows那么简单,所以我认为还是用windows系统装虚拟机,或者有什么双系统的方法更稳妥一些。
本文有什么错误需要改正或者改进的地方欢迎指出。