在 linux (LUW) 上使用 db2 express c 运行 db2start 时在 linux 上出现 SQL1641N 错误,但未使用 nosuid 挂载文件系统

alo*_*lok 1 db2 linux startup

我正在尝试使用以下脚本在我的 linux 机器上安装和启动 db2:

#!/usr/bin/env bash

MKDIR=/bin/mkdir
RM=/bin/rm
TAR=/bin/tar

DB2_SERVER_PROGRAM_PATH=/home/alok/Documents/Installers
DB2_SERVER_PROGRAM=v10.5_linuxx64_expc.tar.gz

echo "changing to $DB_SERVER_PROGRAM_PATH"
cd ${DB2_SERVER_PROGRAM_PATH}
echo "removing expc"
${RM} -rf expc
echo "untarring ${DB2_SERVER_PROGRAM}"
${TAR} zxf ${DB2_SERVER_PROGRAM}

echo "changing to expc"
cd expc

echo "Installing db2 as root"
sudo ./db2_install

echo "Adding user group db2grp1 as root"
sudo groupadd db2grp1
echo "Adding user group dasadm1 as root"
sudo groupadd dasadm1
echo "Adding user group db2fgrp1 as root"
sudo groupadd db2fgrp1

echo "Adding user db2inst1. Please provide password for new user db2inst1."
sudo useradd -g db2grp1 -G dasadm1 -m db2inst1
sudo passwd db2inst1

echo "Adding user dasusr1. Please provide password for new user dasusr1."
sudo useradd -g dasadm1 -G db2grp1 -m dasusr1
sudo passwd dasusr1

echo "Adding user db2fenc1. Please provide password for new user db2fenc1."
sudo useradd -g db2fgrp1 -m db2fenc1
sudo passwd db2fenc1

cd /opt/ibm/db2/V10.5/instance

echo "Creating DAS as root via user dasusr1."
sudo ./dascrt -u dasusr1

echo "Creating database instance as root via user db2fenc1 and db2inst1."
sudo ./db2icrt -u db2fenc1 db2inst1

echo "Setting communication protocol to tcpip as user db2inst1."
sudo -u db2inst1 ../adm/db2set DB2COMM=tcpip
echo "Setting SVCENAME 50000 for dbm cfg as user db2inst1."
sudo -u db2inst1 ../bin/db2 update dbm cfg using SVCENAME 50000

echo "starting db2 as user db2inst1."
sudo chmod +x ../adm/db2start
sudo -u db2inst1 ../adm/db2start

netstat -an | grep 50000
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我到达倒数第二行:

sudo -u db2inst1 ../adm/db2start

SQL1641N  The db2start command failed because one or more DB2 database
manager program files was prevented from executing with root 
privileges by file system mount settings.
Run Code Online (Sandbox Code Playgroud)

现在我检查了一下/etc/fstab,它说:

proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/sda1       /               ext4    errors=remount-ro,user_xattr 0       1
UUID=d4d794eb-1e68-4ddf-a9ec-249a22f084fb none            swap    sw             0       0
/swapfile swap swap defaults 0 0
Run Code Online (Sandbox Code Playgroud)

我的安装路径/opt/ibm/db2/V10.5/adm基本上是打开的/dev/sda1,并且没有使用该nosuid选项进行安装。

这是输出mount

alok@hostname:~$ mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro,user_xattr)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
shmfs on /dev/shm type tmpfs (rw,size=2048m)
gvfs-fuse-daemon on /home/alok/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=alok)
Run Code Online (Sandbox Code Playgroud)

这再次表明/未安装在nosuid模式中。那么为什么我会出错SQL1641N?抛出此消息是一个不同的问题吗?

小智 7

中的文件/opt/ibm/db2/V10.5/不用于特定实例。当您运行该db2icrt命令时,它会将一系列文件和目录复制到 中~db2inst1/sqllib,并相应地设置权限。( 中的某些目录~db2inst1/sqllib将软链接回 中的目录/opt/ibm/db2/V10.5)。

例如,您应该发现~db2inst1/sqllib/adm/db2start权限设置为6555(即-r-sr-sr-x),拥有者为root,并将组所有者设置为实例所有者的主要组。

你不应该从/opt/ibm/db2/V10.5/adm. 这就是为什么该目录中文件的权限设置为它们的方式 -/opt/ibm/db2/V10.5/adm/db2start应该是0444.

因此,要启动您的实例,您应该执行~db2inst1/sqllib/adm/db2start.

请注意,您还需要db2inst1在启动实例之前初始化用户环境,因此您应该使用-ifor 选项sudo来处理此问题:

sudo -i -u db2inst1 /home/db2inst1/sqllib/adm/db2start
Run Code Online (Sandbox Code Playgroud)

最后一点:所有这些配置(也许除了db2start)都可以使用响应文件db2setup. db2_install已被弃用,因此使用响应文件是处理此问题的方法。