物理机安装Linux系统采坑记录

此处物理机指普通的PC电脑和笔记本非服务器

基础知识

boot是可引导bai光盘,iso是国际标du准光盘格式(全世界zhi能读DVD的设备都支持),udf是统一光盘dao格式(Universal Disc Format,全世界能读DVD的设备绝大多数都支持)

通常电脑主板支持两种模式 UEFI和BIOS

UEFI

百科

BIOS

百科

UEFI Bios支持两种启动模式

Legacy+UEFI启动模式和UEFI启动模式,其中Legacy+UEFI启动模指的是UEFI和传统BIOS共存模式,可以兼容传统BIOS引导模式启动操作系统;UEFI启动模式只是在UEFI引导模式启动操作系统。

  选定启动模式并安装操作系统,安装后只能使用设定的模式,用于启动操作系统;
  操作系统安装时使用Legacy+UEFI模式,兼容在传统BIOS引导模式启动操作系统;
  操作系统安装时使用UEFI引导模式,只能在UEFI引导模式启动操作系统。

Legacy+UEFI模式与UEFI模式的区别

    1、Legacy+UEFI启动模式是基于某些电脑硬件设备和操作系统(如WinXP/7)还不支持基于UEFI BIOS的情况,考虑从传统BIOS引导模式启动。传统BIOS引导模式允许Hba,模块设备使用Rom选项。

    2、UEFI启动模式用于操作系统自动从预启动的操作环境,加载到一种操作系统上,从而使开机程序化繁为简,节省时间。并且支持2T以上硬盘,加强对硬件的支持

boot.iso为网络安装版,dvd1为完整安装版

linux刻录

dd bs=4M if=ubuntu-19.10-desktop-amd64.iso of=/dev/sdc status=progress
2463842304字节(2.5 GB)已复制, 587.050253 s, 4.2 MB/s
记录了587+1 的读入
记录了587+1 的写出
2463842304字节(2.5 GB)已复制,587.361 秒,4.2 MB/秒

bs代表字节为单位的块大小 if镜像文件 of输出设备 status=progress 显示进度

刻录centos8时无法启动,iso文件正常是阿里云下载的使用file命令查看包含MBR分区信息,最后发现问题是文件系统问题,用linux刻录linux系统时推荐是ext4文件系统,也可能只有centos8的镜像有这个问题,其它版本和系统没有验证

file CentOS-8.2.2004-x86_64-dvd1.iso

CentOS-8.2.2004-x86_64-dvd1.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 23800, 20380 sectors

在dd后,需要把优盘再次格式化为fat32文件系统,参考

出现isolinux.bin missing or corrupt错误

参考

linux下制作u盘启动盘

是因为磁盘目录 of=/dev/sdc 末尾有数字需要去掉

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdd4  *      256 125033618 125033363 59.6G  c W95 FAT32 (LBA)

fdisk -l 显示的磁盘末尾有4 刻录时选择输出路径则为 of=/dev/sdd

windows使用软碟通刻录

启动时汇报启动脚本超时无法发现/dev/root,原因是软碟通会把U盘的标签就是驱动器名称会截断比如centos-8-2-2004-x86_64 截断成centos8-2与启动项的不一致,解决方法百度有很多。个人推荐刻录windows启动盘就用windows支持的文件系统使用windows系统刻录,同理linux就用linux支持的文件系统使用dd刻录

Virtual Box (Linux) 安装增强模式

参考

  • https://www.jianshu.com/p/7c556c783bb2
  • https://www.cnblogs.com/mychangee/p/12087954.html

centos

1.点击设备->安装增加功能->下载增加镜像,底部镜像按钮挂载VBoxGuestAddtions.iso 运行

2.运行后报错,没有安装内核,需要安装内核和gcc 并且保持kernel 和kernel-devel版本一致

yum install -y kernel-devel kernel-headers gcc make

yum -y upgrade kernel kernel-devel

reboot

uname -r //查看当前启动的内核版本

rpm -qa | grep kernel-[0-9] //查看全部的内核

