Joyber 发布的文章

在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法。

下面所有例子的环境说明如下:

系统:Ubuntu 14.0
用户名:uusama
需要配置MySQL环境变量路径:/home/uusama/mysql/bin

Linux读取环境变量

读取环境变量的方法:+

export命令显示当前系统定义的所有环境变量
echo $PATH命令输出当前的PATH环境变量的值

这两个命令执行的效果如下

uusama@ubuntu:~$ export
declare -x HOME="/home/uusama"
declare -x LANG="en_US.UTF-8"
declare -x LANGUAGE="en_US:"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="uusama"
declare -x MAIL="/var/mail/uusama"
declare -x PATH="/home/uusama/bin:/home/uusama/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="uusama"

uusama@ubuntu:~$ echo $PATH
/home/uusama/bin:/home/uusama/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

其中PATH变量定义了运行命令的查找路径,以冒号:分割不同的路径,使用export定义的时候可加双引号也可不加。

Linux环境变量配置方法一:export PATH

使用export命令直接修改PATH的值,配置MySQL进入环境变量的方法:

export PATH=/home/uusama/mysql/bin:$PATH


# 或者把PATH放在前面
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:立即生效
生效期限:当前终端有效,窗口关闭后无效
生效范围:仅对当前用户有效
配置的环境变量中不要忘了加上原来的配置,即$PATH部分,避免覆盖原来配置

Linux环境变量配置方法二:vim ~/.bashrc

通过修改用户目录下的~/.bashrc文件进行配置:

vim ~/.bashrc

# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:使用相同的用户打开新的终端时生效,或者手动source ~/.bashrc生效
生效期限:永久有效
生效范围:仅对当前用户有效
如果有后续的环境变量加载文件覆盖了PATH定义,则可能不生效

Linux环境变量配置方法三:vim ~/.bash_profile

和修改~/.bashrc文件类似,也是要在文件最后加上新的路径即可:

vim ~/.bash_profile

# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:使用相同的用户打开新的终端时生效,或者手动source ~/.bash_profile生效
生效期限:永久有效
生效范围:仅对当前用户有效
如果没有~/.bash_profile文件,则可以编辑~/.profile文件或者新建一个

Linux环境变量配置方法四:vim /etc/bashrc

该方法是修改系统配置,需要管理员权限(如root)或者对该文件的写入权限:

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc

vim /etc/bashrc

# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/bashrc生效
生效期限:永久有效
生效范围:对所有用户有效

Linux环境变量配置方法五:vim /etc/profile

该方法修改系统配置,需要管理员权限或者对该文件的写入权限,和vim /etc/bashrc类似:

# 如果/etc/profile文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/profile

vim /etc/profile

# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/profile生效
生效期限:永久有效
生效范围:对所有用户有效

Linux环境变量配置方法六:vim /etc/environment

该方法是修改系统环境配置文件,需要管理员权限或者对该文件的写入权限:

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment

vim /etc/profile

# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/environment生效
生效期限:永久有效
生效范围:对所有用户有效

Linux环境变量加载原理解析

上面列出了环境变量的各种配置方法,那么Linux是如何加载这些配置的呢?是以什么样的顺序加载的呢?

特定的加载顺序会导致相同名称的环境变量定义被覆盖或者不生效。

环境变量的分类
环境变量可以简单的分成用户自定义的环境变量以及系统级别的环境变量。

用户级别环境变量定义文件:~/.bashrc、~/.profile(部分系统为:~/.bash_profile)
系统级别环境变量定义文件:/etc/bashrc、/etc/profile(部分系统为:/etc/bash_profile)、/etc/environment
另外在用户环境变量中,系统会首先读取~/.bash_profile(或者~/.profile)文件,如果没有该文件则读取~/.bash_login,根据这些文件中内容再去读取~/.bashrc。

测试Linux环境变量加载顺序的方法

为了测试各个不同文件的环境变量加载顺序,我们在每个环境变量定义文件中的第一行都定义相同的环境变量UU_ORDER,该变量的值为本身的值连接上当前文件名称。

需要修改的文件如下:

/etc/environment
/etc/profile
/etc/profile.d/test.sh,新建文件,没有文件夹可略过
/etc/bashrc,或者/etc/bash.bashrc
~/.bash_profile,或者~/.profile
~/.bashrc

在每个文件中的第一行都加上下面这句代码,并相应的把冒号后的内容修改为当前文件的绝对文件名。

