GPL/CCO: Fedora 38 ドライバモジュールのビルドには数分ではなく数時間かかります。

GPL/CCO: Fedora 38 ドライバモジュールのビルドには数分ではなく数時間かかります。

注:ドライバのLinux関連エントリ(GPLの場合)。その他はCC0です。

Fedora 38を初めてインストールしています。すべてが正しく設定されていることを確認するためにドライバの1つを構築しました。画面出力は以前のFedoraバージョンとは少し異なりますが、これらの変更は一般的です。新しい点は、ビルドに長い時間がかかるということです。非常に長い時間がかかります。現在、3つのバージョンが22時間以上実行されています。各ビルドには約7分かかります。 .oファイルの日付を見ると、各ドライバソースファイルをコンパイルするのに約20分かかります。

毎回約25時間で結局成功的に完了した。

非常に遅いドライバのビルドを修正するのに役立ちます。どんな助けでも大変感謝します。

ありがとう、

質問の生成:

  1. 「https://fedoraproject.org/workstation/download/」から「IntelおよびAMD x86_64システム用」「Fedora Workstation 38 Live ISO」イメージをダウンロードします。

  2. 適切なメディアにインストールします。

  3. インストール可能なメディアを起動してインストールを実行します。

  4. 元のインストールから起動し、引き続きユーザーアカウントなどを作成します。

  5. さまざまなソフトウェアパッケージのインストール:elfutils-libelf-devel、現在のカーネルバージョンの場合は「kernel-headers-xxx」、現在のカーネルバージョンの場合は「kernel-devel-xxx」

  6. Common Criteria Webサイトからドライバアーカイブをダウンロードします(バージョン番号は時間の経過とともに変更されることがあります)。http://www.generalstandards.com/downloads/24dsi6c500k.linux.2.3.104.47.1.tar.gz

  7. 圧縮パッケージの解凍:tar -xf ./Download/24dsi6c500k.linux.2.3.104.47.0.tar.gz

  8. ドライバディレクトリに切り替えます。cd 24dsi6c500k/driver

  9. ドライバービルド: make -f Makefile

  10. いくつかの初期出力が生成されますが、ビルド出力は約20分ごとにソースファイルをコンパイルして続行されます。最後のステップは時間がかかります。

生成された出力は次のとおりです。

make[1]: Entering directory '/usr/src/kernels/6.2.9-300.fc38.x86_64'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.0.1 20230401 (Red Hat 13.0.1-0)
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/close.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/device.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/io.o
....
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_spinlock.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_time.o
  CC [M]  /root/c/gsc/24dsi6c500k/linux/driver/os_write.o"

それは最終的に行われます。

私はこの問題を解決しようとしています。

  1. ビルドの初期画面出力がここに表示されます。
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.2.1 20230728 (Red Hat 13.2.1-0)

速度低下がコンパイラの問題である可能性があると仮定し、gccをカーネルのビルドに使用されると報告されたバージョンにダウングレードしました。これで初期出力は次のようになりますが、ビルドはまだ非常に遅いです。

warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (GCC) 13.0.1 20230318 (Red Hat 13.0.1-0)
  You are using:           gcc (GCC) 13.0.1 20230401 (Red Hat 13.0.1-0)
  1. Fedora 38を再インストールして再試行しましたが、改善されませんでした。

  2. 利用可能なすべてのアップデートを適用しましたが、それも役に立ちませんでした。

  3. また、ファイアウォールをオフにしてSELinuxを無効にしてrootとしてログインしましたが、どちらも役に立ちませんでした。

  4. 私のビルドは通常、ネットワーク経由でSAMBAがインストールされているWindows 10共有で行われます。それで、USB 3.0ベースのM.2ドライブであるローカルドライブを構築してみました。改善はありません。

  5. その後、SATAドライブに別のソースをインストールしようとしました。ネットワークまたはローカルSATAドライブを介して構築する場合、改善はありません。

  6. 私は完全に異なる3つのホストからFedora 38でビルドしようとしましたが、同じですが、非常に遅い結果を観察しました。

  7. Fedora 38 および以前のバージョンの Fedora のビルド時間を表示するために、いくつかの異なる Fedora インストールとホストにドライバをビルドしました。

A. Fedora 38、64ビット、8コア、3.6GHz、8GB、2年間のマザーボード(Gigabyte Z390 Designare)、Sambaインストール:現在まで22時間

B. Fedora 38、64ビット、8コア、3.6GHz、8GB、2年マザーボード(Gigabyte Z390 Designare)、SATAドライブ:現在まで22時間

