在Windows11的WSL(AlmaLinux)中使用PostgreSQL

这篇文章是关于的

为了那些将来要学习PostgreSQL的人,我们旨在提供一个简单的实习环境来准备PostgreSQL。
WSL的初始设置部分与Win11是相关的,但在WSL启动后不受Windows版本的影响。

    • WSL(AlmaLinux 8)のセットアップ

 

    • AlmaLinux on WSLの初期設定

 

    PostgreSQLのインストールと設定

我将解释这个。

另外,本文将于2023年1月发布。针对WSL,我们注意到有些文章在过去一年内的日期上已经与实际情况不符,所以请注意陈旧的知识。同时,请您逐渐考虑本文章的可信度也将逐渐减弱。

第一次使用WSL

最近的Windows系统中,我们可以使用Windows Subsystem for Linux(WSL),在个人电脑上轻松获取Linux运行环境。

使用不同于正式环境的Windows版本产品来学习在业务中使用的RDBMS感觉不太自然,但通过WSL可以在自己的Windows机器上轻松创建一个Linux版本的学习环境。在涉及到数据库的操作中,有很多任务都需要依赖于操作系统的命令,例如启动、停止和备份恢复等。因此,拥有这样一个学习环境非常有益处。

希望通过整理和分享WSL上的PostgreSQL建设步骤,帮助初学者们降低他们进入学习的难度。

安装WSL(AlmaLinux 8)

在Windows 11中,我们可以通过以下三个步骤来使用WSL。

    • Windows機能の有効化

 

    • WSLのインストール

 

    AlmaLinux 8のインストール

由于存在一些小陷阱,所以我将逐一加以解释。

1. 激活Windows功能

从开始菜单→设置→应用→可选功能→其他Windows功能中,启用以下功能。

    • Linux用Windowsサブシステム

 

    仮想マシンプラットフォーム
undefined

需要重新启动计算机并可能会运行Windows更新。

请注意:在Surface Pro 9和Windows 11中,如果同时启用这两个功能可能导致电脑无法重新启动并且功能被禁用,反复出现这种现象。如果分别启用其中一个功能,重新启动并且应用所有的Windows更新,然后再启用另一个功能,就可以成功操作。

2. 安装WSL

在Windows 10上,有关安装Windows终端以及类似”wsl –install”的命令的信息有很多,但在Windows 11上准备工作相当简单。
只需要在Microsoft Store中安装以下两个应用程序。按照以下顺序进行:首先获取WSL并启动,然后获取并启动Alma。

    • Windows Subsystem for Linux(WSL)

 

    AlmaLinux 8 WSL(ディストリビューション)
undefined

我从 Store 下载安装后,点击了“打开”按钮,于是WSL首次启动。内部处理开始运行,变成可用状态。
然后我获取了我喜欢的发行版,我选择了在我的工作中熟悉的RHEL系列的Alma。

请注意:实际上,获取Microsoft Store版的WSL在后续步骤中变得重要。
据说,在Windows终端上执行wsl –install命令将完成一系列的设置并创建Ubuntu环境,但是在这里,引入的WSL版本似乎有些过时,而且只有通过Store版本才能进行某些不受支持的操作。(截至2022/12确认)

3. AlmaLinux的启动

image.png

点击这个链接,Windows 终端就会启动并登录到 Linux。(首次登录需要指定登录用户名,请输入任意名称和密码。)
就像通过 Tera Term 登录到 Linux 一样,Windows 终端会启动并允许您在命令行中操作 Linux。

在WSL上配置AlmaLinux的初始设置。

初次启动的AlmaLinux缺少常见的服务器环境所需的命令。作为最基本的设置,需要进行以下操作。

    • 初回起動時のユーザ作成(ここまでの手順で済)

 

    • systemdの設定

 

    • ipコマンドの追加

 

    • パッケージ更新(任意)

 

    日本語環境やタイムゾーンの設定

除此之外,由于每个人对于所认为的“最小限度”的组件可能存在某些缺失,所以从这里开始请各位自行尝试添加软件包等。