export UU_ORDER="$UU_ORDER:~/.bash_profile"

修改完之后保存,新开一个窗口,然后echo $UU_ORDER观察变量的值:

uusama@ubuntu:~$ echo $UU_ORDER
$UU_ORDER:/etc/environment:/etc/profile:/etc/bash.bashrc:/etc/profile.d/test.sh:~/.profile:~/.bashrc

可以推测出Linux加载环境变量的顺序如下:

/etc/environment
/etc/profile
/etc/bash.bashrc
/etc/profile.d/test.sh
~/.profile
~/.bashrc

Linux环境变量文件加载详解

由上面的测试可容易得出Linux加载环境变量的顺序如下,:

系统环境变量 -> 用户自定义环境变量
/etc/environment -> /etc/profile -> ~/.profile

打开/etc/profile文件你会发现,该文件的代码中会加载/etc/bash.bashrc文件,然后检查/etc/profile.d/目录下的.sh文件并加载。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

其次再打开~/.profile文件,会发现该文件中加载了~/.bashrc文件。

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

从~/.profile文件中代码不难发现,/.profile文件只在用户登录的时候读取一次,而/.bashrc会在每次运行Shell脚本的时候读取一次。

虚拟机是群晖nas系统的VM虚拟机,创建的时候磁盘分配的是50G,然后某天又编辑了一下虚拟机,将磁盘大小直接修改成了100G
然后重启机器,df -h查看/根目录还是50G,而fdisk -l看到的分区大小是100G(这个应该是之前某人操作过的,不然也不会显示成100G,而还是原来的50G,这个文章的记录的操作就是从现在的状态开始的)

参考文章:http://linux.51yip.com/search/lvextend

#查看分区大小(50G)
df -h

#查看PG物理卷
pvscan 
PV /dev/sda3   VG ubuntu-vg       lvm2 [<99.00 GiB / <49.50 GiB free]
  Total: 1 [<99.00 GiB] / in use: 1 [<99.00 GiB] / in no VG: 0 [0   ]



#查看VG容量(可以看到还有12671没有使用呢)
vgdisplay 
--- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <99.00 GiB
  PE Size               4.00 MiB
  Total PE              25343
  Alloc PE / Size       12672 / 49.50 GiB
  Free  PE / Size       12671 / <49.50 GiB
  VG UUID               hun4gL-bgcZ-KdmW-5rkw-59o5-Miby-2inD5G