C. Fedora 38、64ビット、8コア、3.2GHz、32GB、7年マザーボード(Asus X99-A/USB 3.1)、USB 3 M.2:現在まで22時間

D. Fedora 37、64ビット、2コア、2.5GHz、8GB、12年マザーボード(Asus X99-A/USB 3.1)、USB 2 M.2:7分

E. Fedora 36、64ビット、2コア、2.5GHz、8GB、12年マザーボード(Super X7SBA)、SATAドライブ:7分

F. Fedora 3、32ビット、2コア、2.2GHz、1GB、20年マザーボード(Iwill DP400)、IEDEドライバ:37秒

長年にわたり、私はFedora Core 3以降、すべての公式Fedoraリリースと他の多くのディストリビューションを使用してきました。私が何千回も作成、メンテナンス、構築した45のドライバのうち、ビルドに約7分以上かかったことはありません。これまで、新しいリリースとバージョンに障壁を置くのは比較的些細なことでした。 (このドライバの製造元に問い合わせるように提案した人は私です。)

これは私のmakeファイルです。

ファイル生成:

TARGET      := 24dsi6c500k

.NOTPARALLEL: %.o

OBJ_FILES   =                   \
            close.o             \
            device.o            \
            io.o                \
            ioctl.o             \
            irq.o               \
            open.o              \
            read.o              \
            reg.o               \
                                \
            gsc_bar.o           \
            gsc_close.o         \
            gsc_dma.o           \
            gsc_dma_pci.o       \
            gsc_eeprom.o        \
            gsc_endian.o        \
            gsc_endian_pci.o    \
            gsc_init.o          \
            gsc_io.o            \
            gsc_ioctl.o         \
            gsc_irq.o           \
            gsc_irq_pci.o       \
            gsc_open.o          \
            gsc_read.o          \
            gsc_reg.o           \
            gsc_utils.o         \
            gsc_wait.o          \
            gsc_write.o         \
                                \
            os_bar.o            \
            os_close.o          \
            os_event.o          \
            os_init.o           \
            os_ioctl.o          \
            os_irq.o            \
            os_kernel_2_2.o     \
            os_kernel_2_4.o     \
            os_kernel_2_6.o     \
            os_kernel_3.o       \
            os_kernel_4.o       \
            os_kernel_5.o       \
            os_kernel_6.o       \
            os_mem.o            \
            os_metrics.o        \
            os_open.o           \
            os_pci.o            \
            os_proc.o           \
            os_read.o           \
            os_reg.o            \
            os_sem.o            \
            os_spinlock.o       \
            os_time.o           \
            os_write.o



###############################################################################
# Everything here is needed so we can access os_makefile.inc.

.EXPORT_ALL_VARIABLES:

# Locate the source from the starting directory.
ifndef GSC_DEV_DIR
GSC_DEV_DIR := $(shell pwd)
endif

include ${GSC_DEV_DIR}/os_makefile.inc

os_makefile.inc:

default: all

# Identify the /dev/nul(l) device
NULL    := $(shell ls /dev/nu[l]* | grep -w null | wc -l )
NULL    := $(shell expr ${NULL})

ifeq ("${NULL}","1")
NULL    := /dev/null
else
NULL    := /dev/nul
endif

.PHONY: all clean default makefile release

# Most of this is ignored by the 2.6 (and later) module builder.
CC          = gcc
CC_FLAGS    += -c -O6 -pipe -fomit-frame-pointer -Wall
CC_FLAGS    += -D__KERNEL__ -DLINUX
CC_FLAGS    += -I. -I${KERNELDIR}
DEP_FILE    = ${GSC_DEV_DIR}/makefile.dep
KERNELDIR   =
KERNELVER   = $(shell uname -r | cut -d . -f1-2 )
KERNELMAJOR = $(shell uname -r | cut -d . -f1 )
RELEASE_RM  = ${OBJ_FILES} .tmp* .*.o.cmd .*.ko.cmd .*.mod.cmd .*.ko.*.cmd *.ko.unsigned *.mod.* *.mod Modules*



# kernel 2.2 ==================================================================
ifeq ("${KERNELVER}","2.2")
KERNELDIR   = /usr/src/linux
MODULE_NAME = ${TARGET}.o

${MODULE_NAME}: ${OBJ_FILES}
    @echo ==== Linking: $@
    @ld -r -o $@ ${OBJ_FILES}
endif

# kernel 2.4 ==================================================================
ifeq ("${KERNELVER}","2.4")

K_DIR   := $(shell ls -d /usr/src/linux/include 2>/dev/null | wc -l )
K_DIR   := $(shell echo $(K_DIR) | sed -e 's/[ \t]*//g')