yum remove xxxx //删除旧版本内核

或者可以使用下面两个命令中的一个安装和Linux内核版本匹配的kernel-devel

yum install -y "kernel-devel-uname-r == $(uname -r)"

yum install -y kernel-devel-xxxx 

centos 8 报错

https://github.com/geerlingguy/packer-centos-8/issues/4

$ cat /var/log/vboxadd-setup.log
Building the main Guest Additions 6.0.12 module for kernel 4.18.0-80.7.1.el8_0.x86_64.
Error building the module.  Build output follows.
make V=1 CONFIG_MODULE_SIG= -C /lib/modules/4.18.0-80.7.1.el8_0.x86_64/build M=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j1 modules
Makefile:958: *** "Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel".  Stop.
make: *** [/tmp/vbox.0/Makefile-footer.gmk:111: vboxguest] Error 2
Could not find the X.Org or XFree86 Window System, skipping.
modprobe vboxguest failed
yum(dnf)install -y elfutils-libelf-devel elfutils-libelf-devel.x86_64

sh VBoxLinuxAdditions.run

ubuntu desktop

#先更新
sudo apt update && sudo apt upgrade

安装增加功能

同 centos 设备 >> 安装增强功能

#根据报错信息安装如下包

sudo apt install gcc make perl

#ubuntu24.04 需要安装bzip2

sudo apt install bzip2

点击挂在的光盘,运行增强程序

共享文件夹

挂载点要设置到登录用户的家目录/home/xxx/dirname 下,会自动创建文件夹,使用chmod和chown 修改权限无效

使用如下命令手动挂载方式,可以更改权限目录

sudo mount -t vboxsf downloads /home/www/share

ubuntu server

Centos7 升级openssh8.3

参考

通过虚拟机下载提取安装包(有的机房禁止访问外网)

yum install --downloadonly --downloaddir=rpm gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel krb5-devel
cd rpm

rpm -ivh autoconf-2.69-11.el7.noarch.rpm cpp-4.8.5-39.el7.x86_64.rpm gcc-4.8.5-39.el7.x86_64.rpm gcc-c++-4.8.5-39.el7.x86_64.rpm glibc-devel-2.17-307.el7.1.x86_64.rpm glibc-headers-2.17-307.el7.1.x86_64.rpm kernel-headers-3.10.0-1127.18.2.el7.x86_64.rpm keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm libcom_err-devel-1.42.9-17.el7.x86_64.rpm libkadm5-1.15.1-46.el7.x86_64.rpm libselinux-devel-2.5-15.el7.x86_64.rpm libsepol-devel-2.5-10.el7.x86_64.rpm libstdc++-devel-4.8.5-39.el7.x86_64.rpm libverto-devel-0.2.5-4.el7.x86_64.rpm m4-1.4.16-10.el7.x86_64.rpm openssl-devel-1.0.2k-19.el7.x86_64.rpm pam-devel-1.1.8-23.el7.x86_64.rpm pcre-devel-8.32-17.el7.x86_64.rpm zlib-devel-1.2.7-18.el7.x86_64.rpm krb5-devel-1.15.1-46.el7.x86_64.rpm

下载openssh8.3p1 和 openssl-1.1.9.tar.gz

wget -c https://ftp.openssl.org/source/openssl-1.1.1g.tar.gz

wget -c https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/openssh-8.3.tar.gz

解压并编译安装openssl

openssl version #查看当前版本,等升级完对比
OpenSSL 1.0.2k-fips  26 Jan 2017

mv /usr/bin/openssl /usr/bin/openssl_bak #备份
mv /usr/include/openssl /usr/include/openssl_bak #备份

tar -zxvf openssl-1.1.1g.tar.g
cd openssl-1.1.1g/
./config --prefix=/usr/local/ssl -d shared && make && make install

echo $?  #echo $?查看下最后的make install是否有报错,0表示没有问题
0

ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl  #生成软链接
ln -s /usr/local/ssl/include/openssl /usr/include/openssl  #生成软链接

ll /usr/bin/openssl #查看是否生成成功
/usr/bin/openssl -> /usr/local/ssl/bin/openssl

