domain create分析

本文解析了XenARM模拟器中domain结构及domain_addrs的定义,阐述了如何通过构造domain0来初始化模拟器环境。domain结构详细描述了模拟器内部组件及其管理方式,而domain_addrs则用于指定模拟器的内存布局。

struct domain *domain_create(domid_t dom_id, unsigned int cpu)

分配一个struct domain空间,并初始化此空间

之后执行construct_dom0

int construct_dom0(struct domain *d,

                    unsigned long guest_start, unsigned long guest_size,

                    unsigned long image_start, unsigned long image_size,

                    unsigned long initrd_start, unsigned long initrd_size,

                    char *cmdline)

模拟器启动参数都保存在domain_addrs[]中,其中domain0的相关属性为:

        {               
                MEMMAP_GUEST_0_START_PADDR,                 // guest memory start  0x00200000
                0x05e00000,//MEMMAP_GUEST_0_SIZE,         // guest memory size   0x05e00000
                MEMMAP_GUEST_0_ELF_IMAGE_PADDR,          // elf image address     0x01c00000
//              _binary_mini_start,
                MEMMAP_GUEST_0_ELF_MAX_SIZE,                // elf image size            0x00400000
                MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0,     // ramdisk image address    0x00800000
                0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0,          // ramdisk image size   0x00046daf
                0,                                   // commandline
                0 
        }
要想指定Xen ARM的启动位置,需要修改此数据结构。当然,首先要将domain镜像加载如内存。

附domain和domain_addrs的定义

 

struct domain

{

    domid_t          domain_id;

 

    shared_info_t   *shared_info;     /* shared data area */

 

    spinlock_t       big_lock;

 

    spinlock_t       page_alloc_lock; /* protects all the following fields  */

    struct list_head page_list;       /* linked list, of size tot_pages     */

    struct list_head xenpage_list;    /* linked list, of size xenheap_pages */

    unsigned int     tot_pages;       /* number of pages currently possesed */

    unsigned int     max_pages;       /* maximum value for tot_pages        */

    unsigned int     xenheap_pages;   /* # pages allocated from Xen heap    */

 

    /* Scheduling. */

    int              shutdown_code; /* code value from OS (if DOMF_shutdown) */

    void            *sched_priv;    /* scheduler-specific data */

 

    struct domain   *next_in_list;

    struct domain   *next_in_hashbucket;

 

    struct list_head rangesets;

    spinlock_t       rangesets_lock;

 

    /* Event channel information. */

    struct evtchn   *evtchn[NR_EVTCHN_BUCKETS];

    spinlock_t       evtchn_lock;

 

    grant_table_t   *grant_table;

 

    /*

     * Interrupt to event-channel mappings. Updates should be protected by the 

     * domain's event-channel spinlock. Read accesses can also synchronise on 

     * the lock, but races don't usually matter.

     */

#define NR_PIRQS 256 /* Put this somewhere sane! */

    u16              pirq_to_evtchn[NR_PIRQS];

    u32              pirq_mask[NR_PIRQS/32];

 

    /* I/O capabilities (access to IRQs and memory-mapped I/O). */

    struct rangeset *iomem_caps;

    struct rangeset *irq_caps;

