DRBD 自助编译操作¶
当 DRBD 默认适配的内核版本不支持时,建议参考该文档的步骤,来编译对应的离线包并安装到对应环境中来使用 DRBD 的功能。
操作步骤¶
本文以内核为 4.9.212-36.el7.x86_64
为例进行演示。
编译内核¶
-
确认内核版本
输出结果为:
-
下载源码
-
下载安装内核编译模块
# 下载 rpm 包,其他内核的可参阅 https://linux.cc.iitk.ac.in/mirror/centos/elrepo/kernel/el7/x86_64/RPMS/ wget https://linux.cc.iitk.ac.in/mirror/centos/7/virt/x86_64/xen-common/Packages/k/kernel-4.9.212-36.el7.x86_64.rpm # 开始安装 rpm -ivh kernel-devel-4.9.212-36.el7.x86_64.rpm
安装完执行检查:
-
下载安装编译所需依赖
安装 gcc、make、patch、kmod、cpio、python3 以及 python3-pip 软件包:
安装 coccinelle:
-
开始编译
-
进入到
drbd-9.0.32-1
目录下执行make
命令,输出结果如下:Calling toplevel makefile of kernel source tree, which I believe is in KDIR=/lib/modules/4.9.212-36.el7.x86_64/source make -C /lib/modules/4.9.212-36.el7.x86_64/source O=/lib/modules/4.9.212-36.el7.x86_64/build M=/home/drbd-9.0.32-1/drbd modules COMPAT __vmalloc_has_2_params COMPAT alloc_workqueue_takes_fmt COMPAT before_4_13_kernel_read COMPAT blkdev_issue_zeroout_discard COMPAT can_include_vermagic_h COMPAT drbd_release_returns_void COMPAT genl_policy_in_ops COMPAT have_BIO_MAX_VECS COMPAT have_CRYPTO_TFM_NEED_KEY COMPAT have_SHASH_DESC_ON_STACK COMPAT have_WB_congested_enum COMPAT have_allow_kernel_signal COMPAT have_atomic_dec_if_positive_linux COMPAT have_atomic_in_flight COMPAT have_bd_claim_by_disk COMPAT have_bd_unlink_disk_holder COMPAT have_bdi_cap_stable_writes COMPAT have_bdi_congested_fn COMPAT have_bio_bi_bdev COMPAT have_bio_bi_error COMPAT have_bio_bi_opf COMPAT have_bio_bi_status COMPAT have_bio_clone_fast COMPAT have_bio_flush COMPAT have_bio_free COMPAT have_bio_op_shift COMPAT have_bio_rw COMPAT have_bio_set_dev COMPAT have_bio_set_op_attrs COMPAT have_bio_start_io_acct COMPAT have_bioset_create_front_pad COMPAT have_bioset_init COMPAT have_bioset_need_bvecs COMPAT have_blk_alloc_disk COMPAT have_blk_alloc_queue_rh COMPAT have_blk_check_plugged COMPAT have_blk_qc_t_make_request COMPAT have_blk_queue_flag_set COMPAT have_blk_queue_make_request COMPAT have_blk_queue_merge_bvec COMPAT have_blk_queue_plugged COMPAT have_blk_queue_split_bio COMPAT have_blk_queue_split_q_bio COMPAT have_blk_queue_split_q_bio_bioset COMPAT have_blk_queue_update_readahead COMPAT have_blk_queue_write_cache COMPAT have_blkdev_get_by_path COMPAT have_d_inode COMPAT have_fallthrough COMPAT have_file_inode COMPAT have_generic_start_io_acct_q_rw_sect_part COMPAT have_generic_start_io_acct_rw_sect_part COMPAT have_genl_family_parallel_ops COMPAT have_hd_struct COMPAT have_ib_cq_init_attr COMPAT have_ib_get_dma_mr COMPAT have_idr_alloc COMPAT have_idr_is_empty COMPAT have_inode_lock COMPAT have_ktime_to_timespec64 COMPAT have_kvfree COMPAT have_max_send_recv_sge COMPAT have_netlink_cb_portid COMPAT have_nla_nest_start_noflag COMPAT have_nla_parse_deprecated COMPAT have_nla_put_64bit COMPAT have_nla_strscpy COMPAT have_part_stat_h COMPAT have_part_stat_read_accum COMPAT have_pointer_backing_dev_info COMPAT have_prandom_u32 COMPAT have_proc_create_single COMPAT have_queue_flag_stable_writes COMPAT have_ratelimit_state_init COMPAT have_rb_augment_functions COMPAT have_refcount_inc COMPAT have_req_flush COMPAT have_req_hardbarrier COMPAT have_req_noidle COMPAT have_req_nounmap COMPAT have_req_op_write COMPAT have_req_op_write_same COMPAT have_req_op_write_zeroes COMPAT have_req_prio COMPAT have_req_write COMPAT have_req_write_same COMPAT have_revalidate_disk_size COMPAT have_sched_set_fifo COMPAT have_security_netlink_recv COMPAT have_sendpage_ok COMPAT have_set_capacity_and_notify COMPAT have_shash_desc_zero COMPAT have_signed_nla_put COMPAT have_simple_positive COMPAT have_sock_set_keepalive COMPAT have_struct_bvec_iter COMPAT have_struct_kernel_param_ops COMPAT have_struct_size COMPAT have_submit_bio COMPAT have_submit_bio_noacct COMPAT have_tcp_sock_set_cork COMPAT have_tcp_sock_set_nodelay COMPAT have_tcp_sock_set_quickack COMPAT have_time64_to_tm COMPAT have_timer_setup COMPAT have_void_make_request COMPAT hlist_for_each_entry_has_three_parameters COMPAT ib_alloc_pd_has_2_params COMPAT ib_device_has_ops COMPAT ib_post_send_const_params COMPAT ib_query_device_has_3_params COMPAT kmap_atomic_page_only COMPAT need_make_request_recursion COMPAT part_stat_read_takes_block_device COMPAT queue_limits_has_discard_zeroes_data COMPAT rdma_create_id_has_net_ns COMPAT sock_create_kern_has_five_parameters COMPAT sock_ops_returns_addr_len CHK /home/drbd-9.0.32-1/drbd/compat.4.9.212-36.el7.x86_64.h UPD /home/drbd-9.0.32-1/drbd/compat.4.9.212-36.el7.x86_64.h CHK /home/drbd-9.0.32-1/drbd/compat.h UPD /home/drbd-9.0.32-1/drbd/compat.h make[4]: `drbd-kernel-compat/cocci_cache/a707960de8e44ee768894d4f66792d36/compat.patch' is up to date. PATCH patching file ./drbd_int.h patching file ./drbd_req.h patching file drbd-headers/linux/genl_magic_struct.h patching file drbd_state.c patching file drbd_receiver.c patching file drbd_main.c patching file drbd_nla.c patching file drbd_nl.c patching file drbd_bitmap.c patching file drbd_sender.c patching file drbd_transport_tcp.c patching file drbd_actlog.c patching file kref_debug.c patching file drbd_req.c patching file drbd_debugfs.c patching file drbd-headers/linux/genl_magic_func.h Hunk #2 succeeded at 312 (offset -20 lines). CC [M] /home/drbd-9.0.32-1/drbd/drbd_debugfs.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_bitmap.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_proc.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_sender.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_receiver.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_req.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_actlog.o CC [M] /home/drbd-9.0.32-1/drbd/lru_cache.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_main.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_strings.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_nl.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_interval.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_state.o CC [M] /home/drbd-9.0.32-1/drbd/drbd-kernel-compat/drbd_wrappers.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_nla.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_transport.o GEN /home/drbd-9.0.32-1/drbd/drbd_buildtag.c CC [M] /home/drbd-9.0.32-1/drbd/drbd_buildtag.o LD [M] /home/drbd-9.0.32-1/drbd/drbd.o CC [M] /home/drbd-9.0.32-1/drbd/drbd_transport_tcp.o Building modules, stage 2. MODPOST 2 modules CC /home/drbd-9.0.32-1/drbd/drbd.mod.o LD [M] /home/drbd-9.0.32-1/drbd/drbd.ko CC /home/drbd-9.0.32-1/drbd/drbd_transport_tcp.mod.o LD [M] /home/drbd-9.0.32-1/drbd/drbd_transport_tcp.ko mv .drbd_kernelrelease.new .drbd_kernelrelease Memorizing module configuration ... done.
-
创建目录
/lib/modules/<内核版本>/kernel/drivers/block/drbd/
,内核版本根据实际情况替换 -
把上一步编译后生成的
/home/drbd-9.0.32-1/drbd/drbd.ko
、/home/drbd-9.0.32-1/drbd/drbd_transport_tcp.ko
传至/lib/modules/<内核版本>/kernel/drivers/block/drbd/
-
配置conf,创建目录把
global_common.conf
放在/etc/drbd.d/
目录下,drbd.conf
放在/etc
目录下:global_common.conf# DRBD is the result of over a decade of development by LINBIT. # In case you need professional services for DRBD or have # feature requests visit http://www.linbit.com global { usage-count yes; # Decide what kind of udev symlinks you want for "implicit" volumes # (those without explicit volume <vnr> {} block, implied vnr=0): # /dev/drbd/by-resource/<resource>/<vnr> (explicit volumes) # /dev/drbd/by-resource/<resource> (default for implict) udev-always-use-vnr; # treat implicit the same as explicit volumes # minor-count dialog-refresh disable-ip-verification # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600; } common { handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when choosing your poison. # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; # quorum-lost "/usr/lib/drbd/notify-quorum-lost.sh root"; } startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options { # cpu-mask on-no-data-accessible # RECOMMENDED for three or more storage nodes with DRBD 9: # quorum majority; # on-no-quorum suspend-io | io-error; } disk { # size on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout } net { # protocol timeout max-epoch-size max-buffers # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle } }
-
加载内核
-
编译 drbd-tools¶
git clone -n https://github.com/LINBIT/drbd-utils.git
cd drbd-utils
git checkout v9.12.1
git clone -n https://github.com/LINBIT/drbd-headers.git
cd drbd-headers/
git checkout c757cf357edef67751b8f45a6ea894d287180087
cd ..
#安装依赖
yum install -y build-essential wget flex automake
./autogen.sh
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
make tools
find ./user -type f -executable -name 'drbd[a-z]*' -exec mv -v {} /usr/local/bin/ \;
进行验证¶
$ drbdadm -V
DRBDADM_BUILDTAG=GIT-hash:\ 6aec3180805d84f142f422013810af10cf4f95acdrbd-headers\ build\ by\ @buildkitsandbox\,\ 2022-10-12\ 10:40:34
DRBDADM_API_VERSION=2
DRBD_KERNEL_VERSION_CODE=0x090020
DRBD_KERNEL_VERSION=9.0.32
DRBDADM_VERSION_CODE=0x090c01
DRBDADM_VERSION=9.12.1