分类 linux 下的文章

在 CentOS 上下载和部署 RocketMQ 以及如何在 PHP 中使用它,可以分为以下几个步骤:

  1. 安装依赖

首先,确保你的 CentOS 系统是最新的,并安装必要的依赖。打开终端,执行以下命令:

#
bash
sudo yum update -y
sudo yum install java-1.8.0-openjdk-devel git -y
  1. 下载并安装 RocketMQ

接下来,下载 RocketMQ 的源代码并编译安装。这里以最新版本为例:

#
bash
# 克隆RocketMQ源码
git clone https://github.com/apache/rocketmq.git

# 切换到特定版本的分支,例如4.7.1,你可以根据需要选择其他版本
cd rocketmq
git checkout tags/v4.7.1 -b v4.7.1

# 编译RocketMQ
mvn -Prelease-all -DskipTests clean install -U

# 将编译好的二进制文件复制到安装目录,比如 /usr/local/rocketmq
sudo cp -r distribution/target/rocketmq-4.7.1/* /usr/local/rocketmq/
  1. 配置与启动 RocketMQ

配置环境变量(可选,方便管理):

#
bash
echo 'export ROCKETMQ_HOME=/usr/local/rocketmq' >> ~/.bashrc
echo 'export PATH=$PATH:$ROCKETMQ_HOME/bin' >> ~/.bashrc
source ~/.bashrc

启动 NameServer 和 Broker:

#
bash
nohup ${ROCKETMQ_HOME}/bin/mqnamesrv &>/dev/null &
sleep 5 # 等待NameServer启动完成

${ROCKETMQ_HOME}/bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true &>/dev/null &
  1. 在 PHP 中使用 RocketMQ

要在 PHP 中使用 RocketMQ,你需要安装一个客户端库,例如 jmarranz/rocketmq-client-php(请注意,这个库可能不是非常活跃,你可能需要评估它的稳定性和适用性)。

首先,通过 Composer 安装该库:

#
bash
composer require jmarranz/rocketmq-client-php

然后,你可以编写 PHP 代码来生产和消费消息。以下是一个简单的示例:

#
php
<?php
require_once 'vendor/autoload.php';

use MQ\Client\Producer;
use MQ\Model\Message;

$producer = new Producer();
$producer->setNamesrvAddr('localhost:9876');
$producer->start();

$message = new Message('YourTopic', 'TagA', 'Hello RocketMQ');
$result = $producer->send($message, 3);

echo "Send result: ", ($result === null ? "OK" : "Failed"), "\n";

$producer->shutdown();

请根据实际情况调整代码中的 YourTopic 和其他参数。同时,考虑到生产环境中可能需要更复杂的配置和错误处理逻辑。

以上就是基本的 RocketMQ 在 CentOS 上的部署和在 PHP 中的简单使用方法。实际应用时,还需考虑安全性、高可用性配置等高级设置。

mount -a命令实际上会执行挂载操作,但它不会挂载那些在/etc/fstab中明确标记为noauto的文件系统,也不会重新挂载那些已经挂载的文件系统(除非使用了-o remount选项)。这意味着,如果某个分区在fstab中有定义但当前未挂载,执行mount -a后,该分区会被挂载上。

因此,使用mount -a是一种安全的方式,来检验你对fstab所做的修改是否正确,是否会导致任何挂载错误,而不必重启系统。如果fstab中有错误,执行此命令后系统会给出错误消息,允许你及时修正,避免了因错误的配置导致系统启动失败的风险。

Q:


某LINUX服务器:

[root@t ~]# blkid
/dev/mapper/centos-root: UUID="87b5a8d1-9ba1-4e23-b8d3-ea85f705dccf" TYPE="xfs" 
/dev/vda2: UUID="q7qBhI-fRWe-6IFd-v9Cu-I0So-zIcv-XIoNMM" TYPE="LVM2_member" 
/dev/vda1: UUID="1e3e0806-b543-41d4-bbdd-02bb74483a91" TYPE="xfs" 
/dev/vdb1: UUID="b7bc3a43-c9c0-4f46-9de1-b1fe0ab63c85" TYPE="ext3" 
/dev/mapper/centos-swap: UUID="8a8422c9-7bc1-4fd3-bbce-a9f2ffcecb9c" TYPE="swap" 

[root@t-db ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             252:0    0   40G  0 disk 
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   39G  0 part 
  ├─centos-root 253:0    0   37G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
vdb             252:16   0  100G  0 disk 
└─vdb1          252:17   0  100G  0 part /data

[root@t-db ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Jan  3 03:48:35 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=1e3e0806-b543-41d4-bbdd-02bb74483a91 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

那么,该系统自动挂载了几个分区?系统分区有写在fstab吗?


A:


根据您提供的信息,该系统自动挂载了三个分区,并且这些分区都在/etc/fstab文件中有所体现:

根分区 (/):通过LVM的逻辑卷/dev/mapper/centos-root挂载,UUID为87b5a8d1-9ba1-4e23-b8d3-ea85f705dccf。在/etc/fstab中的条目为:

/dev/mapper/centos-root / xfs defaults 0 0

/boot 分区:直接挂载自分区/dev/vda1,UUID为1e3e0806-b543-41d4-bbdd-02bb74483a91。在/etc/fstab中的条目为:

UUID=1e3e0806-b543-41d4-bbdd-02bb74483a91 /boot xfs defaults 0 0

交换分区 (swap):通过LVM的逻辑卷/dev/mapper/centos-swap挂载,UUID为8a8422c9-7bc1-4fd3-bbce-a9f2ffcecb9c。在/etc/fstab中的条目为:

/dev/mapper/centos-swap swap swap defaults 0 0

虽然/dev/vdb1(UUID为b7bc3a43-c9c0-4f46-9de1-b1fe0ab63c85,挂载点为/data)当前是挂载的,但在您提供的/etc/fstab内容中并没有看到对应的自动挂载条目。这意味着这个分区可能是手动挂载的,或者挂载条目被省略了。如果需要该分区在系统启动时自动挂载,应将其添加到/etc/fstab中。


Q:

那你帮我挂载这个/data呗


A:


要将/dev/vdb1(已知挂载点为/data)设置为在系统启动时自动挂载,您需要将其条目添加到/etc/fstab文件中。根据之前的信息,该分区的UUID是b7bc3a43-c9c0-4f46-9de1-b1fe0ab63c85,并且文件系统类型为ext3。

以下是添加到/etc/fstab的正确条目:

UUID=b7bc3a43-c9c0-4f46-9de1-b1fe0ab63c85 /data ext3 defaults 0 2

操作步骤如下:

备份现有的fstab文件(以防万一修改出错):

bash
sudo cp /etc/fstab /etc/fstab.backup

编辑fstab文件,可以使用你喜欢的文本编辑器,这里以nano为例:

bash
sudo nano /etc/fstab

在文件末尾添加上述挂载条目。

保存并关闭编辑器(如果你使用的是nano,可以通过按Ctrl+O来保存更改,然后按Ctrl+X退出)。

测试挂载配置,以确保新条目无误。可以使用mount -a命令来尝试挂载所有在fstab中定义但尚未挂载的文件系统:

bash
sudo mount -a

检查挂载是否成功,通过df -h命令查看:

bash
df -h

你应该能在输出中看到/data分区已经被挂载。

这样设置后,下次系统启动时,/dev/vdb1将自动挂载到/data目录下。

查看硬盘挂载内容:

[root@tjj-qytjll-db ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             252:0    0   40G  0 disk 
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   39G  0 part 
  ├─centos-root 253:0    0   37G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
vdb             252:16   0  100G  0 disk 
└─vdb1          252:17   0  100G  0 part /data

根据提供的lsblk命令的输出,系统中总共有两个硬盘:

vda:这是一个40GB的磁盘,包含两个分区(vda1和vda2)。vda1用于/boot分区,而vda2是一个LVM(逻辑卷管理)物理卷,进一步划分为centos-root(根分区)和centos-swap(交换分区)。
vdb:这是一个100GB的磁盘,有一个分区vdb1,挂载点为/data。

所以,尽管输出中显示了多个条目(包括分区和逻辑卷),但实际上只有两个物理硬盘设备,即vda和vdb。

PS:关于UUID
在Linux系统中,每个硬盘分区或逻辑卷都有其唯一的UUID(通用唯一标识符),而不是整个硬盘只有一个UUID。UUID是用于唯一标识磁盘分区或文件系统的重要属性,尤其在网络存储、系统恢复和自动挂载配置中非常有用。

根据你之前的lsblk命令输出,若要查看这些分区的UUID,可以使用blkid命令,如:

bash sudo blkid

或者使用带有-f选项的lsblk命令来显示分区的UUID:

bash lsblk -f

这将会列出所有块设备及其分区的详细信息,包括UUID。每个分区(如vda1, vda2, centos-root, centos-swap,
vdb1)都会有一个独立的UUID。

挂载硬盘的流程:

在Linux系统中手动挂载一个硬盘,你需要先完成以下几个步骤:

  1. 查找硬盘设备名

首先,你需要知道硬盘的设备名称。这通常在/dev/目录下,形如/dev/sdX(对于传统SATA硬盘)或/dev/nvme0n1(对于NVMe
SSD)。你可以使用lsblk命令来列出所有可用的块设备:

bash lsblk

  1. 创建挂载点

在文件系统中选择或创建一个目录作为硬盘的挂载点。例如,如果你想将硬盘挂载到/mnt/mydisk,可以这样创建挂载点:

bash sudo mkdir /mnt/mydisk

  1. 挂载硬盘

使用mount命令将硬盘挂载到之前创建的挂载点。假设你的硬盘设备名为/dev/sdb1,命令如下:

bash sudo mount /dev/sdb1 /mnt/mydisk

设置自动挂载(可选)

如果希望硬盘在系统启动时自动挂载,需要编辑/etc/fstab文件。首先获取UUID(通用唯一标识符):

bash sudo blkid /dev/sdb1

然后,使用文本编辑器(如nano或vi)编辑/etc/fstab,添加一行类似于下面的内容(替换UUID=...和挂载点为你实际的值):

UUID=你从上一步得到的UUID /mnt/mydisk ext4 defaults 0 2

确保使用正确的文件系统类型(如上例中的ext4)和挂载选项。

注意事项

在执行上述操作前,请确保你有足够的权限,并且操作谨慎,以免造成数据丢失或系统损坏。
如果硬盘有未格式化的分区或需要格式化,可以使用mkfs.ext4 /dev/sdb1(以ext4为例)进行格式化,但请注意这会清除所有数据。
确保在执行涉及系统文件的操作(如编辑/etc/fstab)时格外小心,错误的配置可能导致系统无法正常启动。

在Linux中,cp命令用于复制文件或目录。如果你想要复制文件或目录,并希望保持原始的用户所有权和权限配置,你可以使用-p选项,这个选项会保留文件的模式、所有权和时间戳。

命令的基本格式如下:

bash
cp -p [源文件或目录] [目标位置]
例如,如果你想要复制一个名为file.txt的文件到/tmp目录,并希望保持原始的用户所有权和权限配置,你可以使用以下命令:

bash
cp -p file.txt /tmp/
如果你想要复制一个目录(包括其中的所有文件和子目录),并希望保持原始的用户所有权和权限配置,你同样可以使用-p选项。但是,请注意,这不会复制目录的特殊属性,如SELinux上下文或ACLs。如果需要复制这些属性,你可能需要使用其他工具,如rsync。

另外,-a或--archive选项也可以达到类似的效果,它实际上是-dpR选项的集合,用于递归地复制目录,并保留文件的模式、所有权、时间戳等属性。

所以,你也可以使用以下命令来复制目录:

bash
cp -a [源目录] [目标位置]
这将递归地复制源目录中的所有内容到目标位置,并保留原始的用户所有权和权限配置。