Skip to content

Commit 550ab66

Browse files
committed
feat(baremetal-agent): Linux PCIE disk support mdadm soft raid
1 parent 8ddca94 commit 550ab66

File tree

14 files changed

+546
-43
lines changed

14 files changed

+546
-43
lines changed

build/docker/Dockerfile.baremetal-agent

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.3.9-20231219.0
1+
FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.3.9-20251112.1
22

33
MAINTAINER "Zexi Li <[email protected]>"
44

build/docker/Dockerfile.baremetal-base

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#FROM --platform=linux/amd64 registry.cn-beijing.aliyuncs.com/yunionio/centos-build:1.1-4 as build
22
#RUN yum install -y https://iso.yunion.cn/vm-images/baremetal-pxerom-1.1.0-21092209.x86_64.rpm
33
#RUN yum install -y http://192.168.23.50:8083/baremetal-pxerom-1.1.0-21092209.x86_64.rpm
4-
FROM registry.cn-beijing.aliyuncs.com/yunionio/yunionos:v3.10.8-20231215.0 as yunionos
4+
FROM registry.cn-beijing.aliyuncs.com/yunionio/yunionos:v4.0.0-20251110.1 as yunionos
55

66
FROM centos:8 as grub-stage
77

build/docker/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ WEBCONSOLE_BASE_VERSION = 20230731.2
3030
webconsole-base:
3131
$(DOCKER_BUILDX)/webconsole-base:$(WEBCONSOLE_BASE_VERSION) -f ./Dockerfile.webconsole-base .
3232

33-
BAREMETAL_BASE_VERSION = v0.3.9-20231219.1
33+
BAREMETAL_BASE_VERSION = v0.3.9-20251112.1
3434

3535
baremetal-base:
3636
$(DOCKER_BUILDX)/baremetal-base:$(BAREMETAL_BASE_VERSION) -f ./Dockerfile.baremetal-base .

pkg/apis/compute/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ type BaremetalDiskConfig struct {
312312
RA *bool `json:"ra,omitempty"`
313313
WT *bool `json:"wt,omitempty"`
314314
Direct *bool `json:"direct,omitempty"`
315+
SoftRaidIdx *int `json:"soft_raid_idx"`
315316
}
316317