初始启动时创建普通用户

只有第一次,在创建Linux用户时,请自行决定myname/mypassword。如果需要以root权限操作,可以使用sudo su -切换到root用户而无需输入密码。接下来的初始设置工作将由root用户完成。

sudo su -

2. systemd的设置(root)

在学习RHEL7时,我们习以为常地使用systemd来启动/停止服务。但在WSL中,默认情况下无法使用systemd,因此在引入中间件产品之前,需要先修改其运行方式。

注意:这是关于WSL版本依赖的操作(建议使用Store版WSL)。

如果您没有安装Store版,则无法按照此方式进行操作。
此外,针对旧版本的解决方案会有大量复杂的技术信息出现,但目前以下方法是极为简单的。

操作非常简单,只需在/etc/wsl.conf中添加相应的说明。实际上,由于文件不存在,只需创建新文件并添加这一行就可以了。

vi /etc/wsl.conf
/* 以下を追記 */
[boot]
systemd=true

由于下一次启动时,systemd将被启用,因此请关闭WSL并再次启动。
在Windows上打开命令提示符,执行以下操作。

/*ディストリビューションの停止*/
>wsl --shutdown

/*起動*/
>wsl

3. 添加IP命令(根权限)

由於預設情況下無法使用ip命令,所以需要添加軟體包。

/*再起動したのでrootになる*/
sudo su -

安装iproute

dnf install iproute -y

确认IP地址

由于IP命令已经可用,可以进行状态确认。

# ip a
 /* 一部抜粋*/
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:b7:74:15 brd ff:ff:ff:ff:ff:ff
    inet 172.27.249.125/20 brd 172.27.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feb7:7415/64 scope link
       valid_lft forever preferred_lft forever

从Windows端进行连接确认

>ping 172.27.249.125

172.27.249.125 に ping を送信しています 32 バイトのデータ:
172.27.249.125 からの応答: バイト数 =32 時間 <1ms TTL=64
172.27.249.125 からの応答: バイト数 =32 時間 <1ms TTL=64
172.27.249.125 からの応答: バイト数 =32 時間 <1ms TTL=64
172.27.249.125 からの応答: バイト数 =32 時間 <1ms TTL=64

172.27.249.125 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

4. 软件包更新(系统管理员权限)

默认数值为8.5,因此进行了更新。

dnf update -y

版本确认

# cat /etc/redhat-release
AlmaLinux release 8.7 (Stone Smilodon)

5. 其他操作

我认为在这一方面,应该能够遵循每个人没有异议的服务器设置。

提供日本語支持,设置时区。

# dnf install -y glibc-langpack-ja
# localectl set-locale LANG=ja_JP.utf8
# localectl set-keymap jp106
# dnf install -y langpacks-ja
# timedatectl set-timezone Asia/Tokyo

日本语言环境的范例

# export LANG=C
# date
Tue Jan 17 14:00:51 JST 2023

/* 必要に応じて表示言語を切り替える*/
# export LANG=ja_JP.utf8
# echo $LANG
ja_JP.utf8
# date
2023年  1月 17日 火曜日 14:01:23 JST

将这部分内容导出并复制

到目前为止,与PostgreSQL无关,只是关于在使用WSL时的惯例,我准备好了我的个人Linux虚拟机!将此阶段作为备份文件保留下来,以便今后可以复制。

参考网站1:在WSL2中准备三个AlmaLinux服务器。
参考网站2:只使用标准功能在喜欢的位置安装WSL。

1.确认状态

在Windows的命令提示符中执行

>wsl -l -v
  NAME           STATE           VERSION
* AlmaLinux-8    Running         2

2. 导出

请将C:\path\to\export部分更改为您喜欢的文件夹位置。
由于这个文件夹将存放我的模板,所以建议您将其命名为长期存储文件并进行命名。

>wsl --export AlmaLinux-8 C:\path\to\export\MyAlmaLinux8.tar
エクスポートが進行中です。これには数分かかる場合があります。
この操作を正しく終了しました。