#利用 lvresize 的功能來增加LV
lvresize -l +12671 /dev/ubuntu-vg/ubuntu-lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from 49.50 GiB (12672 extents) to <99.00 GiB (25343 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.



#显示LV逻辑卷
lvdisplay 
--- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                KGk7ni-kevv-hLrb-e9QS-DSFl-x0S8-d15jWM
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2021-09-18 14:35:53 +0800
  LV Status              available
  # open                 1
  LV Size                <99.00 GiB
  Current LE             25343
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0



#查看VG容量
vgdisplay
 --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <99.00 GiB
  PE Size               4.00 MiB
  Total PE              25343
  Alloc PE / Size       25343 / <99.00 GiB
  Free  PE / Size       0 / 0   
  VG UUID               hun4gL-bgcZ-KdmW-5rkw-59o5-Miby-2inD5G


#查看分区大小(还是50G)
df -h

#LV分区重设大小
resize2fs /dev/ubuntu-vg/ubuntu-lv

#查看分区大小(已经是100G了)
df -h

fdisk -l

补充:后续又增加了400G,一共有500G了,怎么把新增加的400G加到/分区?

fdisk -l
Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
Disk model: iSCSI Storage   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 31F29E60-1C24-4CDD-9855-CD46FB8E21A9

Device       Start       End   Sectors Size Type
/dev/sda1     2048      4095      2048   1M BIOS boot
/dev/sda2     4096   2101247   2097152   1G Linux filesystem
/dev/sda3  2101248 209713151 207611904  99G Linux filesystem


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 98.102 GiB, 106296246272 bytes, 207609856 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




#思路,先分区,然后把分区的空间扩展到现有的VG,然后再增加LV的容量,最后刷新文件系统的分区大小
#先分区
fdisk /dev/sda
m (帮助菜单)
n (创建新分区,一路按几个回车)
w (保存分区表)
q (退出)




#再查看分区
fdisk -l
Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
Disk model: iSCSI Storage   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 31F29E60-1C24-4CDD-9855-CD46FB8E21A9

Device         Start        End   Sectors  Size Type
/dev/sda1       2048       4095      2048    1M BIOS boot
/dev/sda2       4096    2101247   2097152    1G Linux filesystem
/dev/sda3    2101248  209713151 207611904   99G Linux filesystem
/dev/sda4  209713152 1048575966 838862815  400G Linux filesystem


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 98.102 GiB, 106296246272 bytes, 207609856 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




#将新分区的空间追加到   ubuntu-vg 这个VG上
vgextend ubuntu-vg /dev/sda4
  Physical volume "/dev/sda4" successfully created.
  Volume group "ubuntu-vg" successfully extended

#可以看到有400G的未使用空间了
pvscan
  PV /dev/sda3   VG ubuntu-vg       lvm2 [<99.00 GiB / 0    free]
  PV /dev/sda4   VG ubuntu-vg       lvm2 [<400.00 GiB / <400.00 GiB free]
  Total: 2 [498.99 GiB] / in use: 2 [498.99 GiB] / in no VG: 0 [0   ]



#vgdisplay
vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               498.99 GiB
  PE Size               4.00 MiB
  Total PE              127742
  Alloc PE / Size       25343 / <99.00 GiB
  Free  PE / Size       102399 / <400.00 GiB
  VG UUID               hun4gL-bgcZ-KdmW-5rkw-59o5-Miby-2inD5G


#将空闲的102399个追加到  /dev/ubuntu-vg/ubuntu-lv  lv上
lvresize -l +102399 /dev/ubuntu-vg/ubuntu-lv


#lv已经有500G大小了
lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                KGk7ni-kevv-hLrb-e9QS-DSFl-x0S8-d15jWM
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2021-09-18 14:35:53 +0800
  LV Status              available
  # open                 1
  LV Size                498.99 GiB
  Current LE             127742
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0


#刷新文件系统的分区大小
resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 63
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 130807808 (4k) blocks long.



#已经/目录已经有500G了
df -h
...
/dev/mapper/ubuntu--vg-ubuntu--lv  491G   28G  444G   6% /
...

方案一:直接返回值

new Promise(function(resolve, reject) {

      setTimeout(() => resolve(1), 1000); // (*)

    }).then(function(result) { // (**)

      alert(result); // 1
      return result * 2;

    }).then(function(result) { // (***)

      alert(result); // 2
      return result * 2;

    }).then(function(result) {

      alert(result); // 4
      return result * 2;

    });

方案二:返回promise作为结果

new Promise(function(resolve, reject) {

  setTimeout(() => resolve(1), 1000);

}).then(function(result) {

  alert(result); // 1

  return new Promise((resolve, reject) => { // (*)
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) { // (**)

  alert(result); // 2

  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) {

  alert(result); // 4
});

django 3.2版本文档:

HttpRequest内置API:
https://docs.djangoproject.com/zh-hans/3.2/ref/request-response/
数据库操作API:
https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/
带表情的数据写入数据失败怎么解决:
https://blog.qqvbc.com/default/619.html
requests请求远程API代理问题、SSL问题、官方API文档:
https://blog.qqvbc.com/default/613.html
https://requests.readthedocs.io/en/latest/api/
rest风格的框架插件API文档:
https://www.django-rest-framework.org/api-guide/viewsets/

数据分页:

        page = request.POST.get('page')
        limit = request.POST.get('limit')

        querySet = articleModel.objects.all().order_by('-id')
        pager = Paginator(querySet, limit if limit else 10)
        items = []
        for item in pager.page(page if page else 1):
            items.append({id: item.id, title: item.title})

        JsonResponse({'data': data, 'count': pager.count if pager else len(data)})

报错内容类似:

django.db.utils.OperationalError: (1366, "Incorrect string value: '\xD9\x88\xDB\x95\xD8\xB3...' for column 'name' at row 1")

奇怪的是,我知道需要把数据库改为utf8mb4格式存储内容,而且也确定修改好了数据库编码问题。但应用里面死活还是报这个错误,有一点应用里面也需要配置字符集编码才能解决。

1.修改MySQL数据库、表和列,使用utf8mb4字符集(看这里怎么修改:https://blog.qqvbc.com/default/616.html
2.编辑 settings.py ,数据库配置那段里面,添加上数据库编码配置

DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.mysql',
        ...
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}