CentOS7によるovs(Open vSwitch)のネットワーク設定(Bridge、Bonding、VLAN)の方法について記載しました。
KVMとLXC/LXDにおいてLinuxBridgeで実現可能だったことを、ovsでも同様に実現可能にした内容となっています。
このため、LinuxBridgeからovsへの移行設計が可能になると考えています。*1
過去記事では、nmcliコマンドによるLinuxBridgeについて記載しましたが、LinuxBridgeからovsへ変更した際、どこが変わったのか?のポイントも記載したいと考えています。
1.構成
1-1.環境
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 NIC : Intel X520-SR2 OS : CentOS7.6(1810) Kernel : 3.10.0-957.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools ovs : 2.10.1
今回は物理スイッチとLACPで接続するために上記の筐体を使用しましたが、LACP以外のところはVMWareWorkstation12上でも動作しますので、本記事に記載した内容は特に環境依存的なことはないと考えています。
1-2.全体構成
構成図上に(1)~(13)までの番号を割り振りました。
スイッチ側の設定は以下となります。
interface Port-channel1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk ! interface TenGigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode active ! interface TenGigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode active ! interface Vlan300 ip address 192.168.30.254 255.255.255.0 ! interface Vlan301 ip address 192.168.31.254 255.255.255.0 ! interface Vlan302 ip address 192.168.32.254 255.255.255.0
1-3.全体の流れ ~概要~
1-4.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。
1.Bridge作成 (1) ovs-vsctl add-br ovsbr0 2.Bonding (2) ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1 1&2の永続化設定 vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0 DEVICE=ovsbr0 DEVICETYPE=ovs TYPE=OVSBridge BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f0 DEVICE=ens1f0 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f1 DEVICE=ens1f1 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no [LACPの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302" HOTPLUG=no [固定LAGの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302" HOTPLUG=no 3.VLAN(PortGroupの定義) (3) vi /tmp/ovsnw.xml <network> <name>ovsnw</name> <forward mode='bridge'/> <bridge name='ovsbr0'/> <virtualport type='openvswitch'/> <portgroup name='untag' default='yes'> </portgroup> <portgroup name='vlan11'> <vlan> <tag id='11'/> </vlan> </portgroup> <portgroup name='vlan300'> <vlan> <tag id='300'/> </vlan> </portgroup> <portgroup name='vlan301'> <vlan> <tag id='301'/> </vlan> </portgroup> <portgroup name='vlan302'> <vlan> <tag id='302'/> </vlan> </portgroup> </network> 4.access port (4) Virt-Manager画面上でvlan300を選択 or virsh edit Guest1 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='vlan300'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> 5.trunk port (5) Virt-Manager画面上でuntagを選択 or virsh edit Guest2 <interface type='network'> <mac address='52:54:00:d4:35:3e'/> <source network='ovsnw' portgroup='untag'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> 6.Guest側Tagging例1 (6) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24 nmcli connection modify br301 ipv6.method ignore nmcli connection up br301 nmcli con show (7) nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301 nmcli con show (8) nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge nmcli connection up eth0.301 nmcli con show 7.Guest側Tagging例2 (9) nmcli connection add type bridge autoconnect yes con-name br302 ifname br302 nmcli connection modify br302 bridge.stp no nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24 nmcli connection modify br302 ipv6.method ignore nmcli connection up br302 nmcli con show (10) nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302 nmcli con show (11) nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge nmcli connection up eth0.302 nmcli con show 8.fake bridge(VLAN Interface)の作成 (12) vi /etc/sysconfig/network-scripts/ifcfg-vlan302 DEVICE=vlan302 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSIntPort BOOTPROTO=static OVS_BRIDGE=ovsbr0 OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true" OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif" HOTPLUG=no 9.LXCコンテナとfake bridgeのアタッチ (13) lxc network attach vlan302 lxc762 eth1
2.Bridge作成
まずはBridgeを作成します。
(1)Bridgeの作成
出力結果 [root@c761 ~]# ovs-vsctl add-br ovsbr0 [root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal ovs_version: "2.10.1"
3.Bonding
Bondを作成し、物理インターフェースをBondにアタッチします。
(2)Bond作成+物理アタッチ
出力結果 [root@c761 ~]# ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1 [root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "bond0" Interface "ens1f1" Interface "ens1f0" ovs_version: "2.10.1"
過去記事の図と比較してもらえればわかると思いますが、過去記事の(3)~(5)を行った状態となります。
また、LinuxBridgeの場合、BridgeとBondが分離しているのに対して、ovsでは、Bridge "ovsbr0"の中にBondが入っています。
具体的には、Port "ovsbr0"とPort "bond0"がBridge "ovsbr0"の中に定義されており、さらに、Port "bond0"のインターフェースとして、物理のens1f0やens1f1が定義されています。
これは仮想スイッチovsbr0のアップリンクポート(物理サーバの外部へ抜けるトラフィックが通るポート)がBondとして定義されている状態と言えます。
仮にESXiのvSwitchで例えるなら、こんな↓状態です。
4.永続化設定
コマンドを打っただけだと、ホストOSをRebootすると消えてしまうので永続化設定を行います。
vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0 DEVICE=ovsbr0 DEVICETYPE=ovs TYPE=OVSBridge BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f0 DEVICE=ens1f0 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f1 DEVICE=ens1f1 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no [LACPの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302" HOTPLUG=no [固定LAGの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302" HOTPLUG=no 設定後はnetworkサービスをリスタート systemctl restart network
いくつか、ポイントを記載します。
・対向の物理スイッチに合わせて、LACP or 固定LAGのどちらかの設定を行ってください。なお、ここではLACPとします。
・ovsのDefaultでは、vlan_mode=trunkにてFullTrunk状態となっているため、明示的にTrunkするVLANを絞りたい場合に、trunks=11,300-302が必要となります。*2
・NM_CONTROLLED=noにより、該当するインターフェースがNetworkManagerの管理下から外れるため必須設定と考えてください。
・nmcliコマンドでBondを作成した際も、上記パス*3に似たようなファイルが生成されていますが、ovs特有のオプションを指定できる点が異なります。
・networkサービスのリスタートを行っても正常に動作しない場合、少々ダサいですがホストOSごと再起動してみてください。
5.VLAN(PortGroupの定義)
(3)libvirtに対してovsのネットワーク定義
仮想マシン側でNICを追加する際、ovsを選択できるようにするため、libvirt上でネットワークの定義を行います。
その際、仮想マシンとovsをaccessポートで接続するのか?trunkポートで接続するのか?を設定できるようにするため、PortGroupの定義も併せて行います。
ESXiのvSwitchで例えるなら、下図の左側にある「仮想マシンのポートグループ」の設定を行っていくイメージです。
(3) vi /tmp/ovsnw.xml <network> <name>ovsnw</name> <forward mode='bridge'/> <bridge name='ovsbr0'/> <virtualport type='openvswitch'/> <portgroup name='untag' default='yes'> </portgroup> <portgroup name='vlan11'> <vlan> <tag id='11'/> </vlan> </portgroup> <portgroup name='vlan300'> <vlan> <tag id='300'/> </vlan> </portgroup> <portgroup name='vlan301'> <vlan> <tag id='301'/> </vlan> </portgroup> <portgroup name='vlan302'> <vlan> <tag id='302'/> </vlan> </portgroup> </network>
いくつか、ポイントを記載します。
A.「portgroup name='vlan11'」や「portgroup name='vlan300'」は、仮想マシンをovsにaccess portとして接続させたい場合の設定となります。
B.「portgroup name='untag' default='yes'」は、仮想マシンをovsにtrunk portとして接続させたい場合の設定となります。
A.は、主に仮想サーバなど自身でVLAN IDを付けずにトラフィックを流してくる仮想マシン用として使用できます。
B.は、主に仮想ルータ(CSR1000v・vMX・A10 vThunderなど)や仮想スイッチ(CumulusVXやNexus9000v)など、自身でVLAN IDを付けてトラフィックを流してくる仮想マシン用として使用できます。
ちなみに、B.においては、4.永続化設定で記載したように、DefaultでFullTrunk状態です。このため、許可するVLANを絞ることも可能なようですが、ここでは割愛します。*4
上記ファイルの作成が完了したら、virshコマンドで定義していきます。
virsh net-list virsh net-define /tmp/ovsnw.xml virsh net-start ovsnw virsh net-autostart ovsnw virsh net-list
現在のネットワーク定義を参照
ovsnw.xmlのネットワークを定義
ovsnwのスタート
ovsnwの自動起動設定
現在のネットワーク定義を参照
以下が各コマンドの出力結果となります。
出力結果 [root@c761 ~]# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes [root@c761 ~]# virsh net-define /tmp/ovsnw.xml Network ovsnw defined from /tmp/ovsnw.xml [root@c761 ~]# virsh net-start ovsnw Network ovsnw started [root@c761 ~]# virsh net-autostart ovsnw Network ovsnw marked as autostarted [root@c761 ~]# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes ovsnw active yes yes
上記の設定が完了すると、Virt-Manager上の画面からovsやPortGroupが選択できるようになります。
6.access port
(4)仮想マシンをovsにaccess portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:vlan300を選択
virshコマンドで設定する場合は、以下の通り。
virsh edit Guest1 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='vlan300'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface>
7.trunk port
(5)仮想マシンをovsにtrunk portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:untagを選択
virshコマンドで設定する場合は、以下の通り。
virsh edit Guest2 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='untag'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface>
8.Guest側Tagging例1と2
Guest2起動後、Guest2のbash上でnmcliコマンドにより、VLANインターフェースを作成します。
nmcliコマンドの詳細については、過去記事を参照ください。
(6) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24 nmcli connection modify br301 ipv6.method ignore nmcli connection up br301 nmcli con show (7) nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301 nmcli con show (8) nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge nmcli connection up eth0.301 nmcli con show (9) nmcli connection add type bridge autoconnect yes con-name br302 ifname br302 nmcli connection modify br302 bridge.stp no nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24 nmcli connection modify br302 ipv6.method ignore nmcli connection up br302 nmcli con show (10) nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302 nmcli con show (11) nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge nmcli connection up eth0.302 nmcli con show
7.trunk portの設定により、(5)のeth0とvnet1間はFullTrunkで接続されていると考えてください。
これにより、例えば、SrcIP:192.168.31.162-DstIP:192.168.31.254でPingを打つと、以下のような流れで処理されます。
1. (7)でVLAN ID301がTaggingされる。
2. (5)はFullTrunk状態なので、VLANタグは剥がされずに、そのままスイッチング処理*5される。
3. (2)では11,300-302がAllowedされているので、VLANタグは剥がされずに、そのままスイッチング処理される。
4.物理スイッチ側でVLANタグが剥がされ、以下のVLAN InterfaceがPingに応答する。
interface Vlan301 ip address 192.168.31.254 255.255.255.0
9.fake bridge(VLAN Interface)の作成
fake bridge(VLAN Interface)の作成と同時に永続化設定も実施します。
vi /etc/sysconfig/network-scripts/ifcfg-vlan302 DEVICE=vlan302 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSIntPort BOOTPROTO=static OVS_BRIDGE=ovsbr0 OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true" OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif" HOTPLUG=no 設定後はnetworkサービスをリスタート systemctl restart network
fake_bridge=trueを指定しないと、単なるVLAN Interfaceとなってしまうため、次工程(10.LXCコンテナとfake bridgeのアタッチ)に進むと、必ず躓くポイントになります。理由は、LXCに対してVLAN Interface 302をBridgeとして認識させる必要があるためです。
10.LXCコンテナとfake bridgeのアタッチ
fake bridge (VLAN Interface 302)にコンテナlxc762のeth1をアタッチします。
lxc network attach vlan302 lxc762 eth1
アタッチ後、仮想マシンやLXCコンテナを起動すると、ovs上では以下のように構成されていることが確認できます。
[root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "bond0" trunks: [11, 300, 301, 302, 303, 304] Interface "ens1f1" Interface "ens1f0" Port "vnet0" tag: 300 Interface "vnet0" Port "vnet1" Interface "vnet1" Port "vlan302" tag: 302 Interface "vlan302" type: internal Port "vethCPI2P0" tag: 302 Interface "vethCPI2P0" ovs_version: "2.10.1"
Port "bond0":アップリンクポートの設定(trunk allowed vlan 11,300-304の状態)
Port "vnet0":access vlan 300のポート設定
Port "vnet1":trunkポートの設定(FullTrunk状態)
Port "vlan302":fake bridgeの設定
Port "vethCPI2P0":fake bridgeに接続されたlxc762のポート設定
11.補足1:fake_bridgeについて
fake_bridge=trueを指定しなかった場合、上記コマンドにて「lxc network attach 」まで打った後、Tabキーで補完してみてください。すると、物理インターフェースもしくはBridgeインターフェースしか表示されません。
fake_bridge=trueを指定しなかった場合の出力例 [root@c761 ~]# lxc network attach eno1 eno3 enp4s16 enp4s16f2 ens1f0 ens2 ovsbr0 eno2 eno4 enp4s16f1 enp4s16f3 ens1f1 lxdbr0 virbr0
すると、lxcコンテナをovsにアタッチするためには、ovsbr0を選択するしかない状態となってしまいます。
このため、LXCに対して、VLAN Interface 302がBridgeであるということを明示的に認識させる必要があるため、fake_bridge=trueオプションを指定しています。
ちなみに、上記のlxcコマンドでovsbr0を選択した場合、(5)に接続した状態となります。
前述した通り、(5)はFullTrunk状態なので、物理スイッチへトラフィックを流すためには、LXCコンテナ側でVLAN IDを付与する必要があります。
軽量さがメリットであるLXCコンテナで、VLAN IDを付ける設定を実施することは、そもそも使い方が間違っている気がしました。*6
このため、
- KVM:(4)の通り、PortGroupで所属するVLANを決定する。もしくは、(5)の通り、untagにして仮想マシン側でVLAN IDを付与する。
- LXC/LXD:(12)(13)に記載の通り、fake bridgeで所属するVLANを決定する。
という使い方が適しているのではないかと考えています。
12.補足2:ovs上での見え方
Guest1と2を起動すると、ovs上では以下のように見えます。
[root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "vnet0" tag: 300 Interface "vnet0" Port "vnet1" Interface "vnet1" Port "bond0" trunks: [11, 300, 301, 302] Interface "ens1f1" Interface "ens1f0" ovs_version: "2.10.1"
また、今回LCAPを使用しましたが、LCAPの状態を確認する場合は、以下のコマンドで可能です。
ovs-appctl bond/show bond0 ovs-vsctl list port bond0 出力例 [root@c761 ~]# ovs-appctl bond/show bond0 ---- bond0 ---- bond_mode: balance-tcp bond may use recirculation: yes, Recirc-ID : 2 bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms next rebalance: 2115 ms lacp_status: negotiated lacp_fallback_ab: false active slave mac: 90:e2:ba:0b:37:b9(ens1f1) slave ens1f0: enabled may_enable: true slave ens1f1: enabled active slave may_enable: true [root@c761 ~]# ovs-vsctl list port bond0 _uuid : 85d6d0bb-1b9d-44b0-964c-b83d60451aab bond_active_slave : "90:e2:ba:0b:37:b9" bond_downdelay : 0 bond_fake_iface : false bond_mode : balance-tcp bond_updelay : 0 cvlans : external_ids : {} fake_bridge : false interfaces : [a102fd00-be8d-402b-b9f3-1ae3cf3aeb64, cffbeb94-2ab5-453e-832c-ac63c86e5d8a] lacp : active mac : name : "bond0" other_config : {lacp-time=fast} protected : false qos : rstp_statistics : {} rstp_status : {} statistics : {} status : {} tag : trunks : [11, 300, 301, 302] vlan_mode : trunk
以上です。
13.最後に
以下のサイトを参考にさせて頂きました。
Open vSwitch
Using VLANs with OVS and libvirt - Scott's Weblog - The weblog of an IT pro focusing on cloud computing, Kubernetes, Linux, containers, and networking
Tag Vlan on Veth to Openvswitch bridge · Issue #3414 · lxc/lxd · GitHub
ovsは、最初は取っ付き難かったのですが、触ってみると意外と楽しかったです。
また、LinuxBridgeと異なる点として、Port(Interface)やBond、VLANの概念がBridgeの中に集約されている(ように見える)ので、よりスイッチっぽいかな?と。
ovsはVxLANのVTEPを作ったり、OpenFlowが使えたりと色々遊べるのですが、まずはLinuxBridgeからの移行で最低限必要な機能は網羅できたかなと思います。
次のステップとして、DPDKを実装したいと考えています。
*1:手前味噌ですが、私はovsに一本化しようと思いました。
*2:ネットワークエンジニアという職業柄、意図しないループが怖いため、TrunkするVLANはなるべく絞りたい派です。
*3:/etc/sysconfig/network-scripts/配下のパス
*4:ovsnw.xml上に、tag id='11,300-302'などと記載すれば、できそうな気がしていますが、libvirt側の話題になるため、また別の機会に確認したいと思います。
*5:宛先MACアドレスとMACアドレステーブルを照合し、受信したEtherフレームを然るべきポートへ転送する動作のこと
*6:もちろん、ケースバイケースで充分な議論をする余地はあるかと思います。