3. 输入

请在C:\path\to\study处指定您喜欢的文件夹位置。
实际上,在此创建MyStudy的机器上安装和配置PostgreSQL。例如,如果是为了学习PostgreSQL,可以创建一个名为study的学习项目文件夹,并将其放置在这里会很好。将来,假设还会放置与学习相关的脚本等内容。

>wsl --import MyStudy C:\path\to\study\MyStudy C:\path\to\export\MyAlmaLinux8.tar
インポート中です。この処理には数分かかることがあります。
この操作を正しく終了しました。

结果

>wsl -l -v
  NAME            STATE           VERSION
* AlmaLinux-8     Stopped         2
  MyStudy         Stopped         2
  /*エクスポートすると元の仮想マシンも停止します*/

4. 启动已复制的机器

现在可以使用多个发行版进行间隔使用。
从Windows的开始菜单中通过AlmaLinux图标启动会导致默认虚拟机启动,因此在项目中使用的需要通过命令启动。

>wsl -d MyStudy -u myname

使用-d参数指定发行版名称。
使用-u参数指定Linux端的用户名。

当你登录Linux系统时,当前目录会变成Windows用户文件夹,因此建议使用cd ~命令将其切换到主目录。

>wsl -d MyStudy -u myname
[myname@PC:/mnt/c/Users/myname]$
[myname@PC:/mnt/c/Users/myname]$ cd
[myname@PC:~]$
[myname@PC:~]$ pwd
/home/myname

安装和初始化PostgreSQL。

好的,既然操作系统已经准备好了,那么现在我们来安装PostgreSQL。
在这里,我将介绍一种尽量简单的离线安装步骤,其中涉及的包依赖较少。

1. 获取包装

从日本PostgreSQL用户协会的页面上,点击“下载”选项卡,然后点击“Linux(rpm)”的链接,即可访问由全球PostgreSQL开发团队提供的RPM存储库。

image.png
    • postgresql15-15.1-1PGDG.rhel8.x86_64.rpm

 

    • postgresql15-contrib-15.1-1PGDG.rhel8.x86_64.rpm

 

    • postgresql15-libs-15.1-1PGDG.rhel8.x86_64.rpm

 

    postgresql15-server-15.1-1PGDG.rhel8.x86_64.rpm
undefined

在业务服务器中,可能会需要LLVMJIT和Devel,但仅仅存储数据并使用SQL进行检索时并不困难。LLVMJIT在数据分析方面可能会有用。当处理大量数据或重复执行相同计算时,性能可能会稍有提升。然而,由于依赖包的增加,对于初学者来说可能并不需要。

将下载的文件放在Windows端的学习项目文件夹中,该文件夹用于放置操作系统图像。本次做法是在study文件夹下创建了一个modules文件夹并将文件放入其中。

2. 在Linux上安装PostgreSQL。

安装操作需要使用root用户进行。

/* rootユーザにスイッチ */
sudo su -

在WSL的虚拟机中,可以通过/mnt/Windows上的路径来访问Windows上的文件。将获取的RPM放到项目文件夹中并进行移动。

# cd /mnt/c/path/to/study/modules
# ls -l
total 8768
-rwxrwxrwx 1 root root 1700920 Jan 17 03:14 postgresql15-15.1-1PGDG.rhel8.x86_64.rpm
-rwxrwxrwx 1 root root  766744 Jan 17 03:14 postgresql15-contrib-15.1-1PGDG.rhel8.x86_64.rpm
-rwxrwxrwx 1 root root  299056 Jan 17 03:14 postgresql15-libs-15.1-1PGDG.rhel8.x86_64.rpm
-rwxrwxrwx 1 root root 6198364 Jan 17 03:14 postgresql15-server-15.1-1PGDG.rhel8.x86_64.rpm

在此文件夹中执行dnf命令进行安装。