317318
type RootDiskMatcherSizeMBRange struct {

pkg/apis/compute/baremetal_const.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ var (
6464
DISK_DRIVER_ADAPTECRAID,
6565
)
6666

67+
DISK_DRIVERS_SOFT_RAID = sets.NewString(
68+
DISK_DRIVER_LINUX,
69+
DISK_DRIVER_PCIE,
70+
)
71+
6772
DISK_DRIVERS = sets.NewString(
6873
DISK_DRIVER_LINUX,
6974
DISK_DRIVER_PCIE).Union(DISK_DRIVERS_RAID)

pkg/baremetal/manager.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ import (
5656
"yunion.io/x/onecloud/pkg/baremetal/utils/disktool"
5757
"yunion.io/x/onecloud/pkg/baremetal/utils/grub"
5858
"yunion.io/x/onecloud/pkg/baremetal/utils/ipmitool"
59+
raid2 "yunion.io/x/onecloud/pkg/baremetal/utils/raid"
5960
raiddrivers "yunion.io/x/onecloud/pkg/baremetal/utils/raid/drivers"
61+
"yunion.io/x/onecloud/pkg/baremetal/utils/raid/mdadm"
6062
"yunion.io/x/onecloud/pkg/baremetal/utils/uefi"
6163
"yunion.io/x/onecloud/pkg/cloudcommon/types"
6264
"yunion.io/x/onecloud/pkg/compute/baremetal"
@@ -2731,11 +2733,27 @@ func (s *SBaremetalServer) DoDiskConfig(term *ssh.Client) (*disktool.SSHPartitio
27312733
for _, dConf := range diskConfs {
27322734
driver := dConf.Driver
27332735
adapter := dConf.Adapter
2736+
isSoftRaid := baremetal.DISK_DRIVERS_SOFT_RAID.Has(driver)
2737+
27342738
raidDrv := raiddrivers.GetDriver(driver, term)
27352739
if raidDrv != nil {
27362740
if err := raidDrv.ParsePhyDevs(); err != nil {
27372741
return nil, fmt.Errorf("RaidDriver %s parse physical devices: %v", raidDrv.GetName(), err)
27382742
}
2743+
if isSoftRaid {
2744+
devs := make([]*baremetal.BaremetalStorage, 0)
2745+
for _, layout := range layouts {
2746+
if len(layout.Disks) > 0 && layout.Disks[0].Driver == driver && layout.Disks[0].Adapter == dConf.Adapter {
2747+
devs = append(devs, layout.Disks...)
2748+
}
2749+
}
2750+
2751+
log.Infof("SetDevicesForAdapter %v", jsonutils.Marshal(devs))
2752+
if mdadmDrver, ok := raidDrv.(raid2.IRaidDeviceSetter); ok {
2753+
mdadmDrver.SetDevicesForAdapter(dConf.Adapter, devs)
2754+
}
2755+
}
2756+
27392757
if err := raiddrivers.BuildRaid(raidDrv, dConf.Configs, adapter); err != nil {
27402758
return nil, fmt.Errorf("Build %s raid failed: %v", raidDrv.GetName(), err)
27412759
}
@@ -2779,6 +2797,10 @@ func (s *SBaremetalServer) DoDiskUnconfig(term *ssh.Client) error {
27792797
}
27802798

27812799
func (s *SBaremetalServer) DoEraseDisk(term *ssh.Client) error {
2800+
// soft raid should stop mdadm first
2801+
if err := mdadm.CleanRaid(term); err != nil {
2802+
return err
2803+
}
27822804
cmd := "/lib/mos/partdestroy.sh"
27832805
_, err := term.Run(cmd)
27842806
return err
@@ -2839,6 +2861,7 @@ func (s *SBaremetalServer) DoPartitionDisk(tool *disktool.SSHPartitionTool, term
28392861
rootImageId := s.GetRootTemplateId()
28402862
diskOffset := 0
28412863
rootDisk := tool.GetRootDisk()
2864+
log.Infof("root disk name %s", rootDisk.GetDevName())
28422865
if len(rootImageId) > 0 {
28432866
rootDiskObj := disks[0]
28442867
rootSize, _ := rootDiskObj.Int("size")

pkg/baremetal/tasks/create.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ func (self *SBaremetalServerCreateTask) RemoveEFIOSEntry() bool {
5454
}
5555

5656
func (self *SBaremetalServerCreateTask) DoDeploys(ctx context.Context, term *ssh.Client) (jsonutils.JSONObject, error) {
57-
// Build raid
58-
tool, err := self.Baremetal.GetServer().DoDiskConfig(term)
59-
if err != nil {
57+
if err := self.Baremetal.GetServer().DoEraseDisk(term); err != nil {
6058
return nil, self.onError(ctx, term, err)
6159
}
6260
time.Sleep(2 * time.Second)
63-
if err := self.Baremetal.GetServer().DoEraseDisk(term); err != nil {
61+
// Build raid
62+
tool, err := self.Baremetal.GetServer().DoDiskConfig(term)
63+
if err != nil {
6464
return nil, self.onError(ctx, term, err)
6565
}
6666
time.Sleep(2 * time.Second)

pkg/baremetal/utils/disktool/disktool.go

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package disktool
1717
import (
1818
"fmt"
1919
"math"
20+
"strconv"
2021
"strings"
2122

2223
"yunion.io/x/jsonutils"
@@ -229,7 +230,7 @@ type DiskPartitions struct {
229230
partitions []*Partition
230231
}
231232

232-
func newDiskPartitions(driver string, adapter int, raidConfig string, sizeMB int64, blockSize int64, diskType string, tool *PartitionTool) *DiskPartitions {
233+
func newDiskPartitions(driver string, adapter int, raidConfig string, sizeMB int64, blockSize int64, diskType string, softRaidIdx *int, tool *PartitionTool) *DiskPartitions {
233234
ps := new(DiskPartitions)
234235
ps.driver = driver
235236
ps.adapter = adapter
@@ -239,9 +240,23 @@ func newDiskPartitions(driver string, adapter int, raidConfig string, sizeMB int
239240
ps.blockSize = blockSize
240241
ps.diskType = diskType
241242
ps.partitions = make([]*Partition, 0)
243+
244+
// soft raid, mdadm
245+
if softRaidIdx != nil {
246+
ps.GetMdadmInfo(softRaidIdx)
247+
}
242248
return ps
243249
}
244250

251+
func (ps *DiskPartitions) GetMdadmInfo(softRaidIdx *int) {
252+
ps.dev = fmt.Sprintf("/dev/md%d", *softRaidIdx)
253+
ps.devName = ps.dev
254+
uuid, sectors := ps.tool.GetMdadmUuidAndSector(ps.dev)
255+
ps.pciPath = uuid
256+
ps.sectors = sectors
257+
ps.blockSize = 512
258+
}
259+
245260
func (p *DiskPartitions) IsRaidDriver() bool {
246261
return utils.IsInStringArray(p.driver, []string{
247262
baremetal.DISK_DRIVER_MEGARAID,
@@ -324,7 +339,7 @@ func (ps *DiskPartitions) IsReady() bool {
324339

325340
func (ps *DiskPartitions) GetDevName() string {
326341
devName := ps.devName
327-
if !ps.IsRaidDriver() || ps.raidConfig == baremetal.DISK_CONF_NONE {
342+
if ps.raidConfig == baremetal.DISK_CONF_NONE {
328343
return devName
329344
}
330345
raidDrv, err := raiddrivers.GetDriverWithInit(ps.driver, ps.tool.runner.Term())
@@ -690,12 +705,13 @@ func (tool *PartitionTool) parseLsDisk(lines []string, driver string) {
690705

691706
func (tool *PartitionTool) FetchDiskConfs(diskConfs []baremetal.DiskConfiguration) *PartitionTool {
692707
for _, d := range diskConfs {
693-
disk := newDiskPartitions(d.Driver, d.Adapter, d.RaidConfig, d.Size, d.Block, d.DiskType, tool)
708+
disk := newDiskPartitions(d.Driver, d.Adapter, d.RaidConfig, d.Size, d.Block, d.DiskType, d.SoftRaidIdx, tool)
694709
tool.disks = append(tool.disks, disk)
710+
isSoftRaid := d.RaidConfig != baremetal.DISK_CONF_NONE
695711
var key string
696-
if d.Driver == baremetal.DISK_DRIVER_LINUX {
712+
if d.Driver == baremetal.DISK_DRIVER_LINUX && !isSoftRaid {
697713
key = NONRAID_DRIVER
698-
} else if d.Driver == baremetal.DISK_DRIVER_PCIE {
714+
} else if d.Driver == baremetal.DISK_DRIVER_PCIE && !isSoftRaid {
699715
key = PCIE_DRIVER
700716
} else {
701717
key = RAID_DRVIER
@@ -768,7 +784,41 @@ func (tool *PartitionTool) IsAllDisksReady() bool {
768784
return true
769785
}
770786

787+
func (tool *PartitionTool) GetMdadmUuidAndSector(devPath string) (string, int64) {
788+
var uuid string
789+
var sectorsRet int64
790+
// get md uuid as pci path
791+
cmd := fmt.Sprintf("/sbin/mdadm --detail %s | grep UUID", devPath)
792+
output, err := tool.Run(cmd)
793+
if err == nil && len(output) > 0 {
794+
segs := strings.SplitN(strings.TrimSpace(output[0]), ":", 2)
795+
if len(segs) == 2 {
796+
uuid = strings.TrimSpace(segs[1])
797+
}
798+
}
799+
800+
// get block size
801+
cmd = fmt.Sprintf("blockdev --getsz %s 2>/dev/null || echo 0", devPath)
802+
output, err = tool.Run(cmd)
803+
if err == nil && len(output) > 0 {
804+
if sectors, err := strconv.ParseInt(strings.TrimSpace(output[0]), 10, 64); err == nil {
805+
sectorsRet = sectors
806+
}
807+
}
808+
return uuid, sectorsRet
809+
}
810+
771811
func (tool *PartitionTool) RetrieveDiskInfo(rootMatcher *api.BaremetalRootDiskMatcher) error {
812+
for _, disk := range tool.disks {
813+
if baremetal.DISK_DRIVERS_SOFT_RAID.Has(disk.driver) && disk.raidConfig != baremetal.DISK_CONF_NONE {
814+
log.Infof("Soft raid mdadm set diskinfo dev %s", disk.dev)
815+
uuid, sectors := tool.GetMdadmUuidAndSector(disk.dev)
816+
disk.pciPath = uuid
817+
disk.sectors = sectors
818+
disk.blockSize = 512
819+
}
820+
}
821+
772822
for _, driver := range []string{RAID_DRVIER, NONRAID_DRIVER, PCIE_DRIVER} {
773823
cmd := fmt.Sprintf("/lib/mos/lsdisk --%s", driver)
774824
ret, err := tool.Run(cmd)
@@ -869,6 +919,7 @@ func newSSHPartitionTool(term *ssh.Client) *SSHPartitionTool {
869919
func NewSSHPartitionTool(term *ssh.Client, layouts []baremetal.Layout, rootMatcher *api.BaremetalRootDiskMatcher) (*SSHPartitionTool, error) {
870920
tool := newSSHPartitionTool(term)
871921
tool.FetchDiskConfs(baremetal.GetDiskConfigurations(layouts))
922+
log.Errorf("disk tables %s", jsonutils.Marshal(tool.diskTable))
872923
if err := tool.RetrieveDiskInfo(rootMatcher); err != nil {
873924
return nil, errors.Wrapf(err, "RetrieveDiskInfo")
874925
}

pkg/baremetal/utils/raid/drivers/drivers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"yunion.io/x/onecloud/pkg/baremetal/utils/raid"
2626
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/adaptec"
2727
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/hpssactl"
28+
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/mdadm"
2829
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/megactl"
2930
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/mvcli"
3031
_ "yunion.io/x/onecloud/pkg/baremetal/utils/raid/sas2iru"

pkg/baremetal/utils/raid/interface.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ type IRaidAdapter interface {
4545
PostBuildRaid() error
4646
}
4747

48+
type IRaidDeviceSetter interface {
49+
SetDevicesForAdapter(int, []*baremetal.BaremetalStorage)
50+
}
51+
4852
type IExecTerm interface {
4953
Run(cmds ...string) ([]string, error)
5054
RunWithInput(input io.Reader, cmds ...string) ([]string, error)

0 commit comments

Comments
 (0)