ifeq ("${K_DIR}","1")
KERNELDIR   = /usr/src/linux/include
else
KERNELDIR   = /usr/src/linux-2.4/include
endif

MODULE_NAME = ${TARGET}.o

${MODULE_NAME}: ${OBJ_FILES}
    @echo ==== Linking: $@
    @ld -r -o $@ ${OBJ_FILES}
endif

# kernel 2.6 ==================================================================
ifeq ("${KERNELVER}","2.6")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 3.x ==================================================================
ifeq ("${KERNELMAJOR}","3")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 4.x ==================================================================
ifeq ("${KERNELMAJOR}","4")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} SUBDIRS=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 5.x ==================================================================
ifeq ("${KERNELMAJOR}","5")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} M=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel 6.x ==================================================================
ifeq ("${KERNELMAJOR}","6")

${TARGET}-objs  = ${OBJ_FILES}
KERNELDIR       = /lib/modules/$(shell uname -r)/build
MODULE_NAME     = ${TARGET}.ko
obj-m           = ${TARGET}.o
PWD             = $(shell pwd)
RELEASE_RM      += ${TARGET}.o Module.symvers

${MODULE_NAME}: $(shell ls ${GSC_DEV_DIR}/*.[ch])
    @-chmod +rw ${DEP_FILE}
    @-echo -n > ${DEP_FILE}
    @make -C ${KERNELDIR} M=${PWD} modules
    @strip -d --strip-unneeded $@
    @rm -f *.mod.c
endif

# kernel OTHER ================================================================
ifeq ("${KERNELDIR}","")

KERNELDIR   = KERNELDIR_os_makefile.inc_not_known_at_this_time
MODULE_NAME = MODULE_NAME_os_makefile.inc_not_known_at_this_time

${MODULE_NAME}:
    @echo ERROR: KERNEL ${KERNELVER} IS NOT SUPPORTED BY THIS MAKEFILE.
    @_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR_ERROR
endif



# COMMON ======================================================================

#This is ignored by the 2.6 (and later) module builder.
.c.o:
    @echo == Compiling: $<
    @-chmod +rw ${DEP_FILE}
    @# Get the dependency list for this module.
    @-${CC} -MM ${CC_FLAGS} $< >  .tmp1
    @# Remove trailing white space and backslash, if present.
    @-sed -e "s/[ ]*[\\\\]//g" < .tmp1 > .tmp2
    @# Put everything on seperate lines.
    @-tr [:space:] \\n < .tmp2 > .tmp3
    @# Remove all of the system include files.
    @-grep -v "^[ ]*/" < .tmp3 > .tmp4
    @# Remove all empty lines.
    @-grep [[:alnum:]] < .tmp4 > .tmp5
    @# Put everything on the same line.
    @-tr '\n' '\040' < .tmp5 > .tmp6
    @-echo -e '\012' >> .tmp6
    @# Add all the other dependencies to the end of this file.
    @-echo >> ${DEP_FILE}
    @-grep -v "^[ ]*$@" < ${DEP_FILE} >> .tmp6
    @# Remove blank lines from the list.
    @-grep "[[:alnum:]]" < .tmp6 > .tmp7
    @# Sort the list and put it in the dependency file.
    @-sort < .tmp7 > ${DEP_FILE}
    @# Cleanup.
    @rm -f .tmp?
    @rm -r -f -d .tmp*\*
    @# Compile the module.
    @${CC} ${CC_FLAGS} $< -o $@



all: ${MODULE_NAME}
    @echo ==== All Done

release: ${MODULE_NAME}
    @rm -rf  ${RELEASE_RM}
    @echo ==== Release Done

clean:
    @echo ==== Cleaning ${MODULE_NAME} ...
    @rm -rf ${RELEASE_RM} *.o *.scc *.ko core Module.markers modules.order .cache.* .Module.* .modules.*
    @echo > ${DEP_FILE}

${DEP_FILE}:
    @echo ==== Creating: $@
    @echo > ${DEP_FILE}
    @-chmod +rw ${DEP_FILE}

include ${DEP_FILE}

makefile.dep:

(カーネルバージョン2.6以降では、空のファイルはデフォルトで無視されます)

ベストアンサー1

状態が解決されました。 Makefileの「.EXPORT_ALL_VARIABLES:」行は、列挙型の再帰的インスタンスを生成します。この行は削除されました。後でmakeファイルから実際に必要な唯一の変数をエクスポートする行に置き換えられました。これでビルドに20秒もかかりません。

おすすめ記事