# dnf install -y \
> postgresql15-15.1-1PGDG.rhel8.x86_64.rpm \
> postgresql15-contrib-15.1-1PGDG.rhel8.x86_64.rpm \
> postgresql15-libs-15.1-1PGDG.rhel8.x86_64.rpm \
> postgresql15-server-15.1-1PGDG.rhel8.x86_64.rpm

当取得成功后,将进入以下状态。

    • OSユーザpostgresが作成されている

 

    /usr/pgsql-15ディレクトリ配下に製品がインストールされている
# su - postgres
Last login: 火  1月 17 05:42:21 JST 2023 on pts/0
$ id
uid=26(postgres) gid=26(postgres) groups=26(postgres)

已安装的模块集合

$ cd /usr/pgsql-15
$ ll
total 16
drwxr-xr-x 2 root root 4096 Jan 17 03:34 bin
drwxr-xr-x 3 root root 4096 Jan 17 03:34 doc
drwxr-xr-x 3 root root 4096 Jan 17 03:34 lib
drwxr-xr-x 7 root root 4096 Jan 17 03:34 share

補充:我原本以为WSL的Alma上缺少依赖包,但实际上确实有不少缺失的包。没办法…为了解决依赖关系,我会记录下自动下载的包,如果你希望完全离线安装,请提前获取这些包。将它们全部放入modules文件夹中,在执行dnf install时进行指定,应该会顺利进行。

groff-base-1.22.3-18.el8.x86_64
libicu-60.3-2.el8_1.x86_64
libxslt-1.1.32-6.el8.x86_64
lz4-1.8.3-3.el8_4.x86_64
perl-Carp-1.42-396.el8.noarch
perl-Data-Dumper-2.167-399.el8.x86_64
perl-Digest-1.17-395.el8.noarch
perl-Digest-MD5-2.55-396.el8.x86_64
perl-Encode-4:2.97-3.el8.x86_64
perl-Errno-1.28-421.el8.x86_64
perl-Exporter-5.72-396.el8.noarch
perl-File-Path-2.15-2.el8.noarch
perl-File-Temp-0.230.600-1.el8.noarch
perl-Getopt-Long-1:2.50-4.el8.noarch
perl-HTTP-Tiny-0.074-1.el8.noarch
perl-IO-1.38-421.el8.x86_64
perl-IO-Socket-IP-0.39-5.el8.noarch
perl-IO-Socket-SSL-2.066-4.module_el8.6.0+2811+fe6c84b0.noarch
perl-MIME-Base64-3.15-396.el8.x86_64
perl-Mozilla-CA-20160104-7.module_el8.5.0+2812+ed912d05.noarch
perl-Net-SSLeay-1.88-2.module_el8.6.0+2811+fe6c84b0.x86_64
perl-PathTools-3.74-1.el8.x86_64
perl-Pod-Escapes-1:1.07-395.el8.noarch
perl-Pod-Perldoc-3.28-396.el8.noarch
perl-Pod-Simple-1:3.35-395.el8.noarch
perl-Pod-Usage-4:1.69-395.el8.noarch
perl-Scalar-List-Utils-3:1.49-2.el8.x86_64
perl-Socket-4:2.027-3.el8.x86_64
perl-Storable-1:3.11-3.el8.x86_64
perl-Term-ANSIColor-4.06-396.el8.noarch
perl-Term-Cap-1.17-395.el8.noarch
perl-Text-ParseWords-3.30-395.el8.noarch
perl-Text-Tabs+Wrap-2013.0523-395.el8.noarch
perl-Time-Local-1:1.280-1.el8.noarch
perl-URI-1.73-3.el8.noarch
perl-Unicode-Normalize-1.25-396.el8.x86_64
perl-constant-1.33-396.el8.noarch
perl-interpreter-4:5.26.3-421.el8.x86_64
perl-libnet-3.11-3.el8.noarch
perl-libs-4:5.26.3-421.el8.x86_64
perl-macros-4:5.26.3-421.el8.x86_64
perl-parent-1:0.237-1.el8.noarch
perl-podlators-4.11-1.el8.noarch
perl-threads-1:2.21-2.el8.x86_64
perl-threads-shared-1.58-2.el8.x86_64