         struct rangeset *dma_caps;

    
    unsigned long    domain_flags;
    unsigned long    vm_assist;
    atomic_t         refcnt;
    struct vcpu *vcpu[MAX_VIRT_CPUS];
    /* Bitmask of CPUs which are holding onto this domain's state. */
    cpumask_t        domain_dirty_cpumask;
    struct arch_domain arch;
    void *ssid; /* sHype security subject identifier */
    /* Control-plane tools handle for this domain. */
    xen_domain_handle_t handle;
        uint32_t store_port; //for xenstore kcr
        unsigned long store_mfn; //for xenstore kcr
        uint32_t console_port; //for console ldh
        unsigned long console_mfn; //for console ldh
        /* For ACM */
        unsigned long scid;
        uint8_t acm_batterylife;
        uint16_t acm_battery_save_mode;
        uint16_t acm_shutdown;
        u32 *status;
        void *scan_code;
};
struct domain_addr_set domain_addrs[4]= {
        {               
                MEMMAP_GUEST_0_START_PADDR,             // guest memory start
                0x05e00000,//MEMMAP_GUEST_0_SIZE,                    // guest memory size
                MEMMAP_GUEST_0_ELF_IMAGE_PADDR,         // elf image address
//              _binary_mini_start,
                MEMMAP_GUEST_0_ELF_MAX_SIZE,              // elf image size
                MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0,     // ramdisk image address
                0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0,          // ramdisk image size
                0,                                   // commandline
                0 
        },      
        {               
                MEMMAP_GUEST_1_START_PADDR,             // guest memory start
                MEMMAP_GUEST_1_SIZE,                    // guest memory size
                MEMMAP_GUEST_1_ELF_IMAGE_PADDR,         // elf image address
                //_binary_mini_start,
                MEMMAP_GUEST_1_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0 
        },
        {
                MEMMAP_GUEST_2_START_PADDR,             // guest memory start
                MEMMAP_GUEST_2_SIZE,                    // guest memory size
                MEMMAP_GUEST_2_ELF_IMAGE_PADDR,         // elf image address
                MEMMAP_GUEST_2_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0
        },
        {
                MEMMAP_GUEST_3_START_PADDR,             // guest memory start
                MEMMAP_GUEST_3_SIZE,                    // guest memory size
                MEMMAP_GUEST_3_ELF_IMAGE_PADDR,         // elf image address
                MEMMAP_GUEST_3_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0
        },
};

 

### OpenStack Domain 创建失败的 HTTP 58 错误分析 在使用 OpenStack 创建 domain 时,如果遇到 HTTP 58 错误,这通常与身份验证服务(Keystone)的配置或权限设置有关。以下是对该问题的详细分析和解决方案。 #### 1. 配置文件检查 确保环境变量已正确加载,并且 `admin-openrc.sh` 文件中的参数无误。例如,`OS_AUTH_URL` 应指向正确的控制器节点地址[^2]。如果未正确设置 `OS_AUTH_URL` 或其他关键参数(如 `OS_USERNAME`、`OS_PASSWORD` 等),可能导致认证失败。 ```bash export OS_AUTH_URL=http://controller:5000/v3 export OS_USERNAME=admin export OS_PASSWORD=your_password export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_IDENTITY_API_VERSION=3 ``` #### 2. 权限问题排查 HTTP 58 错误可能与权限不足相关。请确认当前用户是否具有足够的权限来创建新的 domain。可以通过以下命令检查用户的角色和权限: ```bash openstack role list --user admin --domain default ``` 如果发现权限不足,请尝试为用户分配管理员角色: ```bash openstack role add --user admin --domain default admin ``` #### 3. Keystone 服务状态检查 确保 Keystone 服务正常运行,并监听正确的端口(默认为 5000 和 35357)。可以使用以下命令检查服务状态: ```bash systemctl status openstack-keystone ``` 同时,通过 `curl` 命令验证 Keystone API 是否可访问: ```bash curl -i http://controller:5000/v3 ``` 如果返回类似以下内容,则表明服务正常: ```json {"versions": [{"status": "CURRENT", "min_version": "1.0", "max_version": "3.14", "id": "v3.0", "links": [{"href": "http://controller:5000/v3/", "rel": "self"}]}]} ``` #### 4. 日志分析 若上述步骤未能解决问题,需进一步查看 Keystone 的日志文件以定位具体原因。日志路径通常为 `/var/log/keystone/keystone.log`。重点查找与 HTTP 58 错误相关的条目。 此外,某些情况下,错误可能是由于文件权限问题引起的。例如,`/etc/placement/policy.json` 的权限设置不当可能导致类似问题[^3]。确保相关文件的权限已正确配置: ```bash chown keystone:keystone /etc/placement/policy.json chmod 640 /etc/placement/policy.json ``` #### 5. 版本兼容性 确认所使用的 OpenStack 版本支持 v3 API。如果版本过旧,可能会导致部分功能不可用。例如,在较新的版本中,`domain` 的创建需要明确指定 `OS_IDENTITY_API_VERSION=3`[^4]。 --- ### 示例代码:创建 Domain 以下是创建 domain 的示例命令: ```bash openstack domain create --description "New Domain" example_domain ``` 确保在此之前已正确加载环境变量,并具备管理员权限。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值