ll /usr/include/openssl -ld #查看是否生成成功
/usr/include/openssl -> /usr/local/ssl/include/openssl

#执行下面命令加载配置
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig

openssl version #查看确认版本

如果出现openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

#查找libssl.so.1.1的目录 然后生成软链接
find / -name "libssl.so.1.1"
/usr/local/lib64/libssl.so.1.1

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1  /usr/lib64/libcrypto.so.1.1

解压并安装openssh

ssh -V #查看ssh版本
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

tar -zxvf openssh-8.3p1.tar.gz
cd openssh-8.3p1
chown -R root.root /root/openssh/openssh-8.3p1 #更改当前目录所属用户和用户组为root

rm -rf /etc/ssh/* #删除原先ssh的配置文件和目录
./configure --prefix=/usr/ --sysconfdir=/etc/ssh  --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl   --with-zlib   --with-md5-passwords   --with-pam  && make && make install #配置编译安装

#如果遇到权限问题 permission 0640 for xxxx 将报权限问题的目录都设为600
chmod -R 0600 /etc/ssh/ssh_host_ecdsa_key

echo $? #同上
0

#修改sshd配置
vim /etc/sshd_config
PermitRootLogin yes
UseDNS no

#从安装目录cp文件到目标位置
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
#设置执行权限
chmod +x /etc/init.d/sshd

#添加启动项
chkconfig --add sshd
systemctl enable sshd
#把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
mv /usr/lib/systemd/system/sshd.service  /tmp/
#设置开机启动
chkconfig sshd on

#重启sshd
systemctl restart sshd.service

#查看sshd是否启动
netstat -lntp

#测试版本
ssh -V
OpenSSH_8.3p1, OpenSSL 1.1.1g  21 Apr 2020

Linux 安装 FFmpeg

参考

Ubuntu

sudo apt install ffmpeg apt包

sudo snap install ffmpeg snap包

ffmpeg -version

Centos8

安装sdl软件包

SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,

适用于 游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件

没有sdl包的情况下安装ffmpeg时,dnf会提示缺少libSDL2-2.0.so.0()

https://mirrors.aliyun.com/centos/8/PowerTools/x86_64/os/Packages/SDL2-2.0.10-2.el8.x86_64.rpm

安装rpmfusion仓库

dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm 

如果没有rpmfusion这个仓库,安装ffmpeg时dnf会提示找不到匹配

dnf包管理工具安装ffmpeg

dnf install ffmpeg

ffmpeg -version

Centos7

RPM Fusion存储库

参考 How to Install and Use FFmpeg on CentOS 7

#依赖epel存储库,安装epel存储库
sudo yum install epel-release -y
sudo yum update -y

#安装启用RPM Fusion
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm

#安装ffmpeg 
sudo yum install ffmpeg ffmpeg-devel

#查看版本
ffmpeg -version
ffmpeg version 3.4.8 Copyright (c) 2000-2019 the FFmpeg developers

经测试这个仓库速度很慢

Nux Dextop YUM 存储库

参考 How to Install FFmpeg on CentOS

#依赖epel存储库,安装epel存储库
sudo yum install epel-release -y
sudo yum update -y

#安装Nux Dextop存储库
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

#安装ffmpeg
sudo yum install ffmpeg ffmpeg-devel -y

#查看版本
ffmpeg -version
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers

经测试这个仓库速度有时候也很慢

源码编译安装ffmpeg

Ubuntu 卸载多余的内核版本

参考

安装包安装卸载方式

  • 1.sudo dpkg –get-selections | grep ‘linux’
  • 2.sudo apt purge + image/headers名称

手动安装卸载方式

  • 1.删除/lib/modules/目录中以内核版本号为名称的目录
  • 2.删除/usr/src/linux/目录中并不需要的内核源码
  • 3.删除/boot目录中启动内核的和内核的映像文件
  • 4.sudo update-grub,更新内核启动列表

PHP如何获取HTTP请求(内容)

参考

写这篇文章的起因,逛论坛读到一位博主的成长感悟,说他面试,被一个问题卡住了。PHP接受GET,POST请求分别$_GET,$_POST或$_REQUEST ,那么PHP如何接受PUT,PATCH,DELETE,OPTIONS请求。

引申问题PHP如何处理(接收)HTTP请求?

前置知识只是HTTP请求方法有哪些?https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods

HTTP1.0: GET POST HEAD
HTTP1.1: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE 
HTTP2.0: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE

PHP原生方法如何获取请求参数

$_GET,$_POST,$_REQUEST,file_get_content('php://input')

GET请求

GET query param $_GET $_REQUEST 可以获取

GET x-www-form-urlencoded php://input 可以获取

GET Form-data php://input 可以获取

GET application/json php://input 可以获取

POST请求

POST query param $_GET 和 $_REQUEST 可以获取

POST x-www-form-urlencoded $_POST $_REQUEST php://input 可以获取

POST Form-data $_POST $_REQUEST 可以获取

POST application/json php://input 可以获取

PUT 请求

PUT query-param $_GET 和 $_REQUEST 可以获取

PUT x-www-form-urlencoded php://input 可以获取

PUT form-data php://input 可以获取

PUT application/json php://input 可以获取

PATCH 请求

PATCH query-param $_GET 和 $_REQUEST 可以获取

PATCH x-www-form-urlencoded php://input 可以获取

PATCH form-data php://input 可以获取

PATCH application/json php://input 可以获取

DELETE 请求

DELETE query-param $_GET 和 $_REQUEST 可以获取

DELETE x-www-form-urlencoded php://input 可以获取

DELETE form-data php://input 可以获取

DELETE application/json php://input 可以获取

Laravel框架如何处理HTTP请求

支持的请求方法和数据交互类型

请求类型支持的请求方法说明
query paramGET,POST,PUT,DELETE,PATCH,OPTIONS查询字符串, 即url ? 后边的参数&和=拼接
url带数值GET,POST,PUT,DELETE,PATCH,OPTIONS通过/分割的 示例/xxx.com/user/1 1就是参数值通过/分割的 示例/xxx.com/user/1 1就是参数值
form-dataPOSTmultipart/form-data 支持二进制数据上传文件必须使用此类型
x-www-form-urlencoded (form)POST,PUT,DELETE,PATCH,OPTIONSapplication/x-www-form-urlencoded 数据被编码成以 ‘&’ 分隔的键-值对
appliction/jsonGET,POST,PUT,DELETE,PATCH,OPTIONSjson类型

获取方法

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 存储一个新用户
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request,$id)
    {   
        //接受所有类型参数,无法获取上传文件
        $name = $request->input('name');
        //仅能接受查询字符串参数,?号后的参数
        $name = $request->query('name');
        //接受所有类型参数,包含上传文件,动态属性获取,触发__get()魔术方法
        $name = $request->name;
        //获取上传文件
        $file = $request->file('file');
        //同input是底层Symfony提供的方法,无法获取上传文件
        $name = $request->get('name');
        //获取路由参数,直接访问注入的$id变量
        dump($id);
        //获取原始输入数据symfony提供的方法,等于原生php的file_get_content('php://input')
        $request->getContent() 
    }
}

原理和知识总结

  • $_GET 可以获取所有类型的query param(url传参数)
  • php://input 可以获取所有请求Body 的内容, 除post请求的form-data
  • $_POST 可以获取POST 请求的 form-data 和 x-www-form-urlencoded

laravel使用了symfony的HTTP请求类获取去请求,底层还是通过PHP超全局变量来获取请求参数

Symfony\Component\HttpFoundation\Request
/**
     * Creates a new request with values from PHP's super globals.
     *
     * @return static
     */
    public static function createFromGlobals()
    {
        //使用php超全局变量获取请求数据
        $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);

        if ($_POST) {
            $request->request = new InputBag($_POST);
        } elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
            && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
        ) {
            parse_str($request->getContent(), $data);
            $request->request = new InputBag($data);
        }

        return $request;
    }