创建数据库集群

从这里开始是PostgreSQL的命令。

PostgreSQL是一种基本的数据库,根据学习进度,您可以尝试更改安装位置或将WAL设置在其他磁盘上,但对于初学者而言,建议按照默认设置进行操作。对于使用rpm安装并以root用户执行的情况也是可以的。

# export PGSETUP_INITDB_OPTIONS='--no-locale -E utf8'
# postgresql-15-setup initdb
Initializing database ... OK

做什么呢?是进行创建数据库集群的initdb操作。

initdb是一条用于初始化PostgreSQL数据库的命令,通常用于普通用户执行。
但是,在初始设置中,希望能够使用需要root权限的操作,例如与initdb一起使用的systemd服务和权限,而不只是普通用户。这个命令可以通过一条命令完成这些操作。
环境变量PGSETUP_INITDB_OPTIONS是传递给initdb命令的参数列表,仅在这种情况下使用。用于构建的命令和参数的含义范围在OSS-DB Silver等中,但对于初学者,请首先按照如下指定。

4. 启动PostgreSQL

起動时使用root用户,在systemctl中进行。
停止使用stop命令,再启动使用restart命令。
指定默认的服务名为postgresql-15.service。

systemctl start postgresql-15.service

请确认启动后的状态。
启动后,我们将使用以一般用户(用于PostgreSQL运营管理的操作系统用户)为基础创建的postgres用户进行操作。

# su - postgres
Last login: 火  1月 17 05:39:09 JST 2023 on pts/0
$ ps x
    PID TTY      STAT   TIME COMMAND
    453 ?        Ss     0:00 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
    454 ?        Ss     0:00 postgres: logger
    455 ?        Ss     0:00 postgres: checkpointer
    456 ?        Ss     0:00 postgres: background writer
    458 ?        Ss     0:00 postgres: walwriter
    459 ?        Ss     0:00 postgres: autovacuum launcher
    460 ?        Ss     0:00 postgres: logical replication launcher
    462 pts/0    S      0:00 -bash
    510 pts/0    R+     0:00 ps x

要访问数据库,请使用命令行工具psql。
要退出psql,请使用exit或\q命令。

$ psql
psql (15.1)
Type "help" for help.

postgres=# \l
                                            List of databases
   Name    |  Owner   | Encoding | Collate | Ctype | ICU Locale | Locale Provider |   Access privileges
-----------+----------+----------+---------+-------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |            | libc            |
 template0 | postgres | UTF8     | C       | C     |            | libc            | =c/postgres          +
           |          |          |         |       |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     |            | libc            | =c/postgres          +
           |          |          |         |       |            |                 | postgres=CTc/postgres
(3 rows)

postgres=# exit

以下是PostgreSQL的自动启动设置。

使用systemd的自动启动服务设置,使得在操作系统启动时,PostgreSQL会自动启动。这个操作需要以root用户执行。

# systemctl list-unit-files | grep postgres
postgresql-15.service                  disabled

# systemctl enable postgresql-15.service
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-15.service → /usr/lib/systemd/system/postgresql-15.service.

# systemctl list-unit-files | grep postgres
postgresql-15.service                  enabled

在这种情况下,如果按照本文章中提到的“导出WSL虚拟机”一文操作一次,就可以随时返回全新的PostgreSQL环境,这样就可以尽情进行各种有趣的故障检测啦!

概况

我整理了一份关于如何在Windows环境下准备适用于任何初学者的可用的PostgreSQL实训环境的准备工作。

    • WSL(AlmaLinux 8)のセットアップ

 

    AlmaLinux on WSLの初期設定

对于初学Linux的人来说,无论是学习PostgreSQL还是其他中间件产品的环境,我认为这都是一个推荐的选择。

    PostgreSQLのインストールと設定

创建了一个空的数据库集群,并通过systemctl实现了启动和停止功能,以及设置了开机自动启动。

广告
将在 10 秒后关闭
